Чтение файла свойств в Java

У меня есть следующий код, пытающийся прочитать файл свойств:

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

Я получаю исключение в последней строке. В частности:

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)

спасибо, Никос

Ответ 1

Исходя из вашего исключения, InputStream имеет значение null, это означает, что загрузчик классов не находит ваш файл свойств. Я предполагаю, что myProp.properties находится в корне вашего проекта, если в этом случае вам нужен предыдущий слэш:

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

Ответ 2


Вы можете найти информацию на этой странице:
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

Вы можете использовать класс ResourceBundle для чтения файла свойств.

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

Ответ 4

Properties prop = new Properties();

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

conf/filename.properties база на корневом каталоге проекта

Ответ 5

Вы не можете использовать это ключевое слово как -

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

в статическом контексте.

Лучше всего было бы получить контекст приложения, например -

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

то вы можете загрузить файл ресурсов из пути к классам -

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

Это будет работать как для статического, так и для нестатического контекста, и лучшая часть этого файла свойств может быть в любом пакете/папке, включенной в путь класса приложения.

Ответ 6

Ваш файл должен быть доступен как com/example/foo/myProps.properties в пути к классам. Затем загрузите его как:

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

Ответ 7

Убедитесь, что имя файла верное и что файл действительно находится в пути к классу. getResourceAsStream() возвращает значение null, если это не так, что приводит к тому, что последняя строка генерирует исключение.

Если myProp.properties находится в корневом каталоге вашего проекта, используйте /myProp.properties вместо этого.

Ответ 8

Для использования контекста loader.getResourceAsStream("myPackage/myProp.properties").

Ведущий '/' не работает с методом ClassLoader.getResourceAsStream(String).

В качестве альтернативы вы можете использовать метод Class.getResourceAsStream(String), который использует '/', чтобы определить, является ли путь абсолютным или относительным по отношению к местоположению класса.

<сильные > Примеры:

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

Ответ 9

Вы можете использовать java.io.InputStream для чтения файла, как показано ниже:

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

Ответ 10

Для файла свойств чтения с исходным порядком:

    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>");
    }

Ответ 11

Ни один из текущих ответов не показывает закрытие InputStream (это приведет к утечке файлового дескриптора) и/или не имеет отношения к .getResourceAsStream() возвращающему null, когда ресурс не найден (это приведет к NullPointerException с запутанным сообщением "inStream parameter is null"). Вам нужно что-то вроде следующего:

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);
}

Ответ 12

Если ваш путь к файлу свойств и ваш путь к java-классу совпадают, тогда вы должны это сделать.

Например:

SRC/MyPackage/MyClass.java

SRC/MyPackage/MyFile.properties

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

Ответ 13

Многие ответы здесь описывают опасные методы, в которых они создают поток ввода файла, но не получают ссылку на поток ввода, чтобы закрыть поток позже. Это приводит к зависанию входных потоков и утечкам памяти. Правильный способ загрузки свойств должен быть похож на следующий:

    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;
    }

Обратите внимание на создание потока ввода файла в блоке try-with-resources. Поскольку FileInputStream является автозаполняемым, он будет автоматически закрыт после выхода из блока try-with-resources. Если вы хотите использовать простой блок try, вы должны явно закрыть его, используя fis.close(); в блоке, finally.

Ответ 14

если ваш config.properties не находится в каталоге src/main/resource и находится в корневом каталоге проекта, то вам нужно сделать что-то вроде ниже: -

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

Ответ 15

Укажите путь, начиная с src, как показано ниже:

src/main/resources/myprop.proper