Saya memiliki satu set file yang dilampirkan ke proyek saya sebagai sumber daya. File-file ini berisi data yang dibaca dan diproses oleh program. Begitulah cara saya melakukannya:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();       
InputStream inputStream = classLoader.getResourceAsStream(filename);            
packageParameters = IOUtils.toString(inputStream, "UTF-8");                     
inputStream.close();    

Dan semuanya baik-baik saja sampai saya mencoba membaca file dengan nama tertentu seperti:

\sets\Тех. тип = 0 Сет. = 1 Комплект 1.qr

getResourceAsStream mengembalikan null yang berarti tidak dapat menemukan sumber daya ini.

Jadi, pertanyaannya adalah: bagaimana saya bisa membaca file seperti itu yang mengandung simbol cyrillic, spasi, dan simbol khusus dalam nama? Mencoba menyandikan nama - tidak membantu. Tidak dapat mengonversinya menjadi URI karena konstruktor memberikan pengecualian untuk simbol ilegal.

Setiap ide dihargai. Menghabiskan beberapa hari menganalisis jawaban yang serupa - masih tidak tahu bagaimana menyelesaikannya.

0
Konstantin Dobroliubov 26 Juli 2016, 12:40
1
Terima kasih, Nikolay, telah memperbarui pertanyaannya!
 – 
Konstantin Dobroliubov
26 Juli 2016, 12:45
Apakah Anda memiliki kendali atas penamaan file?
 – 
injecteer
26 Juli 2016, 12:47
Tidak, saya tidak memiliki pengaruh pada cara bagaimana nama file dihasilkan. Saya juga berpikir untuk mengganti nama mereka. Tetapi untuk mengganti nama mereka dalam sebuah program, saya harus dapat menemukannya sebagai sumber daya, dan itulah yang saya coba lakukan :)
 – 
Konstantin Dobroliubov
26 Juli 2016, 12:50
Apakah file-file itu terletak di dalam toples atau dalam volume biasa?
 – 
injecteer
26 Juli 2016, 12:51
1
Coba keluarkan hasil new File( pathToResDir ).list() untuk melihat seperti apa file tersebut. Juga garis miring terbalik Anda mencurigakan
 – 
injecteer
26 Juli 2016, 13:05

1 menjawab

Jawaban Terbaik

Cobalah untuk menghapus garis miring dan ganti \ dengan /.

Saya menempatkan file Тех. тип = 0 Сет. = 1 Комплект 1.qr di src\main\resources\sets dengan konten

123

Dan ini bekerja untuk saya

import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;

public class Application {
    public static void main(String[] args) throws IOException {
        String filename = "sets/Тех. тип = 0 Сет. = 1 Комплект 1.qr";
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream(filename);
        String packageParameters = IOUtils.toString(inputStream, "UTF-8");
        inputStream.close();
        System.out.println(packageParameters); // prints 123
    }
}

Sumber kelas ini terletak di src\main\java\Application.java. Semua jalur relatif terhadap direktori root suatu proyek.

2
NikolayK 26 Juli 2016, 13:03
Terima kasih atas jawabannya. Sudah mencoba dengan berbagai jenis garis miring, termasuk metode yang disarankan oleh Anda. Lakukan sekali lagi - kode ini berhasil memproses file biasa tetapi InputStream masih nol untuk file spesifik saya. Lupa menyebutkan bahwa saya menggunakan mesin Windows untuk menjalankan aplikasi, itu bisa menjadi alasan mengapa ia bekerja secara berbeda di pihak Anda (saya kira Anda menggunakan Mac atau Linux, bukan?)
 – 
Konstantin Dobroliubov
26 Juli 2016, 13:14
Tidak, saya menggunakan Windows. Juga di ClassLoader referensi menyatakan bahwa Nama sumber daya adalah '/'-nama jalur terpisah yang mengidentifikasi sumber daya. Mungkin ada hubungannya dengan direktori? Atau bahkan nama file yang salah di dalam program, spasi sebelum atau sesudah misalnya?
 – 
NikolayK
26 Juli 2016, 13:21
Menandai jawaban sebagai valid karena benar-benar berfungsi. Namun, masalahnya adalah cara saya memproses nama file. Itu terpotong sebagai akibat dari operasi konversi yang salah. Terima kasih semuanya! Anda melakukan hari saya.
 – 
Konstantin Dobroliubov
26 Juli 2016, 13:25