java.Ио.FileNotFoundException: система не может найти указанный файл
поэтому я застрял на этом некоторое время. В принципе, у меня есть файл, созданный под названием "Слово.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 ответов
вставить слово.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-адрес. Первое, что вам нужно будет сделать (в данном конкретном случае), это убедиться, что файл get построен в classpath. С файлом в корень проекта, вы должны настроить сборку для включения файла. но если вы поместите файл в 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
, он должен быть в том же месте, что и ваш .
Aproject
src
word.txt
Я думаю, это всегда сводится к classpath
. сказав это, если вы запустите из той же папки, где ваш .класс тогда change Scanner input = new Scanner(new File("word.txt"));
to Scanner input = new Scanner(new File("./word.txt"));
это должно работать
убедитесь, что при создании txt-файла вы не вводите имя "name.txt", просто введите "имя". Если ввести " name.txt "Eclipse увидит это как" имя.формат txt.формат txt." Это решило все за меня. Также сохраните файл в папке src, а не в папке .java находится, одна папка вверх.
У меня такая же проблема, но знаешь почему? потому что я не ставил .txt в конце моего файла, и поэтому это был файл не текстовый файл, вы должны сделать только две вещи:
- поместите текстовый файл в корневой каталог (e.x если у вас есть проект под названием HelloWorld, просто щелкните правой кнопкой мыши на файле HelloWorld в каталоге пакета и создайте файл
- Сохранить как файл с любым именем, которое вы хотите, но с собой .txt в конце Думаю, твоя проблема решена, но я ... напиши это, чтобы другие люди знали это. Спасибо.