Java 文件在';在那里
出于某种原因(Java新手),当我试图从我的resources文件夹中读取Excel文件时,它显示它在那里,但当我使用FileInputStream读取它时,我得到一个FileNotFound异常。有什么想法吗 代码: 以下是我收到的输出: 找到Java 文件在';在那里,java,javafx-8,Java,Javafx 8,出于某种原因(Java新手),当我试图从我的resources文件夹中读取Excel文件时,它显示它在那里,但当我使用FileInputStream读取它时,我得到一个FileNotFound异常。有什么想法吗 代码: 以下是我收到的输出: 找到文件 应用程序启动方法中的异常 java.lang.reflect.InvocationTargetException 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(
文件
应用程序启动方法中的异常
java.lang.reflect.InvocationTargetException
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:564)
位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplicationWithArgs(LaunchImpl.java:473)
位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication(LaunchImpl.java:372)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:564)
位于java.base/sun.launcher.launchelper$FXHelper.main(launchelper.java:941)
原因:java.lang.RuntimeException:应用程序启动方法中的异常
位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:973)
在javafx.graphics/com.sun.javafx.application.LaunchImpl.lambda$launchApplication$2(LaunchImpl.java:198)
位于java.base/java.lang.Thread.run(Thread.java:844)
原因:java.io.FileNotFoundException:/files/Employees.xlsx(无此类文件或目录)
位于java.base/java.io.FileInputStream.open0(本机方法)
在java.base/java.io.FileInputStream.open(FileInputStream.java:220)
位于java.base/java.io.FileInputStream。(FileInputStream.java:158)
位于java.base/java.io.FileInputStream。(FileInputStream.java:113)
在applicationSettings.openExcelSheet(applicationSettings.java:32)
在loginScreen.start处(loginScreen.java:70)
在javafx.graphics/com.sun.javafx.application.launchempl.lambda$launchApplication1$9(launchempl.java:919)
在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
位于javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
位于java.base/java.security.AccessController.doPrivileged(本机方法)
在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
位于javafx.graphics/com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:96)
运行application LoginsScreen时出现异常如果您的文件位于项目文件夹内,则问题在于删除名称前面的斜杠
fileInputStream = new FileInputStream("Employees.xlsx");
那就行了。如果在项目文件夹中的文件文件夹中,则
fileInputStream = new FileInputStream("files/Employees.xlsx");
或者,您可以提供文件的完整路径,这应该可以正常工作
fileInputStream = new FileInputStream("/users/myfolder/files/Employees.xlsx");
资源不一定是文件;它们可以作为条目存储在.jar
存档中。即使它们作为文件存储在文件系统的目录结构中,工作目录也可能与当前工作目录不匹配。您应该直接使用getResourceAsStream
返回的InputStream
,而不是尝试打开一个新的:
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");
}
问题似乎是代码中的一些错误假设:
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”
,因此文件系统中根本不会有任何内容。这不是一个有效的假设:
- 资源可以是(事实上,通常是)JAR文件或类似文件的成员
- 资源或资源的容器可以动态下载到临时文件或内存中
- 资源可能是动态创建的;e、 由一个聪明的类加载器解密或解压其他东西
您假设“Employees.xlsx”
将具有与文件系统路径相同的资源路径。这几乎可以保证不会发生。(只有将文件系统的根放在类路径上时,才会出现这种情况……)
我不知道你为什么要这么做。根据@fabian的回答,POI允许您从InputStream
打开电子表格。这里不需要FileInputStream
但在资源路径上的资源确实需要FileInputStream
的情况下,可移植的解决方案是将资源复制到临时文件,然后在临时文件上打开FileInputStream
。我今天遇到了同样的问题,我花了大约两个小时才部分解决。真烦人。根据类代码的结构,Java不允许读取方法定义中的文本文件。尝试在main方法中读取它,然后将该FileInputStream对象作为openExcelSheet()方法的输入。让我知道它是否有效:)这是maven吗?…你能打印你收到的错误吗。fileInputStream=newfileinputstream(“/Employees.xlsx”)代码>这表明文件位于当前驱动器/装载的根位置。。。是这样吗?与程序的执行上下文相关的文件存储在哪里?这些解决方案可能都不起作用,我的文件如下:Project/resources/files/Employees.xlsx我的if语句说“file Found”,但我得到一个FileNotFound exception by proj
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");
}