由于某种原因(对于Java来说是新来的),当我尝试从资源文件夹中读取Excel文件时,它表明它在那里,但是当我使用FileInputStream读取它时,我得到了FileNotFound异常。有什么想法吗?
代码:
clangd
这是我收到的输出:
clangd
答案 0 :(得分:1)
资源不一定是文件;它们可以作为条目存储在.jar
存档中。即使它们作为文件存储在文件系统的目录结构中,工作目录也可能与当前工作目录不匹配。您应该直接使用InputStream
返回的getResourceAsStream
,而不要尝试打开一个新的{1>}:
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"
,则可以在具有相同路径的文件系统中找到它。”
这里有两个错误的假设:
您假设自从在资源路径上找到"Employees.xlsx"
以来,它将完全位于文件系统中。这不是一个有效的假设:
您假设"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()方法的输入。让我知道它是否有效:)