Java projesinde dosya göreceli yoldan nasıl okunur? java.io.File belirtilen yolu bulamıyor


113

2 paketli bir projem var:

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

Paket (2) 'de bir metin dosyam var ListStopWords.txt, (1) paketinde bir sınıfım var FileLoadder. İşte kod FileLoader:

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

Ama şu hatayı al:

The system cannot find the path specified

Düzeltmek için bir çözüm verebilir misin? Teşekkürler.


12
Her iki paket örneğiniz aynı. Şunu yapmayın properties.filesiçin 2?
BalusC

Yanıtlar:


173

Zaten sınıf yolundaysa, disk dosya sistemi yerine sınıf yolundan alın. Göreceli yollarla oynamayın java.io.File. Java kodunun içinden üzerinde hiçbir kontrolünüz olmayan mevcut çalışma dizinine bağlıdırlar.

Bunun sınıfınızla ListStopWords.txtaynı pakette olduğunu varsayarsak, FileLoaderşunları yapın:

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

Veya nihayetinde peşinde olduğunuz tek şey aslında InputStreambunun bir parçasıysa:

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

Bu kesinlikle bir disk dosya sistemi yolunu temsil etmeyebileceği new File()için url, bir disk dosya sistemi yolunu temsil etmeyebilir, ancak sanal dosya sistemi yolunu da temsil edebilir (JAR, disk dosya sistemindeki geçici bir klasör yerine belleğe genişletildiğinde gerçekleşebilir) hatta her ikisi de Fileyapıcı tarafından tanım başına sindirilemeyen bir ağ yolu .

Dosya, paket adı ipucu olarak, aslında sadece "yanlış" uzantıya sahip tam değerli bir özellikler dosyasıysa ( key=valuesatırları içeren ), o zaman yöntemi InputStreamhemen besleyebilirsiniz load().

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

Not: içinden erişime onu çalışırken staticbağlamda, daha sonra kullanmak FileLoader.class(ya da her türlü YourClass.classyerine) getClass()örneklerde yukarıda.


FileLoader java'dan kaldırıldı mı? Bunu statik bir bağlamdan (java 6) yapmaya çalışıyorum ve bunu içe aktarmanın bir yolunu bulamıyorum ve sürekli bir türe çözümleyemeyeceğini söylüyor. Garip bir şekilde, yazarken otomatik olarak tamamlandı, ancak sonra bana bir hata vermeye başladı.
turbo

2
oh, ClassLoader.class olması gerekiyor.
turbo

4
@turbo: FileLoaderOP'nin kendi özel sınıfıdır. Kaynağı elde etmeye çalıştığınız sınıfın tam olarak bu sınıf olması gerekiyor. Böylece öyle NameOfYourCurrentClass.class.getResourceAsStream(...). ClassLoader.classEğer başarısız olur ClassLoadersınıfı (Java EE web uygulaması gibi) birden classloaders hiyerarşisine sahip bir "kurumsal" uygulamasında ortaya çıkabilir, farklı bir classloader tarafından yükleniyor.
BalusC

Ohh, anlıyorum. Bağımlı olduğunu anlamadım. Bunu açıklığa kavuşturduğunuz için teşekkürler!
turbo

10
Dosya aynı pakette değilse herhangi bir öneriniz var mı? Benim örneğimde, bir test paketinde bulunan bir dosyayı açmaya çalışıyorum.
Robin Newhouse

44

Dosyanın göreceli yolunu belirtmek istersek aşağıdaki satır kullanılabilir.

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

3
yol arasında neden 3 eğik çizgi olduğunu öğrenebilir miyim?
MSNaidu

Hata:> Dize değişmezinde geçersiz kaçış karakteri.
IgorGanapolsky

Bunu bir'ye nasıl çevirebilirim InputStream?
IgorGanapolsky

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

42

Göreli yol java'da. Şebeke.

  • . şu anda çalışan içerikle aynı klasör anlamına gelir.
  • .. o anda çalışan bağlamın üst klasörü anlamına gelir.

Öyleyse soru, javanın şu anda baktığı yolu nasıl biliyorsunuz?

küçük bir deney yap

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

Çıktıyı gözlemleyin, java'nın aradığı mevcut dizini öğreneceksiniz. Buradan, dosyanızı bulmak için ./ operatörünü kullanın.

örneğin çıktı ise

G: \ JAVA8Ws \ Projem \ içeriği.

ve dosyanız MyProject'in kullandığı klasörde mevcuttur

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

Bu yardımcı olur umarım


saatlerce aradıktan sonra bu cevabı bana çözümü sağladı
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, Sınıfın adıdır. .classDeğişmez ifadeye yalnızca sınıfının tam adını vererek başvurabilirsiniz .
Tomasz Mularczyk

FileLoader olmayı amaçladığını düşünüyorum.
jamesdeath123


5

Yorum yapabilirdim ama bunun için daha az itibarım var. Samrat'ın cevabı işi benim için yaptı. Geçerli dizin yolunu aşağıdaki kod aracılığıyla görmek daha iyidir.

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

Bunu projemde karşılaştığım bir sorunu düzeltmek için kullandım. Geçerli dizinin üst dizinine dönmek için ./ kullandığınızdan emin olun.

    ./test/conf/appProperties/keystore 

Kodumu tomcat üzerinden çalıştırıyorum ve bu nedenle mevcut dizin proje klasörü değil - Proje köküne giden göreceli yolu nasıl tanımlarım? Şu anda sabit yolu kullanıyorum: "C: \\ Kullanıcılar \\ kullanıcı \\ Masaüstü \\ Depolar \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli

@TiagoRedaelli şu soruları kontrol edin: stackoverflow.com/questions/12843217/…
dezible

4

BalusC tarafından verilen cevap bu durumda işe yarasa da, dosya yolu boşluklar içerdiğinde kırılacaktır çünkü bir URL'de bunlar geçerli bir dosya adı olmayan% 20'ye dönüştürülmektedir. File nesnesini bir String yerine URI kullanarak oluşturursanız, boşluklar doğru şekilde işlenir:

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

2

Src / main // js / Simulator.java içinde 'command.json'u ayrıştırmak istedim. Bunun için json dosyasını src klasörüne kopyaladım ve şu şekilde mutlak yolu verdim:

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

2

görüntü açıklamasını buraya girin

Okumak için kullanmak istediğiniz varsayarsak resourcesdizine FileSystemsınıfında.

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

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

Not: Satır aralığı .gerekli değildir.


1

Benim için aslında sorun, File nesnesinin sınıf yolunun gelmesidir <project folder path> or ./src, bu yüzden File file = new File("./src/xxx.txt");benim sorunumu çözdüm


0

String basePath = new File ("myFile.txt"). GetAbsolutePath (); Dosyanızın doğru yolu olarak kullanabileceğiniz bu temel yol


-1

getClass()Statik yöntemden veya statik bloktan çağırmaya çalışıyorsanız , aşağıdaki yolu yapabilirsiniz.

Sen diyebilirsin getClass()üzerine Propertiesiçine yüklüyorsunuz nesne.

public static Properties pathProperties = null;

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

Sadece bir kapanış teklifini kaçırmak.
jamesdeath123

-1

Metin dosyası okunmuyorsa, aşağıdaki gibi daha yakın bir mutlak yol kullanmayı deneyin (dilerseniz tam mutlak yol kullanabilirsiniz):

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

mutlak yolun şu olduğunu varsayalım:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.