Чтение файла свойств в 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