Wczytywanie pliku właściwości z pakietu Java

Muszę przeczytać pliki właściwości, które są zakopane w mojej strukturze pakietu w com.al.common.email.templates.

Próbowałem wszystkiego i nie mogę tego rozgryźć.

W końcu mój kod będzie działał w kontenerze servlet, ale nie chcę polegać na kontenerze pod żadnym względem. Piszę testy JUnit i musi działać w obu przypadkach.

Author: Joachim Sauer, 2008-12-02

9 answers

Podczas ładowania Właściwości z klasy w pakiecie com.al.common.email.templates można użyć

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

(dodaj całą niezbędną obsługę wyjątków).

Jeśli twoja klasa nie znajduje się w tym pakiecie, musisz zdobyć InputStream nieco inaczej:

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

Ścieżki względne (te bez wiodącego"/") w getResource()/getResourceAsStream() oznacza to, że zasób będzie przeszukiwany względem katalogu, który reprezentuje pakiet, w którym znajduje się Klasa.

Za pomocą java.lang.String.class.getResource("foo.txt") szukalibyśmy (nieistniejącego) plik /java/lang/String/foo.txt na classpath.

Użycie ścieżki bezwzględnej (zaczynającej się od '/') oznacza, że bieżący Pakiet jest ignorowany.

 220
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-01 16:54:47

Aby dodać do odpowiedzi Joachima Sauera, jeśli kiedykolwiek potrzebujesz zrobić to w kontekście statycznym, możesz zrobić coś takiego:

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

(obsługa wyjątków, jak poprzednio.)

 44
Author: cobra libre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-01 17:19:52

Poniższe dwa przypadki dotyczą ładowania pliku właściwości z przykładowej klasy o nazwie TestLoadProperties.

Przypadek 1: Ładowanie pliku właściwości za pomocą ClassLoader

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

W tym przypadku Plik Właściwości musi znajdować się w katalogu root/src dla pomyślnego załadowania.

Przypadek 2: ładowanie pliku właściwości bez użycia ClassLoader

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

W tym przypadku Plik Właściwości musi znajdować się w tym samym katalogu co plik TestLoadProperties.class, aby zakończył się sukcesem Ładuję.

Uwaga: TestLoadProperties.java i TestLoadProperties.class to dwa różne pliki. Pierwszy plik .java znajduje się zwykle w katalogu src/ projektu, podczas gdy drugi plik .class znajduje się zwykle w katalogu bin/.

 13
Author: KulDeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 19:54:33
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
Author: user897493,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 20:53:30
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());
        }

    }
}
 8
Author: Vicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 08:46:37

Zakładając, że używasz klasy Properties , poprzez jej metodę load i domyślam się, że używasz Classloadera getResourceAsStream, aby uzyskać strumień wejściowy.

Jak podajesz nazwę, wydaje się, że powinna być w tej formie: /com/al/common/email/templates/foo.properties

 2
Author: Chris Kimpton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 03:09:41

Udało mi się rozwiązać ten problem za pomocą tego połączenia

Properties props = PropertiesUtil.loadProperties("whatever.properties");
Extra, musisz włożyć cokolwiek.Plik Właściwości w /src/main / resources
 1
Author: Naramsim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 14:30:58

Nikt nie wspomina o podobnym, ale nawet prostszym rozwiązaniu niż powyżej, bez potrzeby radzenia sobie z pakietem klasy. Zakładając mój plik.properties znajduje się w classpath.

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

Enjoy

 0
Author: isaac.hazan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 13:55:48

Użyj poniższego kodu :

    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();
      }
   }
 -2
Author: Prithvish Mukherjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 17:56:05