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


105

У мене є такий код, який намагається прочитати файл властивостей:

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)

дякую, Нікосе

Відповіді:


89

Виходячи з вашого винятку, InputStreamце null, це означає, що завантажувач класів не знаходить файл ваших властивостей. Я здогадуюсь, що myProp.properties знаходиться в корені вашого проекту, якщо це так, вам потрібна попередня коса риса:

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

моя ієрархія файлів: src -> myPackage -> myClass.java, myProp.properties. Я зробив те, що ви мені порадили, але це все ще кидає той самий виняток
nikos

getResourceAsStreamшукає файл на classpath. Якщо ваш файл властивостей знаходиться в каталозі пакунків myPackage, використовуйте його /myPackage/myProp.propertiesяк шлях.
Jesper

2
@Mark Elliot, що, якщо у мене є confпакет для зберігання всіх моїх файлів конфігурації, а моя ієрархія файлів: myproject ->src, conf, testяк я завантажуватиму властивості, додаючи попередній косу рису?
Роджер Рей

54


Інформацію можна знайти на цій сторінці:
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
Не забудьте закрити Readerін prop.load(reader), в відповідно до документації:The specified stream remains open after this method returns
Evandro Silva


15
Properties prop = new Properties();

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

conf/filename.properties основа на кореневому реєстрі проекту


7

Ви не можете використовувати таке ключове слово, як -

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

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

Найкраще було б оволодіти контекстом програми, наприклад -

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

тоді ви можете завантажити файл ресурсу з classpath -

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

Це буде працювати як для статичного, так і для нестатичного контексту, і найкраща частина цього файлу властивостей може знаходитися в будь-якому пакеті / папці, що входить у класний шлях програми.


4
ApplicationContext доступний лише у випадку весняної заявки
1717 року

6

Ваш файл повинен бути доступним, як com/example/foo/myProps.propertiesу класі. Потім завантажте його як:

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

4

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

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

3

Переконайтесь, що ім'я файлу правильне і що файл насправді знаходиться в шляху до класу. getResourceAsStream()поверне null, якщо це не той випадок, через який останній рядок кидає виняток.

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


моя ієрархія файлів: src -> myPackage -> myClass.java, myProp.properties. Я зробив те, що ви мені порадили, але це все ще кидає той самий виняток
nikos

Оскільки файл ваших властивостей не знаходиться в корені проекту, вам не потрібна провідна коса риса.
Морт

Я отримував виняток, кинутий в першу чергу без провідної косої риски. Це все ще не працює.
nikos

3

Ви можете використовувати java.io.InputStream, щоб прочитати файл, як показано нижче:

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

Як конвертувати InputStream у файл у Java? Я хотів прочитати .properties файл за допомогою API API

3

Враховуючи контекст, loader.getResourceAsStream("myPackage/myProp.properties")слід використовувати.

Ведучий '/'не працює з ClassLoader.getResourceAsStream(String)методом.

Крім того, ви можете використовувати Class.getResourceAsStream(String)метод, який використовує '/'для визначення, чи шлях є абсолютним або відносно місця розташування класу.

Приклади:

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

2

Якщо шлях до файлу ваших властивостей і шлях до класу java збігаються, вам слід це зробити.

Наприклад:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

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

2

Жодна з поточних відповідей не показує, 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);
}

1

Файл властивостей читання з оригінальним порядком:

    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

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

    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блоці. Оскільки a FileInputStreamє автоматичним закриттям, воно буде автоматично закрито після виходу try-with-resourcesблоку. Якщо ви хочете використовувати простий tryблок, ви повинні явно закрити його, використовуючи fis.close();в finallyблоці.


0

Я бачу, що питання старе. Якщо хтось натрапляє на це в майбутньому, я думаю, що це один простий спосіб зробити це. Зберігайте файл властивостей у папці проекту.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.