我有一个 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。
最佳答案
首先,在您的根/工作目录(在您的情况下是包含项目的文件夹)中,创建一个名为“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 对象时,您实际上并没有创建文件。您正在做的是创建一个对象,为其提供您希望它拥有的数据(例如它是否是一个文件夹,如果是,您希望它拥有哪些子文件/文件夹,它是否 protected )在实际告诉系统使用其他所有内容创建文件之前,是否隐藏,是否隐藏等)。
关于java - 尝试创建新文件会抛出 FileNotFoundException 但文件存在于同一包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52421399/