我试图做的是在程序的JAR中存储一个文本文件(不会改变),以便可以读取它。文本文件的目的是它将被我的一个类读入,文本文件的内容将被添加到JEditorPane
。该文件基本上是一个教程,当用户点击阅读教程的选项时,文件内容将被读取并显示在弹出的新窗口中。
我的GUI部分已经关闭了,但是为了将文件存储在JAR中以便可以访问它,我很遗憾。我已经读到使用InputStream
会起作用,但在尝试了一些事情之后我还没有让它工作。
我还将图像存储在JAR中,以用作GUI窗口的图标。这是通过以下方式完成的:
private Image icon = new ImageIcon(getClass()
.getResource("resources/cricket.jpg")).getImage();
但是,这在尝试获取文件时不起作用:
private File file = new File(getClass.getResource("resources/howto.txt"));
这是我现在的课程:
public class HowToScreen extends JFrame{
/**
*
*/
private static final long serialVersionUID = -3760362453964229085L;
private JEditorPane howtoScreen = new JEditorPane("text/html", "");
private Image icon = new ImageIcon(getClass().getResource("resources/cricket.jpg")).getImage();
private BufferedReader txtReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/howto.txt")));
public HowToScreen(){
setSize(400,300);
setLocation(500,200);
setTitle("Daily Text Tutorial");
setIconImage(icon);
howtoScreen.setEditable(false);
howtoScreen.setText(importFileStream());
add(howtoScreen);
setVisible(true);
}
public String importFile(){
String text = "";
File file = new File("howto.txt");
Scanner in = null;
try {
in = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while(in.hasNext()){
text += in.nextLine();
}
in.close();
return text;
}
public String importFileStream(){
String text = "";
Scanner in = new Scanner(txtReader);
while(in.hasNext()){
text += in.nextLine();
}
in.close();
return text;
}
}
忽略正在移除的importFile
方法,以便将教程文件存储在JAR中,使程序完全自包含,因为我只能使用程序可以使用多少空间。
编辑: 在尝试了下面的所有建议之后,我检查了我的JAR是否正在将文本文件打包在其中而事实并非如此。用7zip打开JAR时,在我的资源文件夹中,我用于图标的图片就在那里,但不是文本文件。
答案 0 :(得分:11)
您无法在JAR文件中使用File。您需要使用InputStream来读取文本数据。
BufferedReader txtReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/mytextfile.txt")));
// ... Use the buffered reader to read the text file.
答案 1 :(得分:2)
尝试下一个(使用完整路径包):
InputStream inputStream = ClassLoader.getSystemClassLoader().
getSystemResourceAsStream("com/company/resources/howto.txt");
InputStreamReader streamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader in = new BufferedReader(streamReader);
for (String line; (line = in.readLine()) != null;) {
// do something with the line
}
答案 2 :(得分:1)
您的代码无法编译。 Class.getResource()
返回URL
,File
没有构造函数,其中URL
为参数。
您只需使用.getResourceAsStream()
,它会直接返回InputStream
,您只需要从该流中读取该文件的内容。
注意:如果找不到资源,这两个方法都返回null
:不要忘记检查...
答案 3 :(得分:1)
文本文件的内容将添加到
JEditorPane
。
见DocumentVewer
&特别是JEditorPane.setPage(URL)
。
由于帮助是embedded-resource,因此需要URL
使用getResource(String)
获取URL url = this.getClass().getResource("resources/howto.txt");
,详见info. page。
..试过这个:
URL url = this.getClass().getResource("resources/howto.txt");
变化:
URL url = this.getClass().getResource("/resources/howto.txt"); // note leading '/'
致:
{{1}}