我在很多方面尝试了这个,并遵循了几个在线说明,例如 - Eclipse exported Runnable JAR not showing images 但到目前为止,没有成功。
我有一个非常简单的程序,它读取文本文件(test.txt)并将其内容打印到标准输出。我正在使用Eclipse。这就是我所做的 -
非常感谢任何帮助。
附录: 这是代码。
public class FileIOTest {
public static void main(String[] args) {
String line;
try {
BufferedReader br = new BufferedReader(new FileReader(new File("/test.txt")));
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
}
catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}
}
答案 0 :(得分:6)
您无法通过FileReader
访问Jar文件中的资源,因为它不是文件系统上的文件。 Java确实有一种机制来访问类路径中的资源(包括在Jars中):ClassLoader.getResourceAsStream()。您可以将它与默认的类加载器一起使用:
BufferedReader br = new BufferedReader(new InputStreamReader(
ClassLoader.getSystemClassLoader()
.getResourceAsStream("resource/test.txt")));
请注意getResourceAsStream
返回null
而不是抛出异常,因此您可能需要先获取流,检查是否为null
,然后抛出异常或处理它。
您需要将jar中的完整路径作为路径。
答案 1 :(得分:1)
文件与资源的工作方式不同。如果您需要资源,那么您不应该尝试使用任何File(Xxx)
变体,这些变体将在文件系统上查找。
您提供的链接,使用Class.getResource
返回一个网址,但还有Class.getResourceAsStream
返回InputStream
,您可以将其包含在InputStreamReader
中。例如
InputStream is = FileIOTest.class.getResourceAsStream("/text.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
答案 2 :(得分:1)
你可以创建没有eclipse的jar。例如,如果我在包Demo
中有src
类(目录相同),并且资源文件(名为testing.txt
)在resources
目录中。我在目录的根目录中添加了一个Manifest.txt
文件:
Manifest-Version: 1.0
Main-Class: src.Demo
Demo
类看起来像:
package src;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo {
public static void main(String... args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(Demo.class.getResourceAsStream("/resources/testing.txt"))))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
testing.txt
文件就像:
hello world
How are you?
编译Demo.java
以获取Demo.class
javac src/Demo.java
创建jar
jar cfm myJar.jar Manifest.txt src/* resources/*
然后运行它
java -jar myJar.jar
在eclipse中,只需在类路径中添加resources文件夹(确保它在jar中),并将其作为类路径资源(getResourceAsStream
方法)读取