Load a resource as a stream : Resources « File Input Output « Java






Load a resource as a stream

   
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;



//Revised from apache cxf 
public class Main {

  /**
   * Load a given resource. <p/> This method will try to load the resource
   * using the following methods (in order):
   * <ul>
   * <li>From Thread.currentThread().getContextClassLoader()
   * <li>From ClassLoaderUtil.class.getClassLoader()
   * <li>callingClass.getClassLoader()
   * </ul>
   * 
   * @param resourceName The name of the resource to load
   * @param callingClass The Class object of the calling object
   */
  public static URL getResource(String resourceName, Class callingClass) {
      URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
      if (url == null && resourceName.startsWith("/")) {
          //certain classloaders need it without the leading /
          url = Thread.currentThread().getContextClassLoader()
              .getResource(resourceName.substring(1));
      }

      ClassLoader cluClassloader = Main.class.getClassLoader();
      if (cluClassloader == null) {
          cluClassloader = ClassLoader.getSystemClassLoader();
      }
      if (url == null) {
          url = cluClassloader.getResource(resourceName);
      }
      if (url == null && resourceName.startsWith("/")) {
          //certain classloaders need it without the leading /
          url = cluClassloader.getResource(resourceName.substring(1));
      }

      if (url == null) {
          ClassLoader cl = callingClass.getClassLoader();

          if (cl != null) {
              url = cl.getResource(resourceName);
          }
      }

      if (url == null) {
          url = callingClass.getResource(resourceName);
      }
      
      if ((url == null) && (resourceName != null) && (resourceName.charAt(0) != '/')) {
          return getResource('/' + resourceName, callingClass);
      }

      return url;
  }
  
  /**
   * This is a convenience method to load a resource as a stream. <p/> The
   * algorithm used to find the resource is given in getResource()
   * 
   * @param resourceName The name of the resource to load
   * @param callingClass The Class object of the calling object
   */
  public static InputStream getResourceAsStream(String resourceName, Class callingClass) {
      URL url = getResource(resourceName, callingClass);

      try {
          return (url != null) ? url.openStream() : null;
      } catch (IOException e) {
          return null;
      }
  }

  /**
   * Load a given resources. <p/> This method will try to load the resources
   * using the following methods (in order):
   * <ul>
   * <li>From Thread.currentThread().getContextClassLoader()
   * <li>From ClassLoaderUtil.class.getClassLoader()
   * <li>callingClass.getClassLoader()
   * </ul>
   * 
   * @param resourceName The name of the resource to load
   * @param callingClass The Class object of the calling object
   */
  public static List<URL> getResources(String resourceName, Class callingClass) {
      List<URL> ret = new ArrayList<URL>();
      Enumeration<URL> urls = new Enumeration<URL>() {
          public boolean hasMoreElements() {
              return false;
          }
          public URL nextElement() {
              return null;
          }
          
      };
      try {
          urls = Thread.currentThread().getContextClassLoader()
              .getResources(resourceName);
      } catch (IOException e) {
          //ignore
      }
      if (!urls.hasMoreElements() && resourceName.startsWith("/")) {
          //certain classloaders need it without the leading /
          try {
              urls = Thread.currentThread().getContextClassLoader()
                  .getResources(resourceName.substring(1));
          } catch (IOException e) {
              // ignore
          }
      }

      ClassLoader cluClassloader = Main.class.getClassLoader();
      if (cluClassloader == null) {
          cluClassloader = ClassLoader.getSystemClassLoader();
      }
      if (!urls.hasMoreElements()) {
          try {
              urls = cluClassloader.getResources(resourceName);
          } catch (IOException e) {
              // ignore
          }
      }
      if (!urls.hasMoreElements() && resourceName.startsWith("/")) {
          //certain classloaders need it without the leading /
          try {
              urls = cluClassloader.getResources(resourceName.substring(1));
          } catch (IOException e) {
              // ignore
          }
      }

      if (!urls.hasMoreElements()) {
          ClassLoader cl = callingClass.getClassLoader();

          if (cl != null) {
              try {
                  urls = cl.getResources(resourceName);
              } catch (IOException e) {
                  // ignore
              }
          }
      }

      if (!urls.hasMoreElements()) {
          URL url = callingClass.getResource(resourceName);
          if (url != null) {
              ret.add(url);
          }
      }
      while (urls.hasMoreElements()) {
          ret.add(urls.nextElement());
      }

      
      if (ret.isEmpty() && (resourceName != null) && (resourceName.charAt(0) != '/')) {
          return getResources('/' + resourceName, callingClass);
      }
      return ret;
  }



}

   
    
    
  








Related examples in the same category

1.Return a resource URL.
2.Utility class to manage localization resources
3.Utility methods for resolving resource locations to files in the file system
4.Loading resources and classes in a fault tolerant manner