FileNotFoundException while 运行 from a jar

FileNotFoundException while running as a jar

FileInputStream fstream = new FileInputStream("abc.txt")

抛出一个 FileNotFoundExceptionn 而 运行 作为一个 jar。为什么 ?通常它可以从 main 方法中找到 while 运行.

如果您的文件与您的 jar 打包在一起,那么您应该使用 getClass().getResource(url):

获取信息
FileInputStream inputStream = 
new FileInputStream(new File(getClass().getResource(/path/to/your/file/abc.txt).toURI()));

否则你需要始终在与你的 jar 相同的路径中创建它,你可以像你一样获得它:​​

src/myJar.jar
src/folder/abc.txt

FileInputStream fstream = new FileInputStream("folder/abc.txt");

您也可以在这里阅读:

How do I load a file from resource folder? and File loading by getClass().getResource()

这是因为您的工作目录在两种环境下可能会有所不同。尝试添加行

System.out.println(new File("abc.txt").getAbsolutePath());

查看它实际查找文件的位置。

只有当计算机的文件系统上确实有文件时,您才能使用 FileInputStream。当您将文本文件打包到程序的 jar 文件中时,它不是文件系统中的文件。它是 jar 文件中的一个条目。

好消息是在 Java 中更容易以这种方式访问​​文件:它在您的类路径中,因此您可以使用 getResourceAsStream().

InputStream stream = getClass().getResourceAsStream("abc.txt");

如果您的类路径设置正确,无论它是目录中的文件(例如在开发期间)还是 jar 文件中的条目(例如发布时),这都将起作用。

class MyClass{

    InputStream fstream = this.getClass().getResourceAsStream("abc.txt");

}

应该使用此代码。 并且文件(在本例中为 abc.txt)应保存在对象引用 class 位置。这意味着,this.getClass 指的是某个文件夹的位置,即 com/myfolder/MyClass.java 文件夹。

所以我们应该将 abc.txt 保留在 com/myfolder 这个位置。

也许不是最优雅的,但这是您可以涵盖 Scala

中所有选项的方式
def loadFile(path: String) = {
    val f = new File(path)
    if (f.exists) {
      loadFileFromPath(path)
    } else {
      val r = Try {
        val in = ClassLoader.getSystemResourceAsStream(path)
        new InputStreamReader(in)
      }.getOrElse{
        val in = getClass.getResourceAsStream(s"/$path")
        new InputStreamReader(in)
      }
      loadFileFromInputStream(r)
    }
  }