作为jar运行时FileNotFoundException

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

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

如果您的文件与jar一起打包,那么您应该使用getClass().getResource(url)获取信息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"); 

你也可以在这里阅读:

如何从资源文件夹加载文件? 和文件加载由getClass()。getResource()

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

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

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

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

 class MyClass{ InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); } 

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

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

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

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

看看它实际上在哪里寻找文件。

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