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

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