为了账号安全,请及时绑定邮箱和手机立即绑定

尝试创建新文件会引发 FileNotFoundException 但文件存在于同一个包中

尝试创建新文件会引发 FileNotFoundException 但文件存在于同一个包中

狐的传说 2021-09-29 16:24:35
我在与其他所有文件相同的路径中有一个 csv 文件。现在,当我尝试创建一个 File 对象时:public void getMenu() {    File fileMenu = new File("FastFoodMenu.csv");    try {        Scanner inputStream = new Scanner(fileMenu);        while (inputStream.hasNext()) {            String data = inputStream.next();            System.out.println(data);        }    } catch (FileNotFoundException ex) {        Logger.getLogger(FileHandler.class.getName()).log(Level.SEVERE, null, ex);    }}它抛出一个FileNotFoundException.项目中所有文件的绝对路径为:C:\Users\kenyo\Documents\NetBeansProjects\OrderFastFood\src\fastfoodorderingsystem我也检查了几次这个名字。fileMenu.exists()返回假。
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

首先,在您的根/工作目录(在您的情况下是包含您的项目的文件夹)中,创建一个名为“menus”的文件夹,您可以在此处存储所有菜单(以便您可以玩多文件输入)。


其次,将您的 FastFoodMenu.csv 文件移动到该菜单文件夹。该FastFoodMenu.csv相对路径现在应该是这样的:OrderFastFood\menus\FastFoodMenu.csv。


第三,从系统属性中获取您的工作目录。这是您的程序在其中运行的文件夹。然后,获取对菜单文件夹的引用(文件对象)。


最后,获取对菜单文件夹中相关文件的引用。当您进行多文件阅读(在某些时候,多文件夹阅读)时,您会希望将菜单文件夹中的文件作为列表获取,这就是为什么我说只获取菜单文件夹,因为它是自己的引用(或者只是获取没有对父级又名“\menus\”的独立引用的文件)。


所以你的代码应该是这样的:


public void getMenu() {

    final File workingDir = File(System.getProperty("user.dir"));

    final File menusDir = File(workingDir, "menus");

    final File fastFoodMenu = File(menusDir, "FastFoodMenu.csv");


    try {

        final FileInputStream fis = new FileInputStream(fastFoodMenu);

        final BufferedInputStream bs = new BufferedInputStream(fis);

        while((l = bs.readLine()) != null) {

            System.out.println(l);

        }

    } catch(FileNotFoundException e) {

        System.out.println(e.getMessage());

        e.printStackTrace()

    }

}

这都是伪代码,但这至少应该让你开始。确保使用 BufferedInputStream 以提高效率,并且在读取文件时,始终将它们传递到 FileInputStream 中。这比使用 Scanner 类要好得多。我还应该提到,在创建 File 对象时,您实际上并不是在创建文件。您正在做的是创建一个对象,为其提供您希望它拥有的数据(例如它是否是一个文件夹,如果是,您希望它拥有哪些子文件/文件夹,它是否受保护)与否,隐藏与否等),然后实际告诉系统用其他所有内容创建文件。


查看完整回答
反对 回复 2021-09-29
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您的 csv 文件可能位于错误的位置。您只是指定文件名,这是一个相对路径。

相对路径始终针对应用程序的工作目录进行解析,而不是针对源文件所在的目录。

要解决此问题,您可以

  • 将文件移动到真正的工作目录。

  • 使用绝对路径(不推荐!)

  • 将数据文件的文件夹指定为程序参数或在配置文件中(在您的工作目录中)

  • 将文件放在应用程序的类路径中,并通过 classloader 从那里加载它们。请注意,类路径中的文件通常与应用程序打包在一起,因此用户不易修改,因此如果用户必须更改文件,则此解决方案不起作用。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信