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.

tiendv
źródło
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.

BalusC
źródło
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");  
Santhosh
źródło
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

Samrat
źródło
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();
}
koło pasowe bez tarcia
źródło
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
6

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

pluskwa.
źródło
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 
dezible
źródło
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());
Mark Krijgsman
źródło
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"));
sver
źródło
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.

R Sun
źródło
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

J.Luan
źródło
0

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

user13499397
źródło
-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);
}
arun_kk
źródło
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
KR N
źródło