Java, читая файл из текущего каталога?

83

Мне нужна Java-программа, которая считывает указанное пользователем имя файла из текущего каталога (того же каталога, в котором запущен файл .class).

Другими словами, если пользователь указывает имя файла «myFile.txt», и этот файл уже находится в текущем каталоге:

reader = new BufferedReader(new FileReader("myFile.txt"));

не работает. Почему?

Запускаю в windows.

Саоби
источник
1
То

Ответы:

52

Текущий каталог не обязательно является каталогом, в котором находится файл .class. Это рабочий каталог процесса. (то есть: каталог, в котором вы были, когда запускали JVM)

Вы можете загружать файлы из того же каталога *, что и файл .class, с помощью getResourceAsStream () . Это даст вам InputStream, который вы можете преобразовать в Reader с помощью InputStreamReader .


* Обратите внимание, что этот «каталог» на самом деле может быть файлом jar, в зависимости от того, откуда был загружен класс.

Лоуренс Гонсалвес
источник
15
+1. Если вы используете IDE, например Eclipse или Idea, текущий каталог будет каталогом проекта, а не выходными данными компилятора.
Денис Тульский
2
@piiligrim, зависит от вашей конфигурации запуска
Торбьёрн Равн Андерсен
@DenisTulskiy Я работаю над Eclipse так же, как и человек из примера. Моя до сих пор не работает. Почему?
windsound
79

Пытаться

System.getProperty("user.dir")

Возвращает текущий рабочий каталог.

Йоонас Пулакка
источник
6
но он возвращает только путь до корневого каталога проекта. как мы можем получить путь к текущему пакету в основном методе java
Таймур Чангайз
35

Ни один из приведенных выше ответов не работает для меня. Вот что у меня работает.

Допустим, имя вашего класса - Foo.java, для доступа к myFile.txt в той же папке, что и Foo.java, используйте этот код:

URL path = Foo.class.getResource("myFile.txt");
File f = new File(path.getFile());
reader = new BufferedReader(new FileReader(f));
Тони Ву
источник
1
Нет доступа к файлу. Выдача исключения NullPointerException в path.getFile.
Avik Chowdhury
Это сработало для меня, спасибо. Я предлагаю вам написать первый код следующим образом: URL path = JAVA_FILE_NAME.class.getResource ("myFile.txt");
EX1T_ZER0
16

Файлы в вашем проекте доступны относительно вашей папки src. если вы знаете, в каком пакете или папке будет myfile.txt, скажите, что он находится в

----src
--------package1
------------myfile.txt
------------Prog.java

вы можете указать его путь как "src / package1 / myfile.txt" из Prog.java

катвекибы
источник
5

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

URL path = ClassLoader.getSystemResource("myFile.txt");
if(path==null) {
     //The file was not found, insert error handling here
}
File f = new File(path.toURI());

reader = new BufferedReader(new FileReader(f));
Джоэл Вестберг
источник
1

Попробуй это:

BufferedReader br = new BufferedReader(new FileReader("java_module_name/src/file_name.txt"));
Эшвин
источник
0

попробуйте использовать "." Например

File currentDirectory = new File(".");

Это сработало для меня

Чарли
источник