找不到文件

时间:2018-08-16 21:50:03

标签: java javafx-8

由于某种原因(对于Java来说是新来的),当我尝试从资源文件夹中读取Excel文件时,它表明它在那里,但是当我使用FileInputStream读取它时,我得到了FileNotFound异常。有什么想法吗?

代码:

clangd

这是我收到的输出:

clangd

4 个答案:

答案 0 :(得分:1)

资源不一定是文件;它们可以作为条目存储在.jar存档中。即使它们作为文件存储在文件系统的目录结构中,工作目录也可能与当前工作目录不匹配。您应该直接使用InputStream返回的getResourceAsStream,而不要尝试打开一个新的{}:

InputStream inputStream = applicationSettings.class.getResourceAsStream("/files/Employees.xlsx");
if (inputStream != null) {
    XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

    //int numberOfSheets = workbook.getNumberOfSheets();
    System.out.println(workbook.getAllNames());

    workbook.close();
} else {
    System.out.println("Resource not found");
}

答案 1 :(得分:1)

问题似乎是您的代码中的一些错误假设:

if (applicationSettings.class.getResourceAsStream("/files/Employees.xlsx") != null) {
    System.out.println("File Found");
    fileInputStream = new FileInputStream("/files/Employees.xlsx");
} else {
    System.out.println("File Not Found");
}

这就是说:“如果可以在资源路径上找到"Employees.xlsx",则可以在具有相同路径的文件系统中找到它。”

这里有两个错误的假设:

  1. 您假设自从在资源路径上找到"Employees.xlsx"以来,它将完全位于文件系统中。这不是一个有效的假设:

    • 该资源可能是(实际上通常是)JAR文件或类似文件的成员。
    • 该资源或资源的容器可能已经被动态下载到临时文件或内存中。
    • 该资源本来可以是创建的;例如由聪明的类加载器解密或解压缩其他内容。
  2. 您假设"Employees.xlsx"将具有与文件系统路径相同的资源路径。并非如此保证。 (只有将文件系统的根目录放在类路径上才可能是这种情况。)

我不确定您为什么要尝试这样做。根据@fabian的回答,POI允许您从InputStream打开电子表格。您不需要在这里使用FileInputStream

但是在您需要在资源路径上为资源使用FileInputStream的情况下,便携式解决方案是将资源复制到临时文件中,然后在临时文件上打开FileInputStream

答案 2 :(得分:0)

假设您的文件位于项目文件夹中,这是从名称开头删除斜杠的问题

Foo

然后应该工作。如果它位于项目文件夹中的文件文件夹中,则

fileInputStream = new FileInputStream("Employees.xlsx");

或者您可以提供文件的完整路径,并且应该可以使用

fileInputStream = new FileInputStream("files/Employees.xlsx");

答案 3 :(得分:0)

我今天遇到了同样的问题,我花了大约两个小时才能部分弄清这个问题。真烦人。根据类代码的结构,Java不允许您读取方法定义中的文本文件。尝试在main方法中读取它,然后将该FileInputStream对象用作openExcelSheet()方法的输入。让我知道它是否有效:)