如何从类路径中将文件作为文件实例加载/引用


72

我的类路径中有一个文件,例如com/path/to/file.txt。我需要将此文件作为java.io.File对象加载或引用。这是因为我需要使用访问文件java.io.RandomAccessFile(文件很大,并且我需要查找某个字节偏移量)。这可能吗?的构造函数RandomAccessFile需要File实例或字符串(路径)。

如果还有另一种方法寻求某个字节偏移并读取该行,我也很乐意。


有关详细信息,请参见此处的工作端到端示例:[ stackoverflow.com/questions/1464291/…–
ravibeli

Answers:


230

尝试获取您的类路径资源的URL:

URL url = this.getClass().getResource("/com/path/to/file.txt")

然后使用接受URI的构造函数创建一个文件:

File file = new File(url.toURI());

25
您有没有机会接受带有绿色大勾号的答案?:)
joelittlejohn 2010年

18
@jake 235 rep,您现在应该可以将其标记为答案。
约翰·鲁伊斯

18
@jake快来吧:D
塞卡特2014年

8
@jake近6年后,仍在等待jake接受此答案
kshah

11
@jake这些年来,您现在认为这个答案解决了您的问题吗?只需单击绿色的东西。
lpratlong

47

这也可以,并且不需要/ path / to / file URI转换。如果文件在类路径中,则将找到它。

File currFile = new File(getClass().getClassLoader().getResource("the_file.txt").getFile());

1
这对我有用,但对我却没有:URL url = this.getClass()。getResource(“ / com / path / to / file.txt”)。这是因为我正在加载的文件位于名为“ resource”的文件夹中,而不是位于“ this.getClass()”共享的包/文件夹中吗?总之感谢。
thebiggestlebowski

1
答案很简洁。
Harihar Das

3
如果资源路径(或相对资源的父路径)包含空格,则此方法将无效。getFile()返回带有%20s的URL编码的字符串,该字符串由File(String)构造函数按字面意义进行解释。下面的@joelittlejohn答案将正确处理此情况,因为它将URI传递给File构造函数
丹·卡特

19

我发现此单行代码最有效,最有用:

File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").getFile());

奇迹般有效。


这对我有用,是此页面上最干净的答案。
杰里米

5
如果资源路径(或相对资源的父路径)包含空格,则此方法将无效。getFile()返回带有%20s的URL编码的字符串,该字符串由File(String)构造函数按字面意义进行解释。下面的@joelittlejohn答案可以正确处理这种情况,因为它将URI传递给File构造函数。应该是File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").toURI());
丹·卡特

5

或使用InputStream绝对CLASSPATH路径(以/斜杠字符开头)直接使用资源的:


getClass().getResourceAsStream("/com/path/to/file.txt");

或相对的CLASSPATH路径(当您编写的类与资源文件本身位于同一Java包中时,即com.path.to):


getClass().getResourceAsStream("file.txt");


以及这将如何允许原始发布者使用java.io.RandomAccessFile?
joelittlejohn 2010年

我承认,您的回答更为正确,这就是为什么我投票赞成。可以使用该java.io.InputStream.skip(long)方法跳过文件中的某个偏移量,然后例如通过使用该java.io.BufferedReader.readLine()方法读取一行。这个问题还针对其他解决方案,而不仅仅是RandomAccessFile一个。
吉里·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.