it-roy-ru.com

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

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

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

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

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

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

The system cannot find the path specified

Можете ли вы дать решение, чтобы это исправить? Благодарю.

96
tiendv

Если он уже находится в пути к классам, просто получите его из пути к классам. Не возиться с относительными путями в 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");

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

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

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

139
BalusC

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

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

Относительный путь работает в Java с помощью. оператор.

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

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

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

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

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

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

G:\Java8Ws\MyProject\содержание.

а твой файл присутствует в папке MyProject просто используй 

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

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

19
Samrat
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();
}
7
frictionlesspulley

попробуйте .\properties\files\ListStopWords.txt

5
bUg.

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

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

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

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

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

    ./test/conf/appProperties/keystore 
1
Aditya Bhardwaj

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

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