从 .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 文件中读取文本文件的主要内容,如果未能解决你的问题,请参考以下文章
Python - 从文本文件中读取逗号分隔值,然后将结果输出到文本文件[关闭]