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 в конец моего файла, и это был файл, а не текстовый файл, вы должны сделать только две вещи:

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

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

Другие вопросы по тегам