Ładowanie pliku właściwości z pakietu Java

115

Muszę odczytać pliki właściwości, które są zakopane w strukturze mojego pakietu 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 serwletów, ale nie chcę polegać na tym kontenerze w niczym. Piszę przypadki testowe JUnit i musi działać w obu.

SacramentoJoe
źródło

Odpowiedzi:

235

Podczas ładowania właściwości z klasy w pakiecie com.al.common.email.templatesmożesz 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 twojej klasy nie ma w tym pakiecie, musisz zdobyć InputStream nieco inaczej:

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

Względne ścieżki (te bez wiodącego „/”) w getResource()/ getResourceAsStream()oznaczają, że zasób będzie przeszukiwany względem katalogu reprezentującego pakiet, w którym znajduje się klasa.

Użycie java.lang.String.class.getResource("foo.txt")spowoduje wyszukanie (nieistniejącego) pliku /java/lang/String/foo.txtw ścieżce klas.

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

Joachim Sauer
źródło
2
Sugestia: dodaj wyjaśnienie, kiedy używać względnych, a kiedy bezwzględnych ścieżek (z „/” na początku i bez niego).
Aaron Digulla
1
co, jeśli plik właściwości znajduje się poza katalogiem src, ale nadal znajduje się w dyrektorze projektu?
Jonathan
1
@jonney: Sama Java nie ma pojęcia „katalogu projektu”, niektóre IDE mogą go mieć. Ale jeśli chodzi o Javę, to jest to po prostu plik w systemie plików, który nie ma żadnego związku ze ścieżką klas.
Joachim Sauer
50

Aby dodać do odpowiedzi Joachima Sauera, jeśli kiedykolwiek będziesz musiał to zrobić 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()
}

(Usunięto obsługę wyjątków, jak poprzednio).

cobra libre
źródło
To odpowiedź, która mi pomogła. Nie mogłem uzyskać zaakceptowanej odpowiedzi do pracy.
Steve HHH
1
@cobralibre jak czytać plik właściwości, który znajduje się w resourcesfolderze w mavenprojekcie
Kasun Siyambalapitiya
16

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 przy użyciu ClassLoader

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

W takim przypadku plik właściwości musi znajdować się w root/srckatalogu, aby można było pomyślnie załadować.

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

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

W takim przypadku plik właściwości musi znajdować się w tym samym katalogu, co TestLoadProperties.classplik, aby można było go załadować.

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

KulDeep
źródło
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();
    }

}
user897493
źródło
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());
        }

    }
}
Vicky
źródło
2

Zakładając, że używasz klasy Properties , za pośrednictwem jej metody ładowania , i myślę, że używasz ClassLoader getResourceAsStream, aby uzyskać strumień wejściowy.

Jak przekazujesz imię, wydaje się, że powinno być w tej formie: /com/al/common/email/templates/foo.properties

Chris Kimpton
źródło
1

Dzięki tej rozmowie udało mi się rozwiązać ten problem

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

Dodatkowo musisz umieścić swój plik what.properties w / src / main / resources

Naramsim
źródło
9
Skąd się wybierasz PropertiesUtil?
Ben Watson
1

Nikt nie wspomina o podobnym, ale nawet prostszym rozwiązaniu niż powyżej, bez konieczności zajmowania się pakietem klasy. Zakładając, że myfile.properties znajduje się w ścieżce klas.

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

Cieszyć się

isaac.hazan
źródło
-2

użyj poniższego kodu:

    Właściwości p = nowe Właściwości (); StringBuffer path = new StringBuffer ( "com / al / common / email / templates /" ); 
    ścieżka . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( ścieżka . toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
Prithvish Mukherjee
źródło