Java 尝试创建新文件会引发FileNotFoundException,但该文件存在于同一个包中
我有一个csv文件,路径与其他文件相同。现在,当我尝试创建文件对象时: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
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文件可能位于错误的位置。您只需指定文件名,这是一个相对路径
相对路径总是根据应用程序的工作目录解析,而不是根据源文件所在的目录解析
要解决这个问题,你可以
- 将这些文件移到文件夹中
- 使用绝对路径(不建议!)
- 将数据文件的文件夹指定为程序参数或配置文件(在工作目录中)
- 将文件放在应用程序的类路径中的某个位置,然后单击。请注意,类路径中的文件通常与应用程序一起打包,因此用户不容易修改,因此,如果用户必须更改文件,则此解决方案不起作用
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根据工作目录解析路径。我更喜欢手动解析,以便知道它使用的是工作目录。只是为了澄清一下。