Saya punya kode ini

    InputStream stream1 = ResponseCreator.class.getResourceAsStream("version.properties");
    InputStream stream2 = ResponseCreator.class.getResourceAsStream("/version.properties");
    InputStream stream3 = ResponseCreator.class.getClassLoader().getResourceAsStream("version.properties");
    InputStream stream4 = ResponseCreator.class.getClassLoader().getResourceAsStream("/version.properties");

    System.out.println("result1="+stream1);
    System.out.println("result2="+stream2);
    System.out.println("result3="+stream3);
    System.out.println("result4="+stream4);

Dan hasilnya adalah...

result1=null
result2=java.io.BufferedInputStream@75412c2f
result3=java.io.BufferedInputStream@282ba1e
result4=null

Itu tampaknya sangat aneh dan tidak konsisten dan saya bahkan melihat posting yang mengatakan stream1 adalah cara yang harus dilakukan dan itu bahkan tidak berhasil untuk saya (Eclipse IDE run, Intellij IDE run di MAC keduanya menghasilkan yang sama)

Saya menjalankan jdk8 dan sekarang saya mencoba dengan 11 yang kami jalankan sekarang. Berikut adalah hasilnya..

INFO: Starting Development Server under java version=11.0.5
result1=null 
result2=sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@3b220bcb
result3=sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@2b95e48b
result4=null
2
Dean Hiller 18 Maret 2020, 04:34

1 menjawab

Jawaban Terbaik

Javadoc dari Class.getResourceAsStream(String name) mengatakan:

  • Jika name dimulai dengan '/' ('\u002f'), maka nama absolut sumber daya adalah bagian dari name setelah '/'.

  • Jika tidak, nama absolutnya adalah dalam bentuk berikut:

     modified_package_name/name  

    Di mana modified_package_name adalah nama paket objek ini dengan '/' diganti dengan '.' ('\u002e').

Jadi, jika kita berasumsi bahwa kelas ResponseCreator ada di dalam paket com.example maka:

// The following are the same, and returns resource "com/example/version.properties"
ResponseCreator.class.getResourceAsStream("version.properties")
ResponseCreator.class.getClassLoader().getResourceAsStream("com/example/version.properties")

// The following are the same, and returns resource "version.properties"
ResponseCreator.class.getResourceAsStream("/version.properties")
ResponseCreator.class.getClassLoader().getResourceAsStream("version.properties")

// The following returns null because resource names don't start with /
ResponseCreator.class.getClassLoader().getResourceAsStream("/version.properties")

Karena Anda hanya memiliki sumber daya "version.properties", Anda mendapatkan:

  • stream1 mengembalikan null (tidak ditemukan)

  • stream2 dan stream3 mengembalikan aliran untuk sumber daya

  • stream4 mengembalikan null (tidak ditemukan, alias nama tidak valid)

Tidak ada yang tidak konsisten dalam hal ini. Metode melakukan persis seperti yang didokumentasikan untuk dilakukan. Terserah Anda untuk membaca dokumentasinya, sehingga Anda memahami apa yang dilakukan metode tersebut, daripada mencoba menebak cara kerjanya.

2
Community 20 Juni 2020, 09:12