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

У меня есть проект с двумя пакетами:

  • tkorg.idrs.core.searchengines
  • 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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

G:.\JAVA8Ws\MyProject\Содержание

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

    ./test/conf/appProperties/keystore 

Ответ 8

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

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

Ответ 9

enter image description here

Предполагая, что вы хотите читать из каталога 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));

Примечание: Ведущий . не нужен.

Ответ 10

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

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

public static Properties pathProperties = null;

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

Ответ 11

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

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

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

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt