Не удается заставить сканер просмотреть файл

Я не могу понять, почему я не могу заставить сканер прочитать мой файл .txt. В конце концов я прибегнул к простому хранению данных в виде строки в своей программе. Но все же хотелось бы узнать, почему Сканер не видит этот файл.

Scanner scan = new Scanner(new File("Test.txt"));

Я также пробовал:

Scanner scan = new Scanner(new File("C:/Users/myusername/Desktop/Test.txt"));

Оба приводят к возникновению исключения FileNotFoundException.

Текстовый файл находится в том же каталоге, где находятся файлы классов и исходные файлы.

Кто-нибудь знает, что не так??

Хорошо, это действительно отстой. Я просто не знаю, почему это происходит. Я точно знаю, что файл существует.

System.out.println(System.getProperty("user.dir"));

показывает, что каталог, в котором я нахожусь, является правильным.

У кого-нибудь еще есть мысли?


person Oloff Biermann    schedule 06.10.2015    source источник
comment
Вы уверены, что файл действительно существует? Можешь открыть проводник и дамп в пути?   -  person Tim Biegeleisen    schedule 06.10.2015
comment
В первом случае файл должен находиться в текущем каталоге, не обязательно «в том же каталоге, где находятся файлы классов и исходные файлы». Во втором случае вы, должно быть, ошиблись в имени файла.   -  person user207421    schedule 06.10.2015
comment
Как правильно заметил @Tim, путь недействителен. Пути Windows должны содержать обратную косую черту   -  person    schedule 06.10.2015
comment
@ vikasn91 Нет, не знают. Я только что протестировал оба на IntelliJ, работающем в Windows, и они оба работают.   -  person Tim Biegeleisen    schedule 06.10.2015
comment
Укажите правильно путь к файлу, Scanner scan = new Scanner(new File("C:\\Users\\myusername\\Desktop\\Test.txt"));   -  person Vignesh Shiv    schedule 06.10.2015
comment
@Tim, пути Windows в eclipse нуждаются в escape-символе, если он работает в Linux   -  person    schedule 06.10.2015
comment
Но нет, если это прямая косая черта, только обратная косая черта. И если бы он использовал обратную косую черту без экранирования, его код даже не скомпилировался бы, что дало бы ему другую ошибку, чем та, которую он разместил здесь.   -  person Tim Biegeleisen    schedule 06.10.2015
comment
Я считаю, что все системы Windows, начиная с Windows 2000, допускали прямую косую черту в именах файлов (как и Windows NT) и относились к ним так же, как к обратной косой черте. (В командной строке DOS они не всегда работают, потому что синтаксический анализатор командной строки может интерпретировать / как начало параметра. Но функция, которая ищет файлы, не использует синтаксический анализатор командной строки.)   -  person ajb    schedule 06.10.2015
comment
@ajb Java поддерживает косую черту в именах файлов на всех платформах как минимум с 1997 года.   -  person user207421    schedule 06.10.2015


Ответы (3)


Устраните проблему, исключив сканер и начните только с файла:

File myFile = new File("Test.txt");
myFile.exists();
myFile.canRead();
...

Затем продолжите анализ пути к файлу:

myFile().getCanonicalPath();
...

У сканера не возникнет проблем, если java-процесс сможет получить доступ к файлу.

Если это ни к чему не приведет, нам понадобится дополнительная информация: какая версия java? Как вы запускаете процесс Java?

person Torgeist    schedule 06.10.2015
comment
Какой смысл вызывать логические методы и игнорировать их возвращаемые значения? - person user207421; 06.10.2015
comment
Это были только подсказки для Дж'Зарго, что делать, чтобы отследить проблему - должно было быть достаточно очевидно (и, по сути, было для Дж'Зарго...) - person Torgeist; 06.10.2015
comment
Вы не ответили на вопрос, который я задал. Это не дает ответа на вопрос. Это должно было быть опубликовано как комментарий. - person user207421; 06.10.2015

Проверьте, является ли файл, к которому вы пытаетесь получить доступ, read-only или нет. Если это read-only, снимите флажок. Или вы также можете попробовать это:

FileInputStream fis=new FileInputStream(new File("C:/Users/myusername/Desktop/Test.txt"));
Scanner scan=new Scanner(fis);
person jcool    schedule 06.10.2015
comment
Для простого текстового файла я не думаю, что разрешения будут проблемой, если он явно не возится с ними. Кстати, я не минусовал тебя, это был @EJP. - person Tim Biegeleisen; 06.10.2015
comment
Почему? Он только пытается читать оттуда. Почему разрешение только для чтения не позволяет читать? Предложенное вами изменение кода также не будет иметь никакого значения. - person user207421; 06.10.2015
comment
Иногда это может вызвать исключение при чтении также см. здесь - person jcool; 06.10.2015
comment
@jcool Чтение из файла только для чтения не вызывает исключений. Если бы атрибут только для чтения был проблемой, он бы выдал исключение при открытии, а не при чтении. new Scanner(File) выдаст точно такой же FileNotFoundException, что и ваш код. Внутри он делает что-то похожее на код, который вы разместили. Улучшения нет. - person user207421; 06.10.2015
comment
@TimBiegeleisen У вас ровно ноль информации о том, кто проголосовал за этот ответ. Это тайное голосование. Вы не имеете права спекулировать на этом, не говоря уже о том, чтобы публиковать свои догадки как факт. - person user207421; 06.10.2015
comment
@EJB Хорошо, честно. Но я видел, как минусование произошло почти точно в тот момент, когда вы опубликовали свой комментарий. - person Tim Biegeleisen; 06.10.2015
comment
@TimBiegeleisen Корреляция не является причинно-следственной связью. - person user207421; 06.10.2015

Хорошо, я исправил это. Кажется, Торгейст был прав. Это помогает снять проблему. Было очень полезно использовать exists() и canRead(), так как они возвращали false. Где-то должно быть что-то не так с точным путем к файлу, который я вводил, хотя я копировал и вставлял. Странно... единственное возможное объяснение состоит в том, что что-то блокировало доступ к рабочему столу, но это маловероятно.

Использование скрытой обратной косой черты или прямой косой черты не имело значения.

File file = new File("C:/Users/UserName/Documents/Testing.txt");

vs.

File file = new File("C:\\Users\\OCB\\Documents\\Testing.txt");

Оба работали.

person Oloff Biermann    schedule 06.10.2015
comment
Вы исправили это как? Если вы не предоставляете решение, это не ответ. - person user207421; 06.10.2015