Загрузка файла свойств из пакета Java


115

Мне нужно прочитать файлы свойств, которые похоронены в моей структуре пакета в com.al.common.email.templates.

Я все перепробовал и не могу понять.

В конце концов, мой код будет выполняться в контейнере сервлета, но я не хочу ни в чем зависеть от контейнера. Я пишу тестовые примеры JUnit, и он должен работать в обоих.

Ответы:


235

При загрузке свойств из класса в пакете com.al.common.email.templatesвы можете использовать

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(Добавьте всю необходимую обработку исключений).

Если вашего класса нет в этом пакете, вам нужно получить InputStream немного иначе:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

Относительные пути (без начального символа "/") в getResource()/ getResourceAsStream()означают, что поиск ресурса будет выполняться относительно каталога, представляющего пакет, в котором находится класс.

Использование java.lang.String.class.getResource("foo.txt")будет искать (несуществующий) файл /java/lang/String/foo.txtв пути к классам.

Использование абсолютного пути (начинающегося с '/') означает, что текущий пакет игнорируется.


2
Предложение: добавьте объяснение, когда использовать относительные и когда использовать абсолютные пути (с и без «/» в начале).
Аарон Дигулла, 02

1
что, если ваш файл свойств находится за пределами каталога src, но все еще находится внутри вашего директора проекта?
Джонатан

1
@jonney: В самой Java нет понятия «каталог проекта», в некоторых IDE это может быть. Но что касается Java, то это просто файл где-то в файловой системе, не имеющий никакого отношения к пути к классам.
Joachim Sauer

50

Чтобы добавить к ответу Иоахима Зауэра, если вам когда-нибудь понадобится сделать это в статическом контексте, вы можете сделать что-то вроде следующего:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(Обработка исключений опущена, как и раньше.)


Этот ответ сработал для меня. Я не смог заставить принятый ответ работать.
Steve HHH

1
@cobralibre, как читать файл свойств, который находится в resourcesпапке в mavenпроекте
Касун Сиямбалапития

16

Следующие два случая относятся к загрузке файла свойств из примера класса с именем TestLoadProperties .

Случай 1. Загрузка файла свойств с помощью ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

В этом случае файл свойств должен находиться в root/srcкаталоге для успешной загрузки.

Случай 2: загрузка файла свойств без использования ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

В этом случае TestLoadProperties.classдля успешной загрузки файл свойств должен находиться в том же каталоге, что и файл.

Примечание: TestLoadProperties.java и TestLoadProperties.classэто два разных файла. Первый, .javaфайл, обычно находится в src/каталоге проекта , а второй, .classфайл, обычно находится в его bin/каталоге.


12
public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

10
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

2

Предполагая, что вы используете класс Properties через его метод загрузки , и я предполагаю, что вы используете ClassLoader getResourceAsStream для получения входного потока.

Как вы передаете имя, кажется, оно должно быть в такой форме: /com/al/common/email/templates/foo.properties


1

Мне удалось решить эту проблему с помощью этого звонка

Properties props = PropertiesUtil.loadProperties("whatever.properties");

Кроме того, вы должны поместить свой файл something.properties в / src / main / resources


9
Откуда ты PropertiesUtil?
Бен Уотсон

1

Никто не упоминает аналогичное, но даже более простое решение, чем приведенное выше, без необходимости иметь дело с пакетом класса. Предполагая, что myfile.properties находится в пути к классам.

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

наслаждаться


-2

используйте приведенный ниже код:

    Свойства p = новые свойства (); Путь StringBuffer = новый StringBuffer ( "com / al / common / email / templates /" ); 
    путь . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( путь . toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.