2013-10-10 5 views
18

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

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

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

EDIT: Фактически это указывало на каталог вверх, однако я исправил эту проблему. File.Exists() возвращает истину, однако, когда я пытаюсь поставить его в сканер, он бросает 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); 
     } 
} 
+4

Что такое текущий каталог? Попробуйте напечатать 'new File (". ")' – Steinar

+4

Распечатайте путь 'new File (" scores.dat ")' и дважды проверьте, существует ли он в ожидаемой директории. –

+0

@Steinar ищет в правильном каталоге, и он дает правильный абсолютный путь, однако файл все еще не найден – scrblnrd3

ответ

26

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

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

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

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

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

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

Исключение в потоке «главный» 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); 
} 
+0

Да. Большое вам спасибо – scrblnrd3

+0

Ваш третий случай включает в себя два других, а также включает в себя ряд других легко разделяемых случаев, таких как проблемы с разрешением, сбои сети и т. д., что не очень полезно и не делает каких-либо дело в том, что существует «три случая». Тестирование 'File.canRead()' бесполезно, когда вам уже нужно поймать исключение и расточительно, когда система должна его протестировать в любом случае во время открытия. – EJP

+0

«Если тест выше возвращает true» - и что, если это возвращает false? :) – Line

26

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

Используйте эту линию и увидеть, где путь:

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

Это не должно быть, это ответ со всем решением, которое необходимо для решения проблемы авторов. – libik

+1

+1 Я не согласен @josh, я думаю, что это хороший ответ. Это то, что я бы разместил – Bohemian

+0

Это всего лишь предложение; нам не предоставлена ​​какая-либо дополнительная информация, отличная от того, что опубликовано в вопросе. Это просто тактика отладки; он * может * помочь оператору решить его проблему, но что, если файл действительно существует? –

7

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

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

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

+0

Спасибо за информацию. Я была такая же проблема. – sriram

+0

Такая же проблема. Когда ничего не имеет смысла, люди должны проверить это решение. –

2

Недавно я нашел интересный случай, который создает 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 

Причины истории является то, что путь содержит невидимые \ г \ п символы в конце. Fix:

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

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

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

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

1

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

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

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.) 
Смежные вопросы