Как читать файл из относительного пути в проекте 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