Java 文件在';在那里

Java 文件在';在那里,java,javafx-8,Java,Javafx 8,出于某种原因(Java新手),当我试图从我的resources文件夹中读取Excel文件时,它显示它在那里,但当我使用FileInputStream读取它时,我得到一个FileNotFound异常。有什么想法吗 代码: 以下是我收到的输出: 找到文件 应用程序启动方法中的异常 java.lang.reflect.InvocationTargetException 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(

出于某种原因(Java新手),当我试图从我的resources文件夹中读取Excel文件时,它显示它在那里,但当我使用FileInputStream读取它时,我得到一个FileNotFound异常。有什么想法吗

代码:

以下是我收到的输出:

找到
文件
应用程序启动方法中的异常
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");
    }