有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java说FileNotFoundException但文件存在

我有一个CS课程的作业,上面写着读一个有几个测试分数的文件,并要求我对它们求和平均。虽然求和和平均很容易,但我在读取文件时遇到了问题。老师说要用这个语法

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

但是,这会抛出一个FileNotFoundException,但是我已经反复检查了当前文件夹中是否存在该文件,之后,我认为它必须对权限进行处理。我为每个人更改了读写权限,但仍然不起作用,并且仍然抛出错误。有人知道为什么会发生这种情况吗

编辑:它实际上指向一个目录,但是,我已经解决了这个问题。现在file.exists()返回true,但是当我尝试将它放入Scanner时,它抛出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);
        }
}

共 (6) 个答案

  1. # 1 楼答案

    代码本身工作正常。问题是,程序的工作路径指向的位置与您想象的不同

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

    System.out.println(new File(".").getAbsoluteFile());
    
  2. # 2 楼答案

    我最近发现了一个有趣的例子,当文件明显存在于磁盘上时,会生成FileNotFoundExeption。 在我的程序中,我从另一个文本文件读取文件路径并创建文件对象:

    //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()); 
    

    概括来说,不可见/非打印字符可能包括空格或制表符,也可能包括其他字符,它们可能出现在路径的开头、结尾或嵌入到路径中。修剪在某些情况下有效,但并非所有情况下都有效。有几件事可以帮助您发现此类问题:

    1. 输出带有引号字符的路径名;e、 g

        System.out.println("Check me! '" + path + "'");
      

      仔细检查输出中不应该出现的空格和换行符

    2. 使用Java调试器逐个字符仔细检查路径名字符串,查找不应该存在的字符。(同时检查同形文字字符!)

  3. # 3 楼答案

    一个对我有效的简单修复方法是将我的文件从src移到项目的主文件夹中。这不是最好的解决方案,但取决于项目的规模和您的时间,它可能是完美的

  4. # 4 楼答案

    显然有许多可能的原因,前面的答案很好地记录了这些原因,但以下是我在一个特定案例中解决这些问题的方法:

    我的一个学生有这个问题,我为了想办法差点把头发扯掉。结果证明,该文件不存在,尽管看起来确实存在。问题在于Windows 7被配置为“隐藏已知文件类型的文件扩展名”这意味着,如果文件名为“data.txt”,则其实际文件名为“data.txt.txt”

    希望这能帮别人省下一些头发

  5. # 5 楼答案

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

    如果您试图从文件中读取,那么我建议使用文件的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.
    

    如果您试图写入文件,我建议使用文件的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.)
    
  6. # 6 楼答案

    在一些情况下FileNotFoundException可能会在运行时抛出

    1. 命名文件不存在。原因可能有很多,包括:

      • 路径名完全错误
      • 路径名看起来正确,但实际上是错误的,因为它包含您没有注意到的非打印字符(或同形符)
      • 路径名是相对的,并且相对于正在运行的应用程序的实际当前目录,它无法正确解析。这通常是因为应用程序的当前目录不是您期望或假设的目录
      • 文件的路径已断开;e、 g.路径的目录名不正确,路径上的符号链接断开,或者某个路径组件存在权限问题
    2. 命名文件实际上是一个目录

    3. 由于某些原因,无法打开命名文件进行读取

    好消息是,问题将不可避免地成为上述问题之一。这只是一个确定哪一个的问题。以下是一些您可以尝试的东西:

    • 调用file.exists()将告诉您是否存在具有给定名称/路径名的文件系统对象

    • 调用file.isDirectory()将测试它是否是目录

    • 调用file.canRead()将测试它是否是可读文件

    • 此行将告诉您当前目录是什么:

        System.out.println(new File(".").getAbsolutePath());
      
    • 此行将打印出路径名,以便更容易发现意外的前导或尾随空格:

        System.out.println("The path is '" + path + "'");
      

      在输出中查找意外的空格、换行符等


    事实证明,您的示例代码存在编译错误

    我运行您的代码时没有考虑Netbeans的投诉,结果得到以下异常消息:

    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

    如果您将代码更改为以下内容,它将修复这个问题

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

    解释:将Scanner(File)构造函数声明为引发FileNotFoundException异常。(扫描仪可能无法打开文件。)现在FileNotFoundException是一个检查异常。这意味着可以抛出异常的方法必须捕获异常或在throws子句中声明异常。上述修复采用后一种方法