Bagaimana cara membaca file dari jalur relatif dalam proyek Java? java.io.File tidak dapat menemukan jalur yang ditentukan


113

Saya memiliki proyek dengan 2 paket:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

Dalam paket (2) saya memiliki file teks ListStopWords.txt, dalam paket (1) saya memiliki kelas FileLoadder. Ini kodenya FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

Tetapi ada kesalahan ini:

The system cannot find the path specified

Bisakah Anda memberikan solusi untuk memperbaikinya? Terima kasih.


12
Kedua contoh paket Anda sama. Apakah Anda tidak bermaksud properties.filesuntuk 2?
BalusC

Jawaban:


173

Jika sudah ada di classpath, dapatkan saja dari classpath alih-alih dari sistem file disk. Jangan mengutak-atik jalur relatif masuk java.io.File. Mereka bergantung pada direktori kerja saat ini yang sama sekali tidak dapat Anda kendalikan dari dalam kode Java.

Dengan asumsi itu ListStopWords.txtada dalam paket yang sama dengan FileLoaderkelas Anda , maka lakukan:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

Atau jika semua yang Anda kejar sebenarnya adalah salah InputStreamsatunya:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Ini tentu lebih disukai daripada membuat new File()karena urlmungkin tidak selalu mewakili jalur sistem file disk, tetapi ini juga bisa mewakili jalur sistem file virtual (yang mungkin terjadi saat JAR diperluas ke memori alih-alih ke folder temp pada sistem file disk) atau bahkan jalur jaringan yang keduanya tidak sesuai definisi yang dapat dicerna oleh Filekonstruktor.

Jika file tersebut -seperti petunjuk nama paket- sebenarnya adalah file properti yang layak penuh (berisi key=valuebaris) dengan ekstensi yang "salah", maka Anda dapat InputStreamlangsung memasukkannya ke load()metode.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Catatan: saat Anda mencoba mengaksesnya dari dalam statickonteks, gunakan FileLoader.class(atau apa pun YourClass.class) alih-alih getClass()contoh di atas.


Apakah FileLoader dihapus dari java? Saya mencoba melakukan ini dari konteks statis (java 6) dan saya tidak dapat menemukan cara untuk mengimpornya dan terus memberi tahu saya bahwa itu tidak dapat menyelesaikan suatu jenis. Anehnya, itu selesai otomatis saat saya mengetiknya, tetapi kemudian terus memberi saya kesalahan.
turbo

2
oh, seharusnya ClassLoader.class.
turbo

4
@ turbo: FileLoaderadalah kelas khusus OP sendiri. Ini seharusnya menjadi kelas yang tepat di mana Anda mencoba untuk mendapatkan sumber daya. Jadi begitu NameOfYourCurrentClass.class.getResourceAsStream(...). The ClassLoader.classakan gagal jika ClassLoaderkelas yang dimuat oleh classloader yang berbeda, yang mungkin terjadi dalam sebuah "perusahaan" aplikasi dengan hirarki beberapa classloaders (seperti aplikasi web Java EE).
BalusC

Ohh begitu. Saya tidak mengerti bahwa itu tergantung. Terima kasih telah menyelesaikannya!
turbo

10
Adakah saran jika file tidak dalam paket yang sama? Dalam contoh saya, saya mencoba membuka file yang terletak di paket pengujian.
Robin Newhouse

44

Baris berikut dapat digunakan jika kita ingin menentukan path relatif dari file tersebut.

File file = new File("./properties/files/ListStopWords.txt");  

3
bolehkah saya tahu mengapa 3 garis miring di antara jalan.
MSNaidu

Kesalahan:> Karakter pelolosan ilegal dalam string literal.
IgorGanapolsky

Bagaimana cara mengubahnya menjadi InputStream?
IgorGanapolsky

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Cameron Hudson

42

Jalur relatif bekerja di java menggunakan. operator.

  • . berarti folder yang sama dengan konteks yang sedang berjalan.
  • .. Berarti folder induk dari konteks yang sedang berjalan.

Jadi pertanyaannya adalah bagaimana Anda mengetahui jalur di mana java saat ini mencari?

lakukan percobaan kecil

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Amati hasilnya, Anda akan mengetahui direktori saat ini di mana java mencari. Dari sana, cukup gunakan operator ./ untuk mencari file Anda.

misalnya jika outputnya

G: \ JAVA8Ws \ MyProject \ content.

dan file Anda ada di folder MyProject cukup gunakan

File resourceFile = new File("../myFile.txt");

Semoga ini membantu


setelah berjam-jam mencari jawaban ini memberi saya solusi
erdostamasa

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolsky itu nama Kelas. Anda dapat merujuk ke .classliteral hanya dengan memberikan nama lengkap kelasnya.
Tomasz Mularczyk

Saya pikir itu bermaksud menjadi FileLoader.
jamesdeath123

6

mencoba .\properties\files\ListStopWords.txt


5

Saya bisa saja berkomentar tetapi saya kurang memiliki reputasi untuk itu. Jawaban Samrat berhasil untuk saya. Lebih baik melihat jalur direktori saat ini melalui kode berikut.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

Saya hanya menggunakannya untuk memperbaiki masalah yang saya hadapi dalam proyek saya. Pastikan untuk menggunakan ./ untuk kembali ke direktori induk dari direktori saat ini.

    ./test/conf/appProperties/keystore 

Saya menjalankan kode saya melalui tomcat dan direktori saat ini bukan folder proyek - Bagaimana cara menentukan jalur relatif ke akar proyek? Saat ini saya menggunakan jalur yang sulit: "C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli

@TiagoRedaelli lihat pertanyaan ini: stackoverflow.com/questions/12843217/…
dezible

4

Sementara jawaban yang diberikan oleh BalusC berfungsi untuk kasus ini, itu akan rusak ketika jalur file berisi spasi karena di URL, ini sedang diubah menjadi% 20 yang bukan nama file yang valid. Jika Anda membuat objek File menggunakan URI daripada String, spasi putih akan ditangani dengan benar:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

Saya ingin mengurai 'command.json' di dalam src / main // js / Simulator.java. Untuk itu saya menyalin file json di folder src dan memberikan jalur absolut seperti ini:

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

masukkan deskripsi gambar di sini

Dengan asumsi Anda ingin membaca dari resourcesdirektori di FileSystemkelas.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

Catatan: Memimpin .tidak dibutuhkan.


1

Bagi saya sebenarnya masalahnya adalah dari jalur kelas objek File <project folder path> or ./src, jadi gunakan File file = new File("./src/xxx.txt");memecahkan masalah saya


0

String basePath = File baru ("myFile.txt"). GetAbsolutePath (); basepath ini dapat Anda gunakan sebagai jalur yang benar dari file Anda


-1

Jika Anda mencoba memanggil getClass()dari metode Statis atau blok statis, Anda dapat melakukan cara berikut.

Anda dapat menghubungi getClass()pada Propertiesobjek yang memuat ke dalam.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

Cukup melewatkan kutipan penutup.
jamesdeath123

-1

Jika file teks tidak sedang dibaca, coba gunakan jalur absolut yang lebih dekat (jika Anda ingin dapat menggunakan jalur absolut lengkap) seperti ini:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

asumsikan bahwa jalur absolut adalah:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.