2010-03-26 36 views
7

Hiii ... Quiero obtener el contenido del archivo de propiedades en el objeto de clase InputStream utilizando getSystemResourceAsStream(). Construí el código de muestra. Funciona bien con el método main(), pero cuando despliego el proyecto y lo ejecuto en el servidor, no se puede obtener la ruta del archivo de propiedades ... así que el valor nulo del almacén de objetos inputstream.getSystemResourceAsStream() devuelve nulo

Código de la muestra es aquí ..

public class ReadPropertyFromFile { 

    public static Logger logger = Logger.getLogger(ReadPropertyFromFile.class); 

    public static String readProperty(String fileName, String propertyName) { 
     String value = null; 
     try { 
      //fileName = "api.properties"; 
      //propertyName = "api_loginid"; 

      System.out.println("11111111...In the read proprty file....."); 


      // ClassLoader loader = ClassLoader.getSystemClassLoader(); 

      InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName); 

      System.out.println("In the read proprty file....."); 
      System.out.println("File Name :" + fileName); 
      System.out.println("instream = "+inStream); 

      Properties prop = new Properties(); 

      try { 
       prop.load(inStream); 
       value = prop.getProperty(propertyName); 
      } catch (Exception e) { 
       logger.warn("Error occured while reading property " + propertyName + " = ", e); 
       return null; 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } 
     return value; 
    } 

    public static void main(String args[]) { 

     System.out.println("prop value = " + ReadPropertyFromFile.readProperty("api.properties", "api_loginid")); 
    } 
} 
+2

¿Por qué se usa el cargador de clases del sistema, en lugar del normal? – skaffman

Respuesta

1

Trate de usar getResourceAsStream() en lugar de 'getSystemResourceAsStream()'.

6

SystemClassLoader carga los recursos de java.class.path witch maps a la variable de sistema CLASSPATH. En su aplicación local, probablemente tenga el recurso que intenta cargar configurado en la variable java.class.path. En el servidor, es otra historia porque lo más probable es que el servidor cargue sus recursos desde otro cargador de clases.

intente utilizar el ClassLoader que carga la clase utilizando la ruta correcta:

getClass().getResourceAsStream(fileName); 

Este article también podrían ser útiles.

+0

getClass(). GetResourceAsStream ("input.properties"); trabajó para mi. el recurso está en el mismo directorio de la clase que lo está usando –

15

puedo implementar el proyecto y ejecutar en el servidor,

Esto suena como una aplicación web JSP/Servlet. En ese caso, es necesario utilizar el ClassLoader que se obtiene de la siguiente manera:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

Ésta tiene acceso a los todos caminos de ruta de clases ligadas a la aplicación web en cuestión y usted no es más dependiente de cuál de los padres classloader (¡una aplicación web tiene más de uno!) ha cargado tu clase.

Luego, en este cargador de clases, solo necesita llamar al getResourceAsStream() para obtener un recurso classpath como flujo, no el getSystemResourceAsStream() que depende de cómo se inicia la aplicación weba. Usted no quiere depender de que, así, ya que no tiene control sobre ella al alojamiento externo:

InputStream input = classLoader.getResourceAsStream("filename.extension"); 

Ésta es finalmente más robusto que su getSystemResourceAsStream() enfoque inicial y el Class#getResourceAsStream() según lo sugerido por otros.

Cuestiones relacionadas