Завантаження файлу властивостей з пакету 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на classpath.

Використання абсолютного шляху (той, який починається з '/') означає, що поточний пакет ігнорується.


2
Рекомендація: Додайте пояснення, коли використовувати відносні та коли використовувати абсолютні шляхи (з початком та без "/").
Аарон Дігулла

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

1
@jonney: Сама Java не має поняття "каталог проектів", деякі IDE можуть мати таке. Але що стосується Java, то це просто файл десь у файловій системі, який взагалі не має відношення до classpath.
Йоахім Зауер

50

Щоб додати відповідь Йоахіма Зауера, якщо вам коли-небудь потрібно робити це в статичному контексті, ви можете зробити щось на зразок наступного:

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

(Обробка винятків відхилена, як і раніше.)


Це відповідь, яка працювала на мене. Я не зміг отримати прийняту відповідь на роботу.
Стів HHH

1
@cobranibre як читати файл властивостей, який знаходиться в resourcesпапці mavenпроекту
Kasun Siyambalapitiya

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

Припустимо, що ви використовуєте клас " Властивості" , використовуючи його метод завантаження , і я думаю, що ви використовуєте ClassLoader getResourceAsStream для отримання вхідного потоку.

Як ти передаєш ім’я, здається, воно має бути в такому вигляді: /com/al/common/email/templates/foo.properties


1

Мені вдалося вирішити це питання за допомогою цього дзвінка

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

Додатково, ви повинні помістити файл Any.properties в / src / main / ресурси


9
Звідки ти берешся PropertiesUtil?
Бен Уотсон

1

Ніхто не згадує подібне, але навіть простіше рішення, ніж вище, не потрібно мати справу з пакетом класу. Якщо припустити, що файл myfile.properties знаходиться в класі.

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

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


-2

використовуйте наведений нижче код, будь ласка:

    Властивості p = нові властивості (); StringBuffer path = новий StringBuffer ( "com / al / common / email / templates /" ); 
    шлях . додавати ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( шлях . доString ());   
      
    
                                    

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.