Java new File()表示FileNotFoundException,但文件存在

时间:2013-10-10 22:58:25

标签: java filenotfoundexception

我有一个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);
        }
}

11 个答案:

答案 0 :(得分:43)

代码本身工作正常。问题是,程序工作路径指向的是其他地方而不是你想象的那样。

使用此行并查看路径的位置:

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

答案 1 :(得分:38)

有三种情况可能会抛出FileNotFoundException

  1. 指定的文件不存在。
  2. 指定的文件实际上是一个目录。
  3. 由于某种原因,无法打开指定的文件进行阅读。
  4. 根据您的描述,前两种情况不太可能。我会使用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()返回项目的根目录路径,因此您必须将该路径添加到子目录和包中