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

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

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

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

EDIT: на самом деле это указывало на каталог вверх, однако я исправил эту проблему. файл.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);
        }
}

6 ответов


есть три случая, когда FileNotFoundException может быть брошен.

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

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

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

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

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

исключение в потоке" main " java.ленг.К RuntimeException: К Некомпилируемому исходный код-несообщаемое исключение java.Ио.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);
}

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

используйте эту строку и посмотрите, где путь:

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

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

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

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


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

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

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

Если вы пытаетесь прочитать из файла, то я рекомендую использовать метод setReadable файла, чтобы установить его в 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.

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

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

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

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