2010-10-02 17 views
83

Mam projekt z 2 pakietów:Jak odczytać plik ze ścieżki względnej w projekcie Java? java.io.File nie może odnaleźć określonej ścieżki

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

W opakowaniu (2) Mam plik tekstowy ListStopWords.txt, w pakiet (1) Mam klasę FileLoadder. Oto kod w FileLoader:

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

Ale ten błąd:

The system cannot find the path specified 

można dać rozwiązanie to naprawić? Dzięki.

+5

Twoje oba przykłady pakietów są takie same. Czy nie masz na myśli 'properties.files' dla' 2'? – BalusC

Odpowiedz

119

Jeśli jest już w ścieżce klasy, a potem po prostu uzyskać go od ścieżki klasy. Nie rób skrzynek ze względnymi ścieżkami w java.io.File. Są zależne od bieżącego katalogu roboczego, nad którym całkowicie nie ma kontroli wewnątrz kodu Java.

Zakładając, że ListStopWords.txt jest w tym samym opakowaniu jako FileLoader Klasa:

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

Lub jeśli wszystko jesteś po to InputStream z nim:

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

Jeśli plik jest -as podpowiedzi do nazw pakietów - to w rzeczywistości pełna wersja properties file (zawierająca linie key=value) z tylko "niewłaściwym" rozszerzeniem, wtedy możesz podać je edi do metody load().

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

Uwaga: kiedy próbujesz uzyskać do niego dostęp od wewnątrz static kontekście, a następnie użyć FileLoader.class zamiast getClass() w powyższych przykładach.

+0

Czy FileLoader został usunięty z języka Java? Próbuję zrobić to ze statycznego kontekstu (java 6) i nie mogę znaleźć żadnego sposobu na zaimportowanie go i ciągle mówi mi, że nie może go rozwiązać. Co dziwne, autouzupełnianie zostało wpisane podczas pisania, ale potem popełniłem błąd. – turbo

+1

oh, to powinno być ClassLoader.class. – turbo

+4

@turbo: 'FileLoader' jest własną niestandardową klasą OP. To powinna być dokładnie ta klasa, w której próbujesz zdobyć zasób. Tak więc, tak 'NameOfYourCurrentClass.class.getResourceAsStream (...)'. Klasa "ClassLoader.class" zakończy się niepowodzeniem, jeśli klasa 'ClassLoader' jest ładowana przez inny moduł ładujący klasy, co może się zdarzyć w aplikacji" enterprise "z hierarchią wielu programów ładujących klasy (jak aplikacja internetowa Java EE). – BalusC

3

spróbować .\properties\files\ListStopWords.txt

4
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) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+1

Co do cholery jest FileLoadder ??? –

+1

@IgorGanapolsky to nazwa klasy. Możesz odwoływać się do literału ".class" tylko podając pełną nazwę jego klasy. – Tomasz

+0

Myślę, że zamierza być FileLoader. – jamesdeath123

26

Poniższy wiersz może być użyty, jeśli chcemy podać względną ścieżkę pliku.

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

Czy mogę wiedzieć, dlaczego 3 ukośniki między ścieżkami. –

+0

Błąd:> Niedozwolony znak escape w literale łańcuchowym. –

+0

Jak przekonwertować to do 'InputStream'? –

-1

Jeśli próbujesz zadzwonić getClass() z metodą statyczną lub statycznego bloku można zrobić w następujący sposób.

Możesz zadzwonić pod numer getClass() na obiekcie, który ładujesz do obiektu Properties.

public static Properties pathProperties = null; 

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

Po prostu brakuje wyceny zamykającej. – jamesdeath123

2

ile odpowiedź udzielana przez BalusC działa w tym przypadku, będzie przerwa, gdy ścieżka pliku zawiera spacje, ponieważ w adresie URL, te są konwertowane do 20%, co nie jest poprawną nazwą pliku. Jeśli skonstruowania obiektu File za pomocą URI zamiast String, odstępy będą obsługiwane prawidłowo:

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

Względna ścieżka działa w Java z wykorzystaniem. operator.

  • . oznacza ten sam folder, co aktualnie uruchomiony kontekst.
  • .. oznacza folder nadrzędny aktualnie uruchomionego kontekstu.

Pytanie brzmi, skąd znasz ścieżkę, na której obecnie szuka java?

zrobić mały eksperyment

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

Przestrzegać wyjście, będzie pochodzić wiedzieć bieżący katalog gdzie Java nie patrzy. Stamtąd wystarczy użyć operatora ./, aby zlokalizować plik.

na przykład, jeśli wyjście jest

G:\JAVA8Ws\MyProject\content.

i plik jest obecny w MyProject folderu wystarczy użyć

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

nadzieję, że to pomaga

-1

Jeśli plik tekstowy nie jest odczytywany, spróbuj użyć bardziej bliższej ścieżki bezwzględnej (jeśli chcesz możesz użyć pełnej ścieżki bezwzględnej,) w następujący sposób:

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

założyć, że bezwzględna ścieżka to:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt 
0

Chciałem przeanalizować 'command.json' wewnątrz src/main // js/Simulator.java. W tym celu skopiowałem plik json do folderu src i podałem bezwzględną ścieżkę:

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