Чтение файла свойств в Java - PullRequest
97 голосов
/ 27 ноября 2011

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

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)

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

Ответы [ 15 ]

79 голосов
/ 27 ноября 2011

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

InputStream stream = loader.getResourceAsStream("/myProp.properties");
51 голосов
/ 29 ноября 2012


Вы можете найти информацию на этой странице:
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();
}
23 голосов
/ 27 ноября 2011

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

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
9 голосов
/ 24 января 2017
Properties prop = new Properties();

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

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

7 голосов
/ 02 декабря 2012

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

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

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

5 голосов
/ 27 ноября 2011

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

props.load(this.getClass().getResourceAsStream("myProps.properties"));
3 голосов
/ 24 декабря 2014

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

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 
3 голосов
/ 27 ноября 2011

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

Leading '/' не работает с методом ClassLoader.getResourceAsStream(String).

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

Примеры:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")
3 голосов
/ 27 ноября 2011

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

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

1 голос
/ 06 марта 2019

Ни один из текущих ответов не показывает, что InputStream закрывается (это приведет к утечке файлового дескриптора), и / или не обрабатывает .getResourceAsStream(), возвращая ноль, когда ресурс не найден (это приведет к 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...