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

时间:2018-09-20 09:06:26

标签: java file 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()返回false。

2 个答案:

答案 0 :(得分:2)

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

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

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

最后,在菜单文件夹中获取有关文件的引用。当您开始多文件阅读(有时是多文件夹阅读)时,您将想要将菜单文件夹中的文件作为列表获取,所以这就是为什么我说只获取menus文件夹的原因引用(或者只获取没有对父文件名“ \ 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对象时,您实际上并不是在创建文件。您正在做的是创建对象,向其提供所需的数据(例如是否为文件夹,如果是,则为该对象提供哪些子文件/文件夹,是否受保护)或不隐藏,是否隐藏等),然后实际告诉系统使用其他所有文件创建文件。

答案 1 :(得分:0)

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

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

要解决此问题,您可以

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