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

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

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

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

Ответ 1

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

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

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

(Исключение выполнялось, как и раньше.)

Ответ 3

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

Ответ 4

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();
    }

}

Ответ 5

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());
        }

    }
}

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Enjoy

Ответ 9

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

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

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