我有一个CS类的作业,它说要读取一个包含多个考试成绩的文件,并要求我对它们求和并进行平均。虽然求和和平均很容易,但我在阅读文件方面遇到了问题。讲师说要使用这种语法
Scanner scores=new Scanner(new File("scores.dat"));
然而,这会抛出一个FileNotFoundException,但是我一遍又一遍地检查当前文件夹中是否存在该文件,之后,我认为它必须对权限做一些事情。我为每个人更改了读写权限,但它仍然无法正常工作,但仍然会抛出错误。有谁知道为什么会这样?
编辑:它实际上是指向一个目录,但是,我已经解决了这个问题。 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);
}
}
答案 0 :(得分:43)
代码本身工作正常。问题是,程序工作路径指向的是其他地方而不是你想象的那样。
使用此行并查看路径的位置:
System.out.println(new File(".").getAbsoluteFile());
答案 1 :(得分:38)
有三种情况可能会抛出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 :(得分:12)
显然有很多可能的原因,之前的答案很好地记录了它们,但是在这里我是如何解决这个问题的:
我的一个学生遇到了这个问题,我几乎把我的头发弄出来试图找出来。事实证明,该文件并不存在,即使它看起来像它。问题是Windows 7配置为"隐藏已知文件类型的文件扩展名。"这意味着如果文件看起来具有名称" data.txt"其实际文件名为" data.txt.txt"。
希望这可以帮助别人省下自己的头发。
答案 3 :(得分: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());
答案 4 :(得分:2)
根据文件的权限属性,操作系统可以阻止对文件进行读写操作。
如果您尝试从文件中读取,那么我建议使用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.
如果您尝试写入该文件,那么我建议使用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.)
答案 5 :(得分:2)
一个对我有用的简单修复程序是将我的文件移出src并移到项目的主文件夹中。这不是最好的解决方案,但是取决于项目的规模和您的时间,它可能是完美的。
答案 6 :(得分:1)
除了这里提到的所有其他答案外,你可以做一件对我有用的事情。
如果您正在通过扫描程序或命令行参数读取路径,而不是直接从Windows资源管理器复制粘贴路径,只需手动输入路径。
它对我有用,希望它可以帮助某人:)
答案 7 :(得分:0)
您显然会在一段时间后弄清楚的,但只是发布此内容,以便对某人有所帮助。当您的文件路径包含任何附加或前缀的空格时,也会发生这种情况。
答案 8 :(得分:0)
使用单个正斜杠,并始终手动键入路径。例如:
success: function(data){
if(data.status == true){
clearError();
$("#loading").html(loadingtrue());
}
else{
ShowError(data.error_list);
}
},
答案 9 :(得分:0)
对我有用的是捕获异常。没有它,即使文件存在,编译器也会抱怨。
InputStream file = new FileInputStream("filename");
改为
try{
InputStream file = new FileInputStream("filename");
System.out.println(file.available());
}
catch (Exception e){
System.out.println(e);
}
答案 10 :(得分:-1)
我也遇到了同样的错误,只需添加Java项目结构中的src目录即可解决。
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”)和新File(“。”)。getAbsolutePath()返回项目的根目录路径,因此您必须将该路径添加到子目录和包中