Как прочитать файл из относительного пути в проекте Java?java.io.File не может найти указанный путь - PullRequest
103 голосов
/ 02 октября 2010

У меня есть проект с 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

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

Ответы [ 10 ]

148 голосов
/ 02 октября 2010

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

39 голосов
/ 22 мая 2013

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

File file = new File("./properties/files/ListStopWords.txt");  
24 голосов
/ 11 ноября 2016

Относительный путь работает в Java, используя.оператор.

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

Так что вопрос в том, как узнать, где находится Javaв настоящее время ищите?

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

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

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

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

G: \ JAVA8Ws \ MyProject \ content.

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

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

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

7 голосов
/ 02 октября 2010
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();
}
6 голосов
/ 02 октября 2010

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

4 голосов
/ 15 ноября 2013

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

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());
3 голосов
/ 22 февраля 2019

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

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

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

    ./test/conf/appProperties/keystore 
0 голосов
/ 07 апреля 2017

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

Object obj  = parser.parse(new FileReader("./src/command.json"));
0 голосов
/ 19 марта 2017

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

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

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

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
0 голосов
/ 28 мая 2013

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

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

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...