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

Java 尝试创建新文件会引发FileNotFoundException,但该文件存在于同一个包中,java,file,filenotfoundexception,Java,File,Filenotfoundexception,我有一个csv文件,路径与其他文件相同。现在,当我尝试创建文件对象时: public void getMenu() { File fileMenu = new File("FastFoodMenu.csv"); try { Scanner inputStream = new Scanner(fileMenu); while (inputStream.hasNext()) { String data = inputStre

我有一个csv文件,路径与其他文件相同。现在,当我尝试创建文件对象时:

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()
返回false。

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

相对路径总是根据应用程序的工作目录解析,而不是根据源文件所在的目录解析

要解决这个问题,你可以

  • 将这些文件移到文件夹中
  • 使用绝对路径(不建议!)
  • 将数据文件的文件夹指定为程序参数或配置文件(在工作目录中)
  • 将文件放在应用程序的类路径中的某个位置,然后单击。请注意,类路径中的文件通常与应用程序一起打包,因此用户不容易修改,因此,如果用户必须更改文件,则此解决方案不起作用

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

其次,将FastFoodMenu.csv文件移动到该菜单文件夹。 FastFoodMenu.csv相对路径现在应该如下所示:
OrderFastFood\menus\FastFoodMenu.csv

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

最后,在menu文件夹中获取对有问题的文件的引用。当您进行多文件读取(在某些情况下,多文件夹读取)时,您会希望将菜单文件夹中的文件作为列表获取,这就是为什么我说只获取菜单文件夹作为其自身引用的原因(或者只获取文件而不单独引用父文件夹,即“\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类要好得多。我还应该提到,在创建文件对象时,实际上并不是在创建文件。您所做的是创建一个对象,为它提供您想要的数据(例如它是否是文件夹,如果是,您想要它拥有哪些子文件/文件夹,它是否受保护,是否隐藏,等等)在实际告诉系统使用其他内容创建文件之前。

请输入文件的完整路径。是否可以尝试执行
system.out.println(新建
file(“.”).getAbsolutePath()`要检查工作目录?可能项目的工作目录不是
src/fastfoodorderingsystem
试图创建一个新文件
在哪里创建一个新文件?请尝试此
file fileMenu=new file(“./src/fastfoodorderingsystem/FastFoodMenu.csv”)
非常感谢,将文件移动到工作目录(即项目文件夹)解决了问题如果这解决了您的问题,为什么不将其标记为答案?我认为在这里使用相对路径应该足够了,因为它们将根据工作目录解决。因此,无需查询和附加系统属性
user.dir
。我希望您不介意,但我已经编辑了您的代码和rem我喜欢更方便的
文件
构造函数,它将父目录作为第一个参数。是的,我完全忘记了这个构造,谢谢!我知道有一个更好的,我只是完全忘记了。我不会真的依赖于直接对工作进行解析的路径。我有pr过去的问题是,我总是尝试购买user.dir财产保险。但这仍然是需要考虑的!好吧,对于其他阅读本文的人来说,我想指出我上面的评论。这可能有点难读,但我当时在手机上,我的键盘太差了。它纠正了很多事情。我想说的是我忘了关于文件(父,路径)构造函数(不是构造)。不仅如此,我还想说我不喜欢让VM或我的IDE根据工作目录解析路径。我更喜欢手动解析,以便知道它使用的是工作目录。只是为了澄清一下。