Загрузка файла свойств из пакета Java - PullRequest
108 голосов
/ 02 декабря 2008

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

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

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

Ответы [ 9 ]

230 голосов
/ 02 декабря 2008

При загрузке свойств из класса в пакет 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 в пути к классам.

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

48 голосов
/ 03 июля 2009

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

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

(обработка исключений, как и прежде, исключена).

15 голосов
/ 15 августа 2013

Следующие два случая относятся к загрузке файла свойств из примера класса с именем 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/.

11 голосов
/ 07 февраля 2012
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();
    }

}
8 голосов
/ 01 мая 2013
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 голосов
/ 02 декабря 2008

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

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

1 голос
/ 21 июня 2017

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

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

Наслаждайтесь

1 голос
/ 02 января 2017

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

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

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

0 голосов
/ 03 февраля 2014

используйте следующий код, пожалуйста:

    Properties p = new Properties(); 
    StringBuffer path = new StringBuffer("com/al/common/email/templates/");
    path.append("foo.properties");
    InputStream fs = getClass().getClassLoader()
                                    .getResourceAsStream(path.toString());</p>

<code>if(fs == null){
     System.err.println("Unable to load the properties file");
  }
else{
   try{
       p.load(fs);
     } 
catch (IOException e) {
        e.printStackTrace();
      }
   }
</code>
...