java说filenotfoundexception,但文件存在

jqjz2hbq  于 2021-06-29  发布在  Java
关注(0)|答案(10)|浏览(590)

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

3gtaxfhh1#

显然有很多可能的原因,前面的答案很好地记录了这些原因,但下面是我如何在一个特定的案例中解决这个问题的:
我的一个学生有这个问题,我差点把头发扯掉想弄清楚。结果发现这个文件不存在,尽管看起来像是存在的。问题是Windows7被配置为“隐藏已知文件类型的文件扩展名”。这意味着,如果文件名似乎为“data.txt”,则其实际文件名为“data.txt.txt”。
希望这能帮别人省点头发。

7gyucuyw

7gyucuyw2#

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

2w3rbyxf

2w3rbyxf3#

除了这里提到的所有其他答案,你可以做一件对我有用的事情。
如果您是通过扫描仪或命令行参数读取路径,而不是直接从windows资源管理器复制粘贴路径,只需手动键入路径。
它对我有用,希望它能帮助别人:)

h22fl7wq

h22fl7wq4#

我遇到了同样的错误,只需添加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”)和new file(“.”).getabsolutepath()返回项目根目录路径,因此必须将该路径添加到子目录和包中

lyfkaqu1

lyfkaqu15#

代码本身工作正常。问题是,程序的工作路径指向的不是您所想的地方。
使用这条线并查看路径的位置:

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

fivyi3re6#

使用单正斜杠并始终手动键入路径。例如:

FileInputStream fi= new FileInputStream("D:/excelfiles/myxcel.xlsx");
deyfvvtc

deyfvvtc7#

根据文件的权限属性,操作系统可以阻止对文件的读写。
如果您试图从文件中读取,那么我建议使用文件的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.)
to94eoyn

to94eoyn8#

很明显,你会在一段时间后发现,但只是张贴这个,以便它可能会帮助别人。当文件路径包含任何附加或前缀的空格时,也可能发生这种情况。

clj7thdc

clj7thdc9#

在很多情况下 FileNotFoundException 可能在运行时抛出。
命名文件不存在。原因有很多,包括:
路径名完全错误
路径名看起来正确,但实际上是错误的,因为它包含您没有注意到的非打印字符(或同形文字)
路径名是相对的,相对于正在运行的应用程序的实际当前目录,它不能正确解析。这通常是因为应用程序的当前目录不是您期望或假设的目录。
文件路径中断;e、 g.路径的目录名不正确,路径上的符号链接中断,或者某个路径组件存在权限问题。
命名文件实际上是一个目录。
由于某种原因,无法打开命名文件进行读取。
好消息是,问题将不可避免地出现在上面。这只是一个确定哪一个的问题。以下是您可以尝试的一些方法:
打电话 file.exists() 将告诉您是否存在具有给定名称/路径名的文件系统对象。
打电话 file.isDirectory() 将测试它是否是一个目录。
打电话 file.canRead() 将测试它是否是可读文件。
此行将告诉您当前目录是什么:

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

此行将打印出路径名,以便更容易发现意外的前导或训练空白:

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

在输出中查找意外的空格、换行符等。
结果是您的示例代码有一个编译错误。
我运行了您的代码,但没有处理netbeans的投诉,结果得到以下异常消息:
线程“main”java.lang.runtimeexception中的异常:不可编译的源代码-未报告的异常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);
}

说明:the Scanner(File) 构造函数声明为抛出 FileNotFoundException 例外(扫描仪无法打开文件。)现在 FileNotFoundException 是选中的异常。这意味着可能引发异常的方法必须捕获异常或在 throws 条款。上述修复采用后一种方法。

kd3sttzy

kd3sttzy10#

我最近发现了一个有趣的例子,当文件明显存在于磁盘上时,它会生成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());

概括地说,不可见/非打印字符可能包括空格或制表符,也可能包括其他字符,它们可能出现在路径的开头、结尾或嵌入路径中。修剪在某些情况下会起作用,但不是全部。有几件事可以帮助你发现这类问题:
输出带有引号字符的路径名;例如

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

仔细检查输出中不应该出现的空格和换行符。
使用java调试器逐个字符仔细检查路径名字符串,查找不应该存在的字符(还要检查同形字符!)

相关问题