FileInputStream fstream = new FileInputStream("abc.txt")
在作为jar运行时抛出FileNotFoundExceptionn。为什么?通常它可以在从main方法运行时找到。
答案 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)
}
}