Как прочитать файл по относительному пути в проекте Java? java.io.File не может найти указанный путь

113

У меня есть проект с 2 пакетами:

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

В пакете (2) у меня есть текстовый файл ListStopWords.txt, в пакете (1) есть класс FileLoadder. Вот код в FileLoader:

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

Но есть эта ошибка:

The system cannot find the path specified

Можете дать решение исправить? Спасибо.

Tiendv
источник
12
Оба примера пакетов одинаковы. Не значит properties.filesдля 2?
BalusC 02

Ответы:

173

Если он уже находится в пути к классам, просто получите его из пути к классам, а не из файловой системы диска. Не возитесь с относительными путями java.io.File. Они зависят от текущего рабочего каталога, которым вы не можете управлять изнутри кода Java.

Предполагая, что он ListStopWords.txtнаходится в том же пакете, что и ваш FileLoaderкласс, выполните:

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

Или, если все, что вам нужно, на самом деле является одним InputStreamиз них:

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

Это, безусловно, предпочтительнее, чем создание, new File()потому что он urlможет не обязательно представлять путь к файловой системе диска, но он также может представлять путь к виртуальной файловой системе (что может произойти, когда JAR расширяется в память, а не во временную папку в файловой системе диска) или даже сетевой путь, которые по определению не могут быть усвоены Fileконструктором.

Если файл - как подсказывает имя пакета - на самом деле является файлом полноценных свойств (содержащим key=valueстроки) только с «неправильным» расширением, то вы можете InputStreamнемедленно передать его load()методу.

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

Примечание: когда вы пытаетесь получить к нему доступ из внутреннего staticконтекста, используйте FileLoader.class(или что-то еще YourClass.class) вместо getClass()приведенных выше примеров.

BalusC
источник
Был ли FileLoader удален из Java? Я пытаюсь сделать это из статического контекста (java 6), и я не могу найти способ его импортировать, и он продолжает говорить мне, что не может разрешить тип. Как ни странно, он автозаполнялся, когда я его набирал, но затем продолжал выдавать мне ошибку.
турбо
2
о, это должен быть ClassLoader.class.
турбо
4
@turbo: FileLoaderэто собственный класс OP. Это должен быть именно тот класс, в котором вы пытаетесь получить ресурс. Итак, так NameOfYourCurrentClass.class.getResourceAsStream(...). Ошибка ClassLoader.classзавершится ошибкой, если ClassLoaderкласс загружается другим загрузчиком классов, что может произойти в «корпоративном» приложении с иерархией из нескольких загрузчиков классов (например, веб-приложение Java EE).
BalusC
Ох, я понял. Я не понимал, что это было зависимо. Спасибо, что прояснили это!
турбо
10
Любое предложение, если файл не находится в том же пакете? В моем случае я пытаюсь открыть файл, который находится в тестовом пакете.
Робин Ньюхаус
44

Следующая строка может использоваться, если мы хотим указать относительный путь к файлу.

File file = new File("./properties/files/ListStopWords.txt");  
Сантош
источник
3
могу ли я узнать, почему между путями 3 косой черты.
MSNaidu
Ошибка:> Недопустимый escape-символ в строковом литерале.
Игорь Ганапольский 01
Как преобразовать это в InputStream?
IgorGanapolsky
1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Кэмерон Хадсон
42

Относительный путь работает в java с использованием. оператор.

  • . означает ту же папку, что и текущий контекст.
  • .. означает родительскую папку текущего выполняемого контекста.

Итак, вопрос в том, как узнать путь, по которому сейчас ищет java?

провести небольшой эксперимент

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

Наблюдайте за выводом, вы узнаете текущий каталог, в котором ищет java. Оттуда просто используйте оператор ./, чтобы найти файл.

например, если вывод

G: \ JAVA8Ws \ MyProject \ content.

и ваш файл находится в папке MyProject, просто используйте

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

Надеюсь это поможет

Самрат
источник
после нескольких часов поиска этот ответ предоставил мне решение
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 - это имя класса. Вы можете ссылаться на .classлитерал, только указав полное имя его класса.
Tomasz Mularczyk
Думаю, это будет FileLoader.
jamesdeath123
6

пытаться .\properties\files\ListStopWords.txt

БУГ.
источник
5

Я мог бы прокомментировать, но у меня меньше репутации для этого. Ответ Самрата помог мне. Лучше увидеть текущий путь к каталогу с помощью следующего кода.

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

Я просто использовал его, чтобы исправить проблему, с которой я столкнулся в своем проекте. Обязательно используйте ./, чтобы вернуться в родительский каталог текущего каталога.

    ./test/conf/appProperties/keystore 
dezible
источник
Я запускаю свой код через tomcat, поэтому текущий каталог не является папкой проекта. Как мне определить относительный путь к корню проекта? В настоящее время я использую жесткий путь: «C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log»;
Тьяго
@TiagoRedaelli, посмотрите эти вопросы: stackoverflow.com/questions/12843217/…
dezible
4

Хотя ответ, предоставленный BalusC, работает в этом случае, он сломается, если путь к файлу содержит пробелы, потому что в URL-адресе они преобразуются в% 20, которое не является допустимым именем файла. Если вы создаете объект File, используя URI, а не String, пробелы будут обрабатываться правильно:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());
Марк Крайгсман
источник
2

Я хотел разобрать command.json внутри src / main // js / Simulator.java. Для этого я скопировал файл json в папку src и указал абсолютный путь следующим образом:

Object obj  = parser.parse(new FileReader("./src/command.json"));
Sver
источник
2

введите описание изображения здесь

Предполагая, что вы хотите читать из resourcesкаталога в FileSystemклассе.

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

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

Примечание: интерлиньяж .не нужен.

R вс
источник
1

Для меня на самом деле проблема в том, что путь к классу объекта File находится <project folder path> or ./src, поэтому использование File file = new File("./src/xxx.txt");решило мою проблему

Дж. Луан
источник
0

String basePath = новый файл ("myFile.txt"). GetAbsolutePath (); этот базовый путь вы можете использовать как правильный путь к вашему файлу

пользователь13499397
источник
-1

Если вы пытаетесь вызвать getClass()из статического метода или статического блока, вы можете сделать следующее.

Вы можете позвонить getClass()на Propertiesобъект , который вы загружаете в.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}
arun_kk
источник
Просто отсутствует заключительная цитата.
jamesdeath123
-1

Если текстовый файл не читается, попробуйте использовать более точный абсолютный путь (если хотите, вы можете использовать полный абсолютный путь), например:

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

предположим, что абсолютный путь:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
KR N
источник