新的Java文件()说FileNotFoundException但文件存在

我有一个CS类的任务,它说要读取一个文件有几个testing成绩,并要求我总结和平均他们。 虽然总结和平均很容易,我有文件阅读的问题。 导师说使用这个语法

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

但是,这会引发FileNotFoundExceptionexception,但是我一遍又一遍地检查文件是否存在于当前文件夹中,之后我发现它必须对权限进行操作。 我改变了读写权限给大家,但是仍然无法正常工作,而且仍然一直在抛出错误。 有没有人有任何想法,为什么这可能发生?

编辑:它实际上是指向一个目录,但是,我已经解决了这个问题。 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); } } 

有三种情况可能会引发FileNotFoundException

  1. 指定的文件不存在。
  2. 指定的文件实际上是一个目录。
  3. 指定的文件由于某种原因无法打开阅读。

根据你的描述,前两种情况是不太可能的。 我会使用file.canRead()来testing第三种情况。

如果上面的testing返回true,我会怀疑以下几点:

您可能忘记了明确地抛出或捕获潜在的exception(即FileNotFoundExcetion )。 如果你在IDE中工作,你应该有一些编译器的投诉。 但是我怀疑你没有在这样的IDE中运行你的代码。

我刚刚运行你的代码,而没有照顾Netbeans的投诉,只得到以下exception消息:

线程“main”中的exceptionjava.lang.RuntimeException:不可编译的源代码 – 未报告的exceptionjava.io.FileNotFoundException; 必须被逮捕或宣布被抛出

试试下面的代码,看看这个exception是否会消失:

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

代码本身工作正常。 问题是,程序的工作path是指向其他地方比你想象的。

使用这一行,看看path在哪里:

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

显然有一些可能的原因,以前的答案logging他们很好,但这是我在一个特定的情况下解决这个问题:

我的一个学生有这个问题,我几乎把我的头发试图找出来。 事实certificate,该文件不存在,即使它看起来像。 问题是Windows 7被configuration为“隐藏已知文件types的文件扩展名”。 这意味着如果文件名称为“data.txt”,则其实际文件名为“data.txt.txt”。

希望这有助于他人自救一些头发。

我最近发现有趣的案例,当文件显然存在于磁盘上时,会产生FileNotFoundExeption。 在我的程序中,我从另一个文本文件中读取文件path并创buildFile对象:

 //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 

故事的原因是path最后包含不可见的\ r \ n符号。 固定:

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

根据文件的权限属性,文件的读取和写入操作可能会被操作系统阻止。

如果您正在尝试从文件中读取数据,那么我build议使用File的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. 

如果您正在尝试写入文件,那么我build议使用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.) 

除了在这里提到的所有其他答案,你可以做一件事情为我工作。

如果您通过扫描程序或通过命令行参数读取path,而不是直接从Windows资源pipe理器复制粘贴path,只需手动inputpath即可。

它为我工作,希望它可以帮助别人:)