新的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
。
- 指定的文件不存在。
- 指定的文件实际上是一个目录。
- 指定的文件由于某种原因无法打开阅读。
根据你的描述,前两种情况是不太可能的。 我会使用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即可。
它为我工作,希望它可以帮助别人:)