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

Java new File() говорит FileNotFoundException, но файл существует

У меня есть назначение для моего класса CS, где говорится, что он читает файл с несколькими тестовыми баллами и просит меня суммировать и усреднять их. При суммировании и усреднении легко, у меня возникают проблемы с чтением файла. Инструктор сказал использовать этот синтаксис

Scanner scores=new Scanner(new File("scores.dat"));

Однако это вызывает исключение FileNotFoundException, но я проверял снова и снова, чтобы увидеть, существует ли файл в текущей папке, и после этого я решил, что ему нужно что-то сделать с разрешениями. Я изменил разрешения для чтения и записи для всех, но он все еще не работал, и он все еще продолжает выдавать ошибку. Кто-нибудь знает, почему это может произойти?

EDIT: Фактически это указывало на каталог вверх, однако я исправил эту проблему. file.exists() возвращает true, однако, когда я пытаюсь поместить его в сканер, он выдает filenotfoundexception

Вот мой код

import java.util.Scanner;
import java.io.*;
public class readInt{
        public static void main(String args[]){
                File file=new File("lines.txt");
                System.out.println(file.exists());
                Scanner scan=new Scanner(file);
        }
}
4b9b3361

Ответ 1

Существуют три случая, когда может быть выбрано значение FileNotFoundException.

  • Именованный файл не существует.
  • Именованный файл на самом деле является каталогом.
  • Именованный файл не может быть открыт для чтения по какой-либо причине.

Первые два случая вряд ли основаны на вашем описании. Я бы опробовал третий случай, используя file.canRead().

Если вышеприведенный тест возвращает true, я бы предположил следующее:

Возможно, вы забыли явно бросить или поймать потенциальное исключение (т.е. FileNotFoundExcetion). Если вы работаете в среде IDE, вы должны получить жалобу от компилятора. Но я подозреваю, что вы не запускали свой код в такой среде IDE.

Я только что запустил ваш код, не заботясь о жалобе Netbeans, только чтобы получить следующее сообщение об исключении:

Исключение в потоке "main" java.lang.RuntimeException: Uncompilable Исходный код - неподтвержденное исключение java.io.FileNotFoundException; должен быть пойманным или объявленным брошенным

Попробуйте выполнить следующий код и посмотрите, не исчезло ли исключение:

public static void main(String[] args) throws FileNotFoundException {    
    File file=new File("scores.dat");
    System.out.println(file.exists());
    Scanner scan=new Scanner(file);
}

Ответ 2

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

Используйте эту строку и посмотрите, где находится путь:

System.out.println(new File(".").getAbsoluteFile());

Ответ 3

Очевидно, существует ряд возможных причин, и предыдущие ответы хорошо документируют их, но вот как я решил это в одном конкретном случае:

У моего ученика была эта проблема, и я чуть не разорвал свои волосы, пытаясь понять это. Оказалось, что файл не существует, хотя он выглядел так, как будто это было. Проблема заключалась в том, что Windows 7 была настроена на "Скрыть расширения файлов для известных типов файлов". Это означает, что если файл имеет имя "data.txt", его фактическое имя файла - "data.txt.txt".

Надеюсь, это поможет другим спасти себя от волос.

Ответ 4

Недавно я нашел интересный случай, который создает FileNotFoundExeption, когда файл, очевидно, существует на диске. В моей программе я читаю путь к файлу из другого текстового файла и создаю объект File:

//String path was read from file
System.out.println(path); //file with exactly same visible path exists on disk
File file = new File(path); 
System.out.println(file.exists());  //false
System.out.println(file.canRead());  //false
FileInputStream fis = new FileInputStream(file);  // FileNotFoundExeption 

Причиной истории является то, что в конце пути содержатся невидимые символы \r\n. Исправить:

File file = new File(path.trim()); 

Ответ 5

Чтение и запись из файла и в файл могут быть заблокированы вашей ОС в зависимости от атрибутов разрешения файла.

Если вы пытаетесь прочитать из файла, я рекомендую использовать метод FileReadable для установки его в true или, например, этот код:

String arbitrary_path = "C:/Users/Username/Blah.txt";
byte[] data_of_file;
File f = new File(arbitrary_path);
f.setReadable(true);
data_of_file = Files.readAllBytes(f);
f.setReadable(false); // do this if you want to prevent un-knowledgeable 
                      //programmers from accessing your file.

Если вы пытаетесь записать файл, я рекомендую использовать метод FileWatchable, чтобы установить его в true, или, например, этот код:

String arbitrary_path = "C:/Users/Username/Blah.txt";
byte[] data_of_file = { (byte) 0x00, (byte) 0xFF, (byte) 0xEE };
File f = new File(arbitrary_path);
f.setWritable(true);
Files.write(f, byte_array);
f.setWritable(false); // do this if you want to prevent un-knowledgeable 
                      //programmers from changing your file (for security.)

Ответ 6

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

Ответ 7

Помимо всех других ответов, упомянутых здесь, вы можете сделать одно, что сработало для меня.

Если вы читаете путь через сканер или через args командной строки, вместо копирования, вставляющего путь непосредственно из проводника Windows, просто введите вручную путь.

Это сработало для меня, надеюсь, что это поможет кому-то:)

Ответ 8

У меня была такая же ошибка, и я решил ее, просто добавив каталог src, который находится в структуре проекта Java.

String path = System.getProperty("user.dir") + "\\src\\package_name\\file_name";
File file = new File(path);
Scanner scanner = new Scanner(file);

Обратите внимание, что System.getProperty("user.dir") и новый файл ("."). GetAbsolutePath() возвращают путь к корневому каталогу вашего проекта, поэтому вы должны добавить путь к своим подкаталогам и пакетам.