Чтение файла свойств в 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равно нулю, это означает, что загрузчик классов не находит ваш файл свойств. Я предполагаю, что myProp.properties находится в корне вашего проекта, в этом случае вам понадобится предшествующая косая черта:

InputStream stream = loader.getResourceAsStream("/myProp.properties");
Марк Эллиот
источник
моя файловая иерархия: src -> myPackage -> myClass.java, myProp.properties. Я сделал то, что вы мне посоветовали, но по-прежнему выдает то же исключение
nikos
getResourceAsStreamищет файл в пути к классам. Если ваш файл свойств находится в каталоге пакета 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
25

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

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
dku.rajkumar
источник
1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
mcolak 05
2
Этот подход рекомендуется для i18n.
еще один
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");

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

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

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

Мукус
источник
4
ApplicationContext доступен только в случае приложения Spring
joro
6

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

props.load(this.getClass().getResourceAsStream("myProps.properties"));
Егор256
источник
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. Я сделал то, что вы мне посоветовали, но это по-прежнему вызывает то же исключение
Никос
Поскольку ваш файл свойств не находится в корне вашего проекта, вам не нужна косая черта в начале.
mort
Я получал исключение, в первую очередь, без ведущей косой черты. Это все еще не работает.
nikos
3

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

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 
Тарун Джайн
источник
Как преобразовать InputStream в файл в Java? Я хотел прочитать файл .properties с помощью File API
3

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

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

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

Примеры:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")
twr
источник
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()возвратом 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);
}
Люк Хатчисон
источник
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блоке.

VHS
источник
1

Вижу, вопрос старый. Если кто-то наткнется на это в будущем, я думаю, что это один простой способ сделать это. Сохраните файл свойств в папке вашего проекта.

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

        Properties prop = new Properties();
        prop.load(reader);
Manikanta NVSR
источник
-1

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

src/main/resources/myprop.proper
user11159629
источник