Odczytywanie pliku Właściwości w Javie

105

Mam następujący kod próbujący odczytać plik właściwości:

Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();           
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);

W ostatnim wierszu dostaję wyjątek. Konkretnie:

Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)

dzięki, Nikos

nikos
źródło

Odpowiedzi:

89

Opierając się na Twoim wyjątku, InputStreamwartość ma wartość null, co oznacza, że ​​program ładujący klasy nie znajduje pliku właściwości. Zgaduję, że myProp.properties znajduje się w katalogu głównym twojego projektu, jeśli tak jest, potrzebujesz poprzedzającego ukośnika:

InputStream stream = loader.getResourceAsStream("/myProp.properties");
Mark Elliot
źródło
moja hierarchia plików to: src -> myPackage -> myClass.java, myProp.properties. Zrobiłem to, co mi doradziłeś, ale wciąż rzuca ten sam wyjątek
nikos
getResourceAsStreamwyszukuje plik w ścieżce klas. Jeśli plik właściwości znajduje się w katalogu pakietu myPackage, użyj /myPackage/myProp.propertiesjako ścieżki.
Jesper
2
@Mark Elliot co, jeśli mam confpakiet do przechowywania wszystkich moich plików konfiguracyjnych, a moja hierarchia plików to :, myproject ->src, conf, testjak mam załadować właściwości, dodając poprzedzający ukośnik?
Roger Ray,
54


Informacje można znaleźć na tej stronie:
http://www.mkyong.com/java/java-properties-file-examples/

Properties prop = new Properties();
try {
    //load a properties file from class path, inside static method
    prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));

    //get the property value and print it out
    System.out.println(prop.getProperty("database"));
    System.out.println(prop.getProperty("dbuser"));
    System.out.println(prop.getProperty("dbpassword"));

} 
catch (IOException ex) {
    ex.printStackTrace();
}
Steven Gomez
źródło
3
Nie zapomnij zamknąć Readerin prop.load(reader), zgodnie z dokumentacją:The specified stream remains open after this method returns
Evandro Silva
25

Możesz użyć ResourceBundleclass do odczytania pliku właściwości.

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
dku.rajkumar
źródło
1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
mcolak
2
To podejście jest zalecane dla i18n.
kolejny
15
Properties prop = new Properties();

try {
    prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
    e.printStackTrace();
}

conf/filename.properties na podstawie projektu root reż

tienya
źródło
7

Nie możesz użyć tego słowa kluczowego, takiego jak -

props.load(this.getClass().getResourceAsStream("myProps.properties"));

w kontekście statycznym.

Najlepiej byłoby poznać kontekst aplikacji, taki jak -

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");

wtedy możesz załadować plik zasobów ze ścieżki klas -

//load a properties file from class path, inside static method
        prop.load(context.getClassLoader().getResourceAsStream("config.properties"));

Będzie to działać zarówno w kontekście statycznym, jak i niestatycznym, a najlepsze jest to, że ten plik właściwości może znajdować się w dowolnym pakiecie / folderze zawartym w ścieżce klas aplikacji.

Mukus
źródło
4
ApplicationContext jest dostępny tylko w przypadku aplikacji Spring
joro
6

Twój plik powinien być dostępny tak jak com/example/foo/myProps.propertiesw ścieżce klas. Następnie załaduj go jako:

props.load(this.getClass().getResourceAsStream("myProps.properties"));
yegor256
źródło
4

jeśli twojej config.properties nie ma w katalogu src / main / resource i znajduje się w katalogu głównym projektu, musisz zrobić coś takiego jak poniżej: -

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);
GUDDU KUMAR
źródło
3

Upewnij się, że nazwa pliku jest poprawna i że plik faktycznie znajduje się w ścieżce klasy. getResourceAsStream()zwróci wartość null, jeśli tak nie jest, co powoduje, że ostatni wiersz zgłasza wyjątek.

Jeśli myProp.properties znajduje się w katalogu głównym projektu, użyj /myProp.propertieszamiast tego.

mort
źródło
moja hierarchia plików to: src -> myPackage -> myClass.java, myProp.properties. Zrobiłem to, co mi doradziłeś, ale wciąż rzuca ten sam wyjątek
nikos
Ponieważ plik właściwości nie znajduje się w katalogu głównym projektu, nie potrzebujesz wiodącego ukośnika.
Mort
Otrzymałem wyjątek rzucony w pierwszej kolejności bez wiodącego ukośnika. Nadal nie działa.
nikos
3

Możesz użyć java.io.InputStream do odczytania pliku, jak pokazano poniżej:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 
Tarun Jain
źródło
Jak przekonwertować InputStream do pliku w Javie? Chciałem odczytać plik .properties za pomocą File API
3

Biorąc pod uwagę kontekst, loader.getResourceAsStream("myPackage/myProp.properties")należy użyć.

Prowadzenie '/'nie działa z ClassLoader.getResourceAsStream(String)metodą.

Alternatywnie możesz użyć Class.getResourceAsStream(String)metody, która używa '/'do określenia, czy ścieżka jest bezwzględna, czy względna w stosunku do lokalizacji klasy.

Przykłady:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")
twr
źródło
2

Jeśli ścieżka do pliku właściwości i ścieżka do klasy java są takie same, należy to zrobić.

Na przykład:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);
Oguzhan Cevik
źródło
2

Żadna z bieżących odpowiedzi nie wskazuje na InputStreamzamknięcie (spowoduje to wyciek deskryptora pliku) i / lub nie zajmie się .getResourceAsStream()zwracaniem wartości null, gdy zasób nie zostanie znaleziony (doprowadzi to do a NullPointerExceptionz mylącą wiadomością "inStream parameter is null"). Potrzebujesz czegoś takiego:

String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename)) {
    if (inputStream == null) {
        throw new FileNotFoundException(propertiesFilename);
    }
    prop.load(inputStream);
} catch (IOException e) {
    throw new RuntimeException(
                "Could not read " + propertiesFilename + " resource file: " + e);
}
Luke Hutchison
źródło
1

Aby odczytać plik właściwości w oryginalnej kolejności:

    File file = new File("../config/edc.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
    layout.load(new InputStreamReader(new FileInputStream(file)));

    for(Object propKey : layout.getKeys()){
        PropertiesConfiguration propval =  layout.getConfiguration();
        String value = propval.getProperty((String) propKey).toString();
        out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
    }
Spacerować
źródło
1

Wiele odpowiedzi tutaj opisuje niebezpieczne metody, w których tworzą one instancję strumienia wejściowego pliku, ale nie uzyskują odniesienia do strumienia wejściowego w celu późniejszego zamknięcia strumienia. Powoduje to zawieszanie się strumieni wejściowych i wycieki pamięci. Prawidłowy sposób wczytywania właściwości powinien być podobny do następującego:

    Properties prop = new Properties();
    try(InputStream fis = new FileInputStream("myProp.properties")) {
        prop.load(fis);
    }
    catch(Exception e) {
        System.out.println("Unable to find the specified properties file");
        e.printStackTrace();
        return;
    }

Zwróć uwagę na tworzenie instancji strumienia wejściowego pliku w try-with-resourcesbloku. Ponieważ a FileInputStreammożna automatycznie zamykać, zostanie automatycznie zamknięty po try-with-resourceswyjściu z bloku. Jeśli chcesz użyć prostego trybloku, musisz go jawnie zamknąć za pomocą fis.close();w finallybloku.

VHS
źródło
1

Widzę, że to stare pytanie. Jeśli ktoś się na to natknie w przyszłości, myślę, że jest to prosty sposób na zrobienie tego. Zachowaj plik właściwości w folderze projektu.

        FileReader reader = new FileReader("Config.properties");

        Properties prop = new Properties();
        prop.load(reader);
manikanta nvsr
źródło
-1

Określ ścieżkę zaczynającą się od src, jak poniżej:

src/main/resources/myprop.proper
user11159629
źródło