Подтвердить что ты не робот

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 файл, и тем не менее он все еще дает мне эту ошибку.

4b9b3361

Ответ 1

Поместите 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

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

При этом вам нужно определить, должен ли файл быть (или просто "ресурс" - термины, которые иногда я буду использовать взаимозаменяемо). Если это так, тогда вы захотите создать файл в пути к классам и получить к нему доступ через 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")

Ответ 2

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

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();
    }

}

Этот код должен печатать папку, в которой он ищет. Поместите там файл, и вам будет хорошо.

Ответ 3

Ваш файл должен находиться непосредственно под папкой проекта, а не внутри любой другой подпапки.

Если папка вашего проекта названа так, например. AProject, он должен находиться в том же месте, что и ваша папка src.

Aproject
        src
        word.txt

Ответ 4

Я думаю, что он всегда кипит до classpath. сказав, что если вы запустите из той же папки, где ваш .class затем измените Scanner input = new Scanner(new File("word.txt")); на Scanner input = new Scanner(new File("./word.txt"));, который должен работать

Ответ 5

Убедитесь, что при создании txt файла, который вы не введете имя "name.txt", просто введите "имя". Если вы наберете "name.txt", Eclipse увидит его как "name.txt.txt". Это решило это для меня. Также сохраните файл в папке src, а не в папке .java, одна папка вверх.

Ответ 6

System.out.println("To Read the file"+input.getCanonicalPath()); try to put it...in your code....

Ответ 7

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

Ответ 8

У меня такая же проблема, но знаете почему? потому что я не поместил.txt в конец моего Файла, и поэтому это был Файл не textFile, вы можете сделать только две вещи:

  1. Поместите свой текстовый файл в корневой каталог (например, если у вас есть проект под названием HelloWorld, просто щелкните правой кнопкой мыши файл HelloWorld в каталоге пакетов и создайте файл
  2. Сохраните этот файл с любым именем, которое вы хотите, но с.txt, в конце этого, я думаю, ваша проблема решена, но я пишу это другим людям. Благодарю.