Membaca file Properties di Java


105

Saya memiliki kode berikut mencoba membaca file properti:

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

Saya mendapatkan pengecualian di baris terakhir. Secara khusus:

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)

terima kasih, Nikos

Jawaban:


89

Berdasarkan pengecualian Anda, InputStreamadalah null, ini berarti pemuat kelas tidak menemukan file properti Anda. Saya menduga bahwa myProp.properties ada di root proyek Anda, jika demikian, Anda memerlukan garis miring sebelumnya:

InputStream stream = loader.getResourceAsStream("/myProp.properties");

hierarki file saya adalah: src -> myPackage -> myClass.java, myProp.properties. Saya melakukan apa yang Anda sarankan kepada saya tetapi masih memberikan pengecualian yang sama
nikos

getResourceAsStreammencari file di classpath. Jika file properti Anda ada di direktori paket myPackage, maka gunakan /myPackage/myProp.propertiessebagai jalur.
Jesper

2
@ Mark Elliot bagaimana jika saya memiliki confpaket untuk menyimpan semua file konfigurasi saya dan hierarki file saya adalah:, myproject ->src, conf, testbagaimana cara memuat properti dengan menambahkan garis miring sebelumnya?
Roger Ray

54


Anda dapat menemukan informasi di halaman ini:
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();
}

3
Jangan lupa untuk menutup Readerdi prop.load(reader), menurut dokumentasi:The specified stream remains open after this method returns
Evandro Silva

25

Anda dapat menggunakan ResourceBundlekelas untuk membaca file properti.

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");

1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
mcolak

2
Pendekatan ini direkomendasikan untuk i18n.
lain

15
Properties prop = new Properties();

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

conf/filename.properties berdasarkan direktori root proyek


7

Anda tidak dapat menggunakan kata kunci ini seperti -

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

dalam konteks statis.

Hal terbaik adalah memahami konteks aplikasi seperti -

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

maka Anda dapat memuat file sumber daya dari classpath -

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

Ini akan bekerja untuk konteks statis dan non-statis dan bagian terbaiknya adalah file properti ini dapat berada di paket / folder apa pun yang termasuk dalam jalur kelas aplikasi.


4
ApplicationContext hanya tersedia dalam kasus aplikasi Spring
joro

6

File Anda harus tersedia seperti com/example/foo/myProps.propertiesdi classpath. Kemudian muat sebagai:

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

4

jika config.properties Anda tidak ada di direktori src / main / resource dan berada di direktori root proyek maka Anda perlu melakukan sesuatu seperti di bawah ini: -

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);

3

Pastikan bahwa nama file benar dan file tersebut benar-benar berada di jalur kelas. getResourceAsStream()akan mengembalikan null jika ini bukan kasus yang menyebabkan baris terakhir memunculkan pengecualian.

Jika myProp.properties ada di direktori root proyek Anda, gunakan /myProp.propertiessaja.


hierarki file saya adalah: src -> myPackage -> myClass.java, myProp.properties. Saya melakukan apa yang Anda sarankan kepada saya tetapi masih memberikan pengecualian yang sama
nikos

Karena file properti Anda tidak berada di root proyek, Anda tidak memerlukan garis miring di depan.
mortir

Saya mendapatkan pengecualian dilemparkan di tempat pertama tanpa garis miring di depan. Ini masih belum berhasil.
nikos

3

Anda dapat menggunakan java.io.InputStream untuk membaca file seperti yang ditunjukkan di bawah ini:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 

Bagaimana cara mengonversi InputStream ke File di java? Saya ingin membaca file .properties menggunakan File API

3

Mengingat konteksnya loader.getResourceAsStream("myPackage/myProp.properties")harus digunakan.

Memimpin '/'tidak bekerja dengan ClassLoader.getResourceAsStream(String)metode.

Alternatifnya, Anda bisa menggunakan Class.getResourceAsStream(String)metode, yang digunakan '/'untuk menentukan apakah jalur itu mutlak atau relatif terhadap lokasi kelas.

Contoh:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")

2

Jika jalur file properti dan jalur kelas java Anda sama, Anda harus melakukannya.

Sebagai contoh:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);

2

Tak satu pun dari jawaban saat ini yang menunjukkan InputStreampenutupan (ini akan membocorkan deskriptor file), dan / atau tidak berurusan dengan .getResourceAsStream()mengembalikan null ketika sumber daya tidak ditemukan (ini akan mengarah ke a NullPointerExceptiondengan pesan yang membingungkan, "inStream parameter is null"). Anda membutuhkan sesuatu seperti berikut ini:

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

1

Untuk file Reading Properties dengan urutan aslinya:

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

1

Banyak jawaban di sini menjelaskan metode berbahaya di mana mereka membuat contoh aliran input file tetapi tidak mendapatkan referensi ke aliran input untuk menutup aliran nanti. Hal ini menyebabkan aliran input yang menggantung dan kebocoran memori. Cara yang benar untuk memuat properti harus serupa dengan berikut ini:

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

Perhatikan pembuatan instance aliran input file dalam try-with-resourcesblok. Karena a FileInputStreamautocloseable, itu akan ditutup secara otomatis setelah try-with-resourcesblokir keluar. Jika Anda ingin menggunakan sederhana tryblok, Anda harus secara eksplisit menutupnya menggunakan fis.close();di finallyblok.


0

Saya melihat bahwa pertanyaan itu adalah pertanyaan lama. Jika ada yang menemukan ini di masa depan, saya pikir ini adalah salah satu cara sederhana untuk melakukannya. Simpan file properti di folder proyek Anda.

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

        Properties prop = new Properties();
        prop.load(reader);

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.