Saya mencoba membaca file teks yang diatur dalam variabel sistem CLASSPATH. Bukan variabel pengguna.
Saya mencoba mendapatkan aliran input ke file seperti di bawah ini:
Tempatkan direktori file ( D:\myDir
) di CLASSPATH dan coba di bawah ini:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Tempatkan path file lengkap ( D:\myDir\SomeTextFile.txt
) di CLASSPATH dan coba 3 baris kode yang sama.
Tapi sayangnya TIDAK satu pun dari mereka yang berfungsi dan saya selalu masuk null
ke InputStream saya in
.
getResourceAsStream()
File.Separator
- karena Anda tidak meminta file , Anda meminta sumber daya . Penting untuk dipahami bahwa abstraksi yang terlibat bukanlah sistem file.Class.getResourceAsStream
ini benar-benar metode kenyamanan untuk meneleponClassLoader.getResourceAsStream
, tetapi dengan fitur tambahan sumber daya "relatif". Jika Anda menentukan sumber daya absolut, maka setiap panggilan menggunakan classloader yang sama akan melakukan hal yang sama.Saat menggunakan Kerangka Kerja Pegas (baik sebagai kumpulan utilitas atau wadah - Anda tidak perlu menggunakan fungsionalitas yang terakhir), Anda dapat dengan mudah menggunakan abstraksi Sumberdaya .
Melalui antarmuka Sumber Daya Anda dapat mengakses sumber daya sebagai InputStream , URL , URI atau File . Mengubah jenis sumber daya ke misalnya sumber daya sistem file adalah masalah sederhana mengubah instance.
sumber
Ini adalah bagaimana saya membaca semua baris file teks di classpath saya, menggunakan Java 7 NIO:
NB ini adalah contoh bagaimana hal itu dapat dilakukan. Anda harus melakukan perbaikan seperlunya. Contoh ini hanya akan berfungsi jika file tersebut benar-benar ada di classpath Anda, jika tidak NullPointerException akan dilempar ketika getResource () mengembalikan null dan .toURI () dipanggil padanya.
Juga, sejak Java 7, satu cara mudah menentukan set karakter adalah dengan menggunakan konstanta yang didefinisikan dalam
java.nio.charset.StandardCharsets
(ini, menurut javadocs mereka , "dijamin akan tersedia pada setiap implementasi platform Java.").Oleh karena itu, jika Anda mengetahui penyandian file menjadi UTF-8, maka tentukan charset secara eksplisit
StandardCharsets.UTF_8
sumber
Spring
ituStreamUtils.copyToString
.Silakan dicoba
Percobaan Anda tidak berhasil karena hanya pemuat kelas untuk kelas Anda yang dapat memuat dari classpath. Anda menggunakan pemuat kelas untuk sistem java itu sendiri.
sumber
Untuk benar-benar membaca isi file, saya suka menggunakan Commons IO + Spring Core. Dengan asumsi Java 8:
Kalau tidak:
sumber
Untuk mendapatkan path absolut kelas coba ini:
sumber
Entah bagaimana jawaban terbaik tidak berhasil untuk saya. Saya perlu menggunakan kode yang sedikit berbeda.
Saya harap ini membantu mereka yang mengalami masalah yang sama.
sumber
Jika Anda menggunakan Jambu Biji:
kita bisa mendapatkan URL dari CLASSPATH:
atau InputStream:
sumber
Untuk membaca konten file ke dalam String dari
classpath
, Anda dapat menggunakan ini:Catatan:
IOUtils
adalah bagian dariCommons IO
.Sebut saja seperti ini:
sumber
Anda mengatakan "Saya mencoba membaca file teks yang diatur dalam variabel sistem CLASSPATH." Tebakan saya ini ada di Windows dan Anda menggunakan dialog jelek ini untuk mengedit "Variabel Sistem".
Sekarang Anda menjalankan program Java Anda di konsol. Dan itu tidak berhasil: Konsol mendapatkan salinan nilai-nilai variabel sistem satu kali ketika dimulai . Ini berarti setiap perubahan dalam dialog setelahnya tidak berpengaruh.
Ada beberapa solusi ini:
Mulai konsol baru setelah setiap perubahan
Gunakan
set CLASSPATH=...
di konsol untuk mengatur salinan variabel di konsol dan ketika kode Anda bekerja, rekatkan nilai terakhir ke dalam dialog variabel.Masukkan panggilan ke Java ke
.BAT
file dan klik dua kali. Ini akan membuat konsol baru setiap kali (sehingga menyalin nilai saat ini dari variabel sistem).WASPADALAH: Jika Anda juga memiliki variabel Pengguna
CLASSPATH
maka itu akan membayangi variabel sistem Anda. Itu sebabnya biasanya lebih baik untuk menempatkan panggilan ke program Java Anda ke dalam.BAT
file dan mengatur classpath di sana (menggunakanset CLASSPATH=
) daripada mengandalkan sistem global atau variabel pengguna.Ini juga memastikan bahwa Anda dapat memiliki lebih dari satu program Java yang bekerja di komputer Anda karena mereka pasti memiliki jalan kelas yang berbeda.
sumber
Jawaban saya tidak persis apa yang ditanyakan dalam pertanyaan. Sebaliknya saya memberikan solusi persis seberapa mudah kita dapat membaca file ke dalam aplikasi java dari jalur kelas proyek kami.
Misalnya misalkan nama file config example.xml terletak di jalur seperti di bawah ini: -
com.myproject.config.dev
dan file kelas java executable kami berada di jalur di bawah ini: -
com.myproject.server.main
sekarang cukup periksa di kedua jalur di atas yang merupakan direktori / folder umum terdekat dari tempat Anda dapat mengakses direktori / folder utama dan dev (com.myproject.server.main - di mana ada kelas executable java aplikasi kita) - Kita bisa melihat bahwa itu adalah folder / direktori myproject yang merupakan direktori / folder umum terdekat dari tempat kita dapat mengakses file example.xml kita. Oleh karena itu dari kelas yang dapat dieksekusi java berada di folder / direktori utama kita harus kembali dua langkah seperti ../../ untuk mengakses myproject . Sekarang setelah ini, lihat bagaimana kita dapat membaca file: -
sumber
Jika Anda mengkompilasi proyek Anda dalam file jar: Anda dapat meletakkan file Anda di sumber daya / file / your_file.text atau pdf;
dan gunakan kode ini:
sumber
Saya menggunakan server aplikasi webshpere dan Modul Web saya dibuat di Spring MVC. Para
Test.properties
terletak di folder sumber daya, saya mencoba untuk memuat file ini menggunakan berikut:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Tidak satu pun dari kode di atas memuat file.
Tetapi dengan bantuan kode di bawah ini file properti berhasil dimuat:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Terima kasih kepada pengguna "user1695166" .
sumber
Menggunakan
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
sumber
Skenario:
1)
client-service-1.0-SNAPSHOT.jar
memiliki ketergantunganread-classpath-resource-1.0-SNAPSHOT.jar
2) kami ingin membaca konten sumber daya jalur kelas (
sample.txt
)read-classpath-resource-1.0-SNAPSHOT.jar
melaluiclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
telahsrc/main/resources/sample.txt
1.
pom.xml
dariread-classpath-resource-1.0-SNAPSHOT.jar
2.
ClassPathResourceReadTest.java
kelas diread-classpath-resource-1.0-SNAPSHOT.jar
yang memuat konten file sumber daya jalur kelas.3.
pom.xml
dariclient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
instantiateClassPathResourceReadTest.java
class where, ia akan memuatsample.txt
dan mencetak kontennya juga.5.Jalankan jar yang Dapat Dieksekusi sebagai berikut:
sumber
Jangan gunakan metode getClassLoader () dan gunakan "/" sebelum nama file. "/" sangat penting
sumber
/
memiliki efek yang persis sama dengan menggunakangetClassLoader()
metode.sumber
Anda harus meletakkan 'variabel sistem' Anda di classpath java.
sumber