从 .jar 文件中读取文本文件

Posted

技术标签:

【中文标题】从 .jar 文件中读取文本文件【英文标题】:Reading a Text File From a .jar File 【发布时间】:2012-10-09 06:56:08 【问题描述】:

我有一个菜鸟问题。

我目前正在编写一个程序,该程序使用 File 和 Scanner 类从文本文件中获取大量数据,如下所示:

   File data = new File("champdata.txt");
   Scanner read = new Scanner(data);
   read.useDelimiter("%");

然后扫描程序在 IDE 中正确地从文本文件中检索数据,但是当我将程序作为 .jar 文件运行时,无法检索该文件。

我已经阅读了一些关于将文本文件添加到 .jar 文件本身以及使用 InputStream 和 BufferedReader 类来读取文件的内容,但我从未使用过这些类,也不了解它们的不同之处/如何使用它们来代替 File 和 Scanner 类。

谁能帮帮我?

【问题讨论】:

你是用 jar 放同一个文件吗? 【参考方案1】:

有必要通过 URL 检索文件,因为它是嵌入式资源。有关详细信息,请参阅embedded resource Wiki。

更新

因此,如果我将文本文件放在 src 文件夹中的“Resource”文件夹中,我将使用的 URL 是“resources/champdata.txt”

没有。如果它在 Jar 中的 Resource 路径中,则字符串需要是:

..getResource("/Resource/champdata.txt");

如果在resources路径中:

..getResource("/resources/champdata.txt");

字符串必须是精确的字母,(plurality &) 大小写。

【讨论】:

但是如果我将程序分发到另一台计算机上,URL会不会指向我计算机上的目录而无法工作? 如果您根据该链接页面中的说明形成 URL,则不会。为什么不试试呢? 所以如果我将文本文件放在 src 文件夹的“Resource”文件夹中,我使用的 URL 是“resources/champdata.txt”?还是我在这里遗漏了什么…… 不正确的大小写和复数只是我在评论框中的一个错误,但我认为现在可能已经回答了我的问题【参考方案2】:

Scanner 类有一个构造函数Scanner(InputStream);所以你仍然可以像以前一样使用这个类来读取数据。

您所要做的就是从 Jar 中读取文件,您可以这样做:

InputStream is = getClass().getResourceAsStream("champdata.txt");
Scanner read = new Scanner(is);
read.useDelimiter("%");

名为champdata.txt 的文件位于您的jar 文件的根目录(这只是一个zip 文件,您可以使用任何解压缩器来验证文件的位置)。

现在,如果您想在 IDE 中开发时拥有相同的功能,请将文件放在源目录中,以便在构建项目时将其放在您的 classes 文件夹中。这样,可以使用getResourceAsStream() 如上所述加载文件

【讨论】:

效果很好,非常感谢您的帮助。您能否也简单地向我解释一下 InputStream 类的作用? 输入流是您可以从中读取数据的东西,它是一种抽象,可以将数据包装在任何文件或 url(网页,可通过 url 访问的任何资源)后面。 InputStream 是基类,JDK 提供了它的多个子类,例如 FileInputStream 专门用于文件,AudioInputStream 用于音频,ByteArrayInputStream 用于从byte[] 读取,等等。看看这里的文档:docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

以上是关于从 .jar 文件中读取文本文件的主要内容,如果未能解决你的问题,请参考以下文章

Java 读取PDF中的文本和图片

怎么用java读取pdf文件内容

Python - 从文本文件中读取逗号分隔值,然后将结果输出到文本文件[关闭]

从文本文件中读取第一行而不将整个文本文件加载到内存中

关闭并重新启动可执行文件后,无法修改或删除由我的 .jar 可执行文件创建的文本文件

从 Web 服务器上的文本文件中读取文本 [重复]