【问题标题】:How to read a text file inside a JAR? [duplicate]如何读取 JAR 中的文本文件? [复制]
【发布时间】:2013-06-01 23:28:03
【问题描述】:

我试图做的是在程序的 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 时,在我的资源文件夹中,我用于图标的图片在那里,但不是文本文件。

【问题讨论】:

  • 描述“不起作用”的含义。如果您遇到错误,请向我们显示错误。
  • “我检查了我的 JAR 是否正在打包文本文件” 聪明的举动。 :)
  • 是的,我不完全确定为什么在我使用 Eclipse 导出 Runnable JAR 时不包含它。
  • “我用于图标的图片在那里,但不是文本文件。” 这必须在任何答案之前解决首先工作。以防万一在这方面有任何混淆。您可能 1) 显着编辑此问题.. 或 2) 就 Eclipse 构建中缺少的资源提出一个新问题。

标签: java file text jar embedded-resource


【解决方案1】:

您不能在 JAR 文件中使用 File。需要使用 InputStream 来读取文本数据。

BufferedReader txtReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/mytextfile.txt")));

// ... Use the buffered reader to read the text file.

【讨论】:

  • 这在尝试获取文件时也会抛出 NullPointerException。
【解决方案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
}

【讨论】:

  • 代码在以下位置遇到 NullPointerException:streamReader = new InputStreamReader(inputStream, "UTF-8");
【解决方案3】:

您的代码将无法编译。 Class.getResource() 返回一个URL,而File 没有以URL 作为参数的构造函数。

您可以直接使用.getResourceAsStream(),它直接返回InputStream,您只需从该流中读取文件的内容。

注意:如果找不到资源,这两种方法都会返回null:不要忘记检查...

【讨论】:

  • 截至目前,我从 InputStream 返回的所有内容都是空的,但文件在那里。
  • 这里还有一个问题。您的图片加载正确吗?
  • 图像加载正确,但到目前为止,文本文件是唯一让我无法理解的东西。
  • 尝试在路径前加上 /。另外,尝试将此文件放在与图像相同的位置,使用相同的路径,看看它是否加载。
  • 尝试使用前缀 / 并且文件 (howto.txt) 位于同一文件夹位置。
【解决方案4】:

文本文件的内容将被添加到JEditorPane

参见DocumentVewer,尤其是JEditorPane.setPage(URL)

由于帮助是,因此有必要使用getResource(String) 获得URL,如info. page 中所述。

.. 试过这个:URL url = this.getClass().getResource("resources/howto.txt");

变化:

URL url = this.getClass().getResource("resources/howto.txt");

收件人:

URL url = this.getClass().getResource("/resources/howto.txt");  // note leading '/'

【讨论】:

  • 我阅读了这些并尝试了这个: URL url = this.getClas.getResource("resources/howto.txt"); howtoScreen.setPage(url);使用那段代码,我得到了一个错误的 url 异常,所以我的程序无法找到该文件?
  • 很遗憾,这不起作用。
  • 所以howto.txt 是那个,而不是HowTo.txt(大小写很重要)?资源在 Jar resources/howto.txt 的路径中?提供jar -tvf the.jar的输出
  • 是的,文本是“howto.txt”,没有大写字母。而且我不确定你想从“jar -tvg the.jar”中得到什么。我猜这是某种命令行?
  • 那是 jar -tvf the.jar 的内容列表,是的,来自命令行。
猜你喜欢
  • 2019-08-23
  • 2013-05-26
  • 2016-07-06
  • 2018-10-14
  • 2014-05-24
  • 2012-10-09
  • 2012-12-25
  • 2016-08-04
  • 2011-03-21
相关资源
最近更新 更多