Memuat file properti dari paket Java

115

Saya perlu membaca file properti yang terkubur dalam struktur paket saya di com.al.common.email.templates.

Saya sudah mencoba segalanya dan saya tidak bisa memahaminya.

Pada akhirnya, kode saya akan berjalan di wadah servlet, tetapi saya tidak ingin bergantung pada wadah untuk apa pun. Saya menulis kasus uji JUnit dan perlu berfungsi di keduanya.

SacramentoJoe
sumber

Jawaban:

235

Saat memuat Properti dari Kelas dalam paket com.al.common.email.templatesyang dapat Anda gunakan

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

(Tambahkan semua penanganan pengecualian yang diperlukan).

Jika kelas Anda tidak ada dalam paket itu, Anda perlu mendapatkan InputStream sedikit berbeda:

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

Jalur relatif (tanpa awalan '/') di getResource()/ getResourceAsStream()berarti bahwa sumber daya akan dicari relatif terhadap direktori yang mewakili paket tempat kelas berada.

Menggunakan java.lang.String.class.getResource("foo.txt")akan mencari file (tidak ada) /java/lang/String/foo.txtdi classpath.

Menggunakan jalur absolut (yang dimulai dengan '/') berarti paket saat ini diabaikan.

Joachim Sauer
sumber
2
Saran: Tambahkan penjelasan kapan harus menggunakan relative dan kapan menggunakan path absolut (dengan dan tanpa tanda "/" di awal).
Aaron Digulla
1
bagaimana jika file properti Anda berada di luar direktori src tetapi masih di dalam direktur proyek Anda?
Jonathan
1
@ Jonney: Java sendiri tidak memiliki gagasan tentang "direktori proyek", beberapa IDE mungkin memilikinya. Tapi sejauh menyangkut Java maka itu hanyalah sebuah file di suatu tempat di sistem file tanpa hubungan sama sekali dengan classpath.
Joachim Sauer
50

Untuk menambah jawaban Joachim Sauer, jika Anda perlu melakukan ini dalam konteks statis, Anda dapat melakukan sesuatu seperti berikut:

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

(Penanganan pengecualian dihilangkan, seperti sebelumnya.)

kobra gratis
sumber
Ini adalah jawaban yang berhasil untuk saya. Saya tidak bisa mendapatkan jawaban yang diterima untuk bekerja.
Steve HHH
1
@cobralibre bagaimana membaca file properti yang berada di resourcesfolder dalam sebuah mavenproyek
Kasun Siyambalapitiya
16

Dua kasus berikut berkaitan dengan memuat file properti dari kelas contoh bernama TestLoadProperties.

Kasus 1: Memuat file properti menggunakan ClassLoader

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

Dalam hal ini, file properti harus ada di root/srcdirektori agar pemuatan berhasil.

Kasus 2: Memuat file properti tanpa menggunakan ClassLoader

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

Dalam hal ini, file properti harus berada di direktori yang sama dengan TestLoadProperties.classfile agar pemuatan berhasil.

Catatan: TestLoadProperties.java dan TestLoadProperties.classmerupakan dua file yang berbeda. Yang pertama, .javafile, biasanya ditemukan di src/direktori proyek , sedangkan yang terakhir, .classfile, biasanya ditemukan di bin/direktorinya.

KulDeep
sumber
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();
    }

}
pengguna897493
sumber
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
sumber
2

Dengan asumsi Anda menggunakan kelas Properties , melalui metode pemuatannya , dan saya kira Anda menggunakan ClassLoader getResourceAsStream untuk mendapatkan aliran input.

Bagaimana Anda menyampaikan namanya, sepertinya harus dalam bentuk ini: /com/al/common/email/templates/foo.properties

Chris Kimpton
sumber
1

Saya berhasil menyelesaikan masalah ini dengan panggilan ini

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

Ekstra, Anda harus meletakkan file apa pun.properties Anda di / src / main / resources

Naramsim
sumber
9
Di mana Anda mendapatkan PropertiesUtildari?
Ben Watson
1

Tidak ada yang menyebutkan solusi serupa tetapi bahkan lebih sederhana daripada di atas tanpa perlu berurusan dengan paket kelas. Dengan asumsi myfile.properties ada di classpath.

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

Nikmati

isaac.hazan
sumber
-2

gunakan kode di bawah ini, silakan:

    Properti p = Properti baru (); Properti p = Properti baru ();   
    Jalur StringBuffer = new StringBuffer ("com / al / common / email / templates /");Jalur StringBuffer = new StringBuffer ( "com / al / common / email / templates /" );  
    path.append ("foo.properties");. append ( "foo.properties" );
    InputStream fs = getClass (). GetClassLoader ()InputStream fs = getClass (). getClassLoader ()
                                    .getResourceAsStream (path.toString ());. getResourceAsStream ( jalur . 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
sumber