猿问

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

我在与其他所有文件相同的路径中有一个 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()返回假。


狐的传说
浏览 190回答 2
2回答

POPMUISE

首先,在您的根/工作目录(在您的情况下是包含您的项目的文件夹)中,创建一个名为“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 对象时,您实际上并不是在创建文件。您正在做的是创建一个对象,为其提供您希望它拥有的数据(例如它是否是一个文件夹,如果是,您希望它拥有哪些子文件/文件夹,它是否受保护)与否,隐藏与否等),然后实际告诉系统用其他所有内容创建文件。

慕丝7291255

您的 csv 文件可能位于错误的位置。您只是指定文件名,这是一个相对路径。相对路径始终针对应用程序的工作目录进行解析,而不是针对源文件所在的目录。要解决此问题,您可以将文件移动到真正的工作目录。使用绝对路径(不推荐!)将数据文件的文件夹指定为程序参数或在配置文件中(在您的工作目录中)将文件放在应用程序的类路径中,并通过 classloader 从那里加载它们。请注意,类路径中的文件通常与应用程序打包在一起,因此用户不易修改,因此如果用户必须更改文件,则此解决方案不起作用。
随时随地看视频慕课网APP

相关分类

Java
我要回答