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

4

我有一个初学者问题。

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

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

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

我稍微了解了一下如何向.jar文件本身添加文本文件,并使用InputStream和BufferedReader类来读取文件,但我从未使用过这些类,也不知道它们与File和Scanner类有什么不同/如何使用它们。

有人能帮帮我吗?


你是不是把同一个文件和jar包放在一起了? - greatmajestics
2个回答

3

由于它是一个嵌入式资源,因此需要通过URL检索文件。有关更多详细信息,请参见嵌入式资源Wiki

更新

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

不对。如果它在Jar包中的“Resource”路径下,字符串应为:

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

如果它在“资源”路径中:resources
..getResource("/resources/champdata.txt");

这个字符串需要完全匹配字母,包括大小写 (plurality &)。


但是,如果我将程序分发到另一台计算机上,那么URL不会指向我的计算机上的目录而无法工作吗? - Dave
如果您按照链接页面中的说明形成URL,为什么不尝试一下呢? - Andrew Thompson
那么,如果我将文本文件放在src文件夹中的“Resource”文件夹中,我要使用的URL是“resources/champdata.txt”吗?还是我漏掉了什么... - Dave
错误的大小写和复数只是我在评论框中犯的一个错误,但我认为这可能暂时回答了我的问题。 - Dave

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类是做什么的? - Dave
1
输入流是可以从中读取数据的东西,它是一个抽象层,可以包装任何文件或URL(网页,通过URL可访问的任何资源)后面的数据。InputStream是基类,JDK提供了多个子类,如FileInputStream专门用于文件,AudioInputStream用于音频,ByteArrayInputStream用于从byte[]读取等等。请查看此处的文档:http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接