Lectura del archivo de propiedades en Java


105

Tengo el siguiente código intentando leer un archivo de propiedades:

Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();           
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);

Recibo una excepción en la última línea. Específicamente:

Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)

gracias, Nikos

Respuestas:


89

Según su excepción, InputStreames nulo, esto significa que el cargador de clases no encuentra su archivo de propiedades. Supongo que myProp.properties está en la raíz de su proyecto, si ese es el caso, necesita una barra anterior:

InputStream stream = loader.getResourceAsStream("/myProp.properties");

mi jerarquía de archivos es: src -> myPackage -> myClass.java, myProp.properties. Hice lo que me aconsejaste, pero todavía arroja la misma excepción
Nikos

getResourceAsStreambusca el archivo en la ruta de clases. Si su archivo de propiedades está en el directorio del paquete myPackage, utilícelo /myPackage/myProp.propertiescomo ruta.
Jesper

2
@Mark Elliot, ¿qué pasa si tengo un confpaquete para almacenar todos mis archivos de configuración y mi jerarquía de archivos es:, myproject ->src, conf, testcómo voy a cargar las propiedades agregando una barra anterior?
Roger Ray

54


Puede encontrar información en esta página:
http://www.mkyong.com/java/java-properties-file-examples/

Properties prop = new Properties();
try {
    //load a properties file from class path, inside static method
    prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));

    //get the property value and print it out
    System.out.println(prop.getProperty("database"));
    System.out.println(prop.getProperty("dbuser"));
    System.out.println(prop.getProperty("dbpassword"));

} 
catch (IOException ex) {
    ex.printStackTrace();
}

3
No olvide cerrar el Readerin prop.load(reader), según la documentación:The specified stream remains open after this method returns
Evandro Silva

25

Puede usar ResourceBundleclass para leer el archivo de propiedades.

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");

1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
mcolak

2
Este enfoque se recomienda para i18n.
otro

15
Properties prop = new Properties();

try {
    prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
    e.printStackTrace();
}

conf/filename.properties base en el directorio raíz del proyecto


7

No puede usar esta palabra clave como:

props.load(this.getClass().getResourceAsStream("myProps.properties"));

en un contexto estático.

Lo mejor sería hacerse con el contexto de la aplicación como:

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");

luego puede cargar el archivo de recursos desde la ruta de clase -

//load a properties file from class path, inside static method
        prop.load(context.getClassLoader().getResourceAsStream("config.properties"));

Esto funcionará tanto para contextos estáticos como no estáticos y la mejor parte es que este archivo de propiedades puede estar en cualquier paquete / carpeta incluido en la ruta de clases de la aplicación.


4
ApplicationContext está disponible solo en el caso de la aplicación Spring
joro

6

Su archivo debe estar disponible como com/example/foo/myProps.propertiesclasspath. Luego cárguelo como:

props.load(this.getClass().getResourceAsStream("myProps.properties"));

4

si su config.properties no está en el directorio src / main / resource y está en el directorio raíz del proyecto, entonces debe hacer algo como a continuación:

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);

3

Asegúrese de que el nombre del archivo sea correcto y que el archivo esté realmente en la ruta de clases. getResourceAsStream()devolverá nulo si este no es el caso que hace que la última línea arroje la excepción.

Si myProp.properties está en el directorio raíz de su proyecto, utilice /myProp.propertiesen su lugar.


mi jerarquía de archivos es: src -> myPackage -> myClass.java, myProp.properties. Hice lo que me aconsejaste, pero todavía arroja la misma excepción
Nikos

Dado que su archivo de propiedades no está en la raíz de su proyecto, no necesita la barra inclinada inicial.
mort

Estaba obteniendo la excepción lanzada en primer lugar sin la barra inclinada. Todavía no funciona.
Nikos

3

Puede usar java.io.InputStream para leer el archivo como se muestra a continuación:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 

¿Cómo convertir InputStream a archivo en java? Quería leer el archivo .properties usando File API

3

Dado el contexto, se loader.getResourceAsStream("myPackage/myProp.properties")debe utilizar.

Liderar '/'no funciona con el ClassLoader.getResourceAsStream(String)método.

Alternativamente, puede usar el Class.getResourceAsStream(String)método, que se usa '/'para determinar si la ruta es absoluta o relativa a la ubicación de la clase.

Ejemplos:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")

2

Si la ruta del archivo de propiedades y la ruta de clases de Java son las mismas, entonces debería hacerlo.

Por ejemplo:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);

2

Ninguna de las respuestas actuales muestra que se InputStreamestá cerrando (esto filtrará un descriptor de archivo) y / o no se ocupa de .getResourceAsStream()devolver un valor nulo cuando no se encuentra el recurso (esto conducirá a un NullPointerExceptionmensaje confuso "inStream parameter is null"). Necesita algo como lo siguiente:

String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename)) {
    if (inputStream == null) {
        throw new FileNotFoundException(propertiesFilename);
    }
    prop.load(inputStream);
} catch (IOException e) {
    throw new RuntimeException(
                "Could not read " + propertiesFilename + " resource file: " + e);
}

1

Para el archivo de propiedades de lectura con su orden original:

    File file = new File("../config/edc.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
    layout.load(new InputStreamReader(new FileInputStream(file)));

    for(Object propKey : layout.getKeys()){
        PropertiesConfiguration propval =  layout.getConfiguration();
        String value = propval.getProperty((String) propKey).toString();
        out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
    }

1

Muchas respuestas aquí describen métodos peligrosos en los que crean una instancia de un flujo de entrada de archivo pero no obtienen una referencia al flujo de entrada para cerrar el flujo más tarde. Esto da como resultado flujos de entrada colgantes y pérdidas de memoria. La forma correcta de cargar las propiedades debería ser similar a la siguiente:

    Properties prop = new Properties();
    try(InputStream fis = new FileInputStream("myProp.properties")) {
        prop.load(fis);
    }
    catch(Exception e) {
        System.out.println("Unable to find the specified properties file");
        e.printStackTrace();
        return;
    }

Tenga en cuenta la instanciación del flujo de entrada del archivo en try-with-resourcesbloque. Dado FileInputStreamque a se puede cerrar automáticamente, se cerrará automáticamente después de try-with-resourcessalir del bloque. Si desea usar un trybloque simple , debe cerrarlo explícitamente usando fis.close();en el finallybloque.


0

Veo que la pregunta es antigua. Si alguien se encuentra con esto en el futuro, creo que esta es una forma sencilla de hacerlo. Mantenga el archivo de propiedades en la carpeta de su proyecto.

        FileReader reader = new FileReader("Config.properties");

        Properties prop = new Properties();
        prop.load(reader);

-2

Especifique la ruta a partir de src como se muestra a continuación:

src/main/resources/myprop.proper
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.