Jak odczytać plik ze ścieżki względnej w projekcie Java? java.io.File nie może znaleźć określonej ścieżki


113

Mam projekt z 2 pakietami:

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

W pakiecie (2) mam plik tekstowy ListStopWords.txt, w pakiecie (1) mam klasę FileLoadder. Oto kod w FileLoader:

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

Ale mam ten błąd:

The system cannot find the path specified

Czy możesz podać rozwiązanie, aby to naprawić? Dzięki.


12
Oba przykłady pakietów są takie same. Czy nie oznacza to properties.filesdla 2?
BalusC

Odpowiedzi:


173

Jeśli jest już w ścieżce klas, po prostu pobierz ją ze ścieżki klasy zamiast z dysku systemowego. Nie majstrować przy ścieżkach względnych java.io.File. Są one zależne od bieżącego katalogu roboczego, nad którym nie masz całkowitej kontroli z wnętrza kodu Java.

Zakładając, że ListStopWords.txtznajduje się w tym samym pakiecie co twoja FileLoaderklasa, wykonaj:

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

Lub jeśli wszystko, czego ostatecznie szukasz, jest w rzeczywistości InputStreamtym:

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

Jest to z pewnością preferowane w stosunku do tworzenia pliku, new File()ponieważ urlniekoniecznie musi reprezentować ścieżkę systemu plików na dysku, ale może również reprezentować ścieżkę wirtualnego systemu plików (co może się zdarzyć, gdy plik JAR zostanie rozszerzony do pamięci zamiast do folderu tymczasowego w systemie plików na dysku) lub nawet ścieżka sieciowa, która nie jest z definicji przyswajalna przez Filekonstruktora.

Jeśli plik to -jak wskazówka dotycząca nazwy pakietu- jest w rzeczywistości pełnowartościowym plikiem właściwości (zawierającym key=valuewiersze) z tylko „złym” rozszerzeniem, to możesz podaćInputStream natychmiast do load()metody.

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

Uwaga: kiedy próbujesz uzyskać do niego dostęp z statickontekstu wewnętrznego , użyj FileLoader.class(lub cokolwiek YourClass.class) zamiast getClass()w powyższych przykładach.


Czy FileLoader został usunięty z javy? Próbuję to zrobić z kontekstu statycznego (java 6) i nie mogę znaleźć sposobu, aby go zaimportować, a on ciągle mówi mi, że nie może rozwiązać tego typu. O dziwo, automatycznie uzupełnił się, gdy go wpisałem, ale potem zaczął wyświetlać błąd.
turbo

2
och, to ma być ClassLoader.class.
turbo

4
@turbo: FileLoaderto własna klasa OP. To powinna być dokładnie ta klasa, w której próbujesz zdobyć zasób. Tak więc NameOfYourCurrentClass.class.getResourceAsStream(...). Operacja ClassLoader.classzakończy się niepowodzeniem, jeśli ClassLoaderklasa jest ładowana przez inny program ładujący klasy, co może się zdarzyć w aplikacji „korporacyjnej” z hierarchią wielu programów ładujących klasy (np. W aplikacji internetowej Java EE).
BalusC

Ohh widzę. Nie rozumiałem, że to zależne. Dzięki za wyjaśnienie tego!
turbo

10
Jakieś sugestie, jeśli plik nie znajduje się w tym samym pakiecie? W moim przypadku próbuję otworzyć plik, który znajduje się w pakiecie testowym.
Robin Newhouse,

44

Poniższego wiersza można użyć, jeśli chcemy określić względną ścieżkę do pliku.

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

3
czy mogę wiedzieć, dlaczego 3 cięcia między ścieżką.
MSNaidu

Błąd:> Niedozwolony znak zmiany znaczenia w literale ciągu.
Igor Ganapolsky

Jak przekonwertować to na plik InputStream?
IgorGanapolsky

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

42

Ścieżka względna działa w java przy użyciu rozszerzenia. operator.

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

Pytanie brzmi więc, skąd znasz ścieżkę, w której obecnie szuka Java?

zrób mały eksperyment

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

Obserwuj dane wyjściowe, aby poznać bieżący katalog, w którym szuka java. Stamtąd po prostu użyj operatora ./, aby zlokalizować plik.

na przykład jeśli dane wyjściowe to

G: \ JAVA8Ws \ MyProject \ content.

a plik znajduje się w folderze MyProject, którego po prostu użyj

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

Mam nadzieję że to pomoże


po godzinach poszukiwań tej odpowiedzi
dostałem

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 to nazwa Class. Możesz odwołać się do .classdosłownego tylko podając pełną nazwę jego klasy.
Tomasz Mularczyk

Myślę, że ma to być FileLoader.
jamesdeath123


5

Mógłbym to skomentować, ale mam za to mniejszą reputację. Odpowiedź Samrata wykonała pracę za mnie. Lepiej jest zobaczyć bieżącą ścieżkę katalogu za pomocą następującego kodu.

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

Po prostu użyłem go do naprawienia problemu, z którym miałem do czynienia w moim projekcie. Upewnij się, że używasz ./, aby wrócić do katalogu nadrzędnego bieżącego katalogu.

    ./test/conf/appProperties/keystore 

Uruchamiam kod za pośrednictwem tomcat, więc bieżący katalog nie jest folderem projektu - jak zdefiniować ścieżkę względną do katalogu głównego projektu? Obecnie używam ścieżki twardej: „C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log”;
Tiago Redaelli

@TiagoRedaelli sprawdź te pytania: stackoverflow.com/questions/12843217/…
dezible

4

Chociaż odpowiedź udzielona przez BalusC działa w tym przypadku, zepsuje się, gdy ścieżka pliku zawiera spacje, ponieważ w adresie URL są one konwertowane na% 20, który nie jest prawidłową nazwą pliku. Jeśli skonstruujesz obiekt File przy użyciu identyfikatora URI, a nie String, białe znaki będą obsługiwane poprawnie:

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

2

Chciałem przeanalizować „command.json” w src / main // js / Simulator.java. W tym celu skopiowałem plik json do folderu src i podałem ścieżkę bezwzględną w ten sposób:

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

2

wprowadź opis obrazu tutaj

Zakładając, że chcesz czytać z resourceskatalogu w FileSystemklasie.

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

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

Uwaga: prowadzenie .nie jest potrzebne.


1

Dla mnie problem polega na tym, że ścieżka klasy obiektu File pochodzi z <project folder path> or ./src, więc użyj File file = new File("./src/xxx.txt");rozwiązał mój problem


0

String basePath = new File ("myFile.txt"). GetAbsolutePath (); ta ścieżka bazowa, której możesz użyć jako poprawnej ścieżki do pliku


-1

Jeśli próbujesz wywołać getClass()metodę statyczną lub blok statyczny, możesz wykonać następujące czynności.

Można zadzwonić getClass()na Propertiesobiekcie ładowanego do.

public static Properties pathProperties = null;

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

Po prostu brakuje cytatu zamykającego.
jamesdeath123

-1

Jeśli plik tekstowy nie jest odczytywany, spróbuj użyć 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łóżmy, że ścieżka bezwzględna to:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.