java.io.FileNotFoundException: система не может найти указанный файл
Так что я застрял на этом некоторое время. По сути, у меня есть файл, созданный с именем "word.txt", и всякий раз, когда я запускаю программу, она выдает мне эту ошибку:
Exception in thread "main" java.io.FileNotFoundException: word.txt (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.util.Scanner.<init>(Unknown Source)
at Hangman1.main(Hangman1.java:6)
Вот мой код:
import java.io.File;
import java.util.*;
public class Hangman1 {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(new File("word.txt"));
String in = "";
in = input.nextLine();
}
}
По иронии судьбы, я создал файл "word.txt" в том же каталоге, что и мой java-файл, и все же он все еще дает мне эту ошибку.
7 ответов
Поместите word.txt непосредственно как дочерний элемент корневой папки проекта и однорангового узла src
Project_Root
src
word.txt
Отказ от ответственности: я хотел бы объяснить, почему это работает для данного конкретного случая и почему это не может работать для других.
Почему это работает:
Когда вы используете File
или любой другой FileXxx
варианты, вы ищете файл в файловой системе относительно "рабочего каталога". Рабочий каталог, можно описать так:
Когда вы запускаете из командной строки
C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1
рабочий каталог C:\EclipseWorkspace\ProjectRoot\bin
, С вашей IDE (по крайней мере, со всеми, с которыми я работал), рабочий каталог ProjectRoot
, Поэтому, когда файл находится в ProjectRoot
, тогда допустимо использовать только имя файла в качестве относительного пути, потому что он находится в корне рабочего каталога.
Точно так же, если это была структура вашего проекта ProjectRoot\src\word.txt
тогда путь "src/word.txt"
будет действительным.
Почему это не может работать
Например, рабочий каталог всегда может измениться. Например, запустив код из командной строки, как в примере выше, рабочий каталог bin
, Так что в этом случае это не удастся, так как нет bin\word.txt
Во-вторых, если вы должны были экспортировать этот проект в jar-файл, а файл был настроен для включения в jar-файл, он также потерпел бы неудачу, так как путь больше не будет действительным.
При этом вам необходимо определить, должен ли файл быть встроенным ресурсом (или просто "ресурсом" - терминами, которые иногда я буду использовать взаимозаменяемо). Если это так, то вы захотите встроить файл в путь к классам и получить к нему доступ через URL. Первое, что вам нужно сделать (в данном конкретном случае), это убедиться, что файл встроен в путь к классам. Когда файл находится в корневом каталоге проекта, необходимо настроить сборку для включения файла. Но если вы положите файл в src
или в некотором каталоге ниже, то сборка по умолчанию должна поместить его в путь к классу.
Вы можете получить доступ к ресурсу classpath несколькими способами. Вы можете использовать Class
класс, который имеет getResourceXxx
метод, из которого вы используете для получения ресурсов classpath.
Например, если вы изменили структуру вашего проекта на ProjectRoot\src\resources\word.txt
Вы можете использовать это:
InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
getResourceAsStream
возвращает InputStream
, но получает URL под капотом. Кроме того, вы можете получить URL
если это то, что вам нужно. getResource()
вернет URL
Для пользователей Maven, где структура каталогов похожа src/main/resources
, содержание resources
папка помещается в корень пути к классам. Так что если у вас есть файл, то вы бы использовали только getResourceAsStream("/thefile.txt")
Относительные пути могут быть использованы, но они могут быть хитрыми. Лучшее решение - узнать, где хранятся ваши файлы, то есть распечатать папку:
import java.io.File;
import java.util.*;
public class Hangman1 {
public static void main(String[] args) throws Exception {
File myFile = new File("word.txt");
System.out.println("Attempting to read from file in: "+myFile.getCanonicalPath());
Scanner input = new Scanner(myFile);
String in = "";
in = input.nextLine();
}
}
Этот код должен напечатать папку, где он ищет. Поместите файл туда, и вам будет хорошо.
Ваш файл должен находиться непосредственно в папке проекта, а не внутри какой-либо другой подпапки.
Если папка вашего проекта названа, например, для AProject
должно быть в том же месте, что и ваш src
папка.
Aproject
src
word.txt
Попробуйте создать файл с помощью кода, чтобы вы узнали путь к файлу, в котором система создает
File test=new File("check.txt");
if (test.createNewFile()) {
System.out.println("File created: " + test.getName());
}
Я читал путь из файла свойств и не упомянул, что в конце есть пробел. Убедитесь, что у вас его нет.
Убедитесь, что при создании TXT-файла вы не вводите имя "name.txt", просто введите "имя". Если вы введете "name.txt", Eclipse увидит его как "name.txt.txt". Это решило это для меня. Также сохраните файл в папке src, а не в папке, где находится.java, на одну папку вверх.
У меня такая же проблема, но знаешь почему? потому что я не поместил.txt в конец моего файла, и это был файл, а не текстовый файл, вы должны сделать только две вещи:
- Поместите ваш текстовый файл в корневой каталог (например, если у вас есть проект под названием HelloWorld, просто щелкните правой кнопкой мыши файл HelloWorld в каталоге Directory и создайте файл.
- Сохраните как этот файл с любым именем, которое вы хотите, но с.txt в конце этого, я думаю, что ваша проблема решена, но я пишу это другим людям, которые знают это. Благодарю.
Я думаю, что это всегда кипит classpath
, сказав, что если вы запускаете из той же папки, где ваш.class, то измените Scanner input = new Scanner(new File("word.txt"));
в Scanner input = new Scanner(new File("./word.txt"));
это должно работать