作为jar运行时FileNotFoundException

时间:2017-01-20 11:03:49

标签: java jar filenotfoundexception

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

在作为jar运行时抛出FileNotFoundExceptionn。为什么?通常它可以在从main方法运行时找到。

5 个答案:

答案 0 :(得分:2)

如果您的文件与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?File loading by getClass().getResource()

答案 1 :(得分:2)

class MyClass{

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

}

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

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

答案 2 :(得分:1)

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

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

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

如果正确设置了类路径,无论是目录中的文件(例如开发期间)还是jar文件中的条目(例如发布时),都可以使用。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

也许不是最优雅的,但这就是你如何涵盖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)
    }
  }