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)
}
}
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)
}
}