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

nikos
sumber

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");
Mark Elliot
sumber
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();
}
Steven Gomez
sumber
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");
dku.rajkumar
sumber
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

tienya
sumber
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.

Mukus
sumber
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"));
yegor256
sumber
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);
GUDDU KUMAR
sumber
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.

mort
sumber
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); 
Tarun Jain
sumber
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")
twr
sumber
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);
Oguzhan Cevik
sumber
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);
}
Luke Hutchison
sumber
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>");
    }
Berjalan
sumber
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.

VHS
sumber
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);
manikanta nvsr
sumber
-2

Tentukan jalur mulai dari src seperti di bawah ini:

src/main/resources/myprop.proper
pengguna11159629
sumber