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

jak*_*ake 70 java classpath

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

如果有另一个解决方案寻求某个字节偏移并读取该行,我也对此持开放态度.

joe*_*ohn 227

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

URL url = this.getClass().getResource("/com/path/to/file.txt")
Run Code Online (Sandbox Code Playgroud)

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

File file = new File(url.toURI());
Run Code Online (Sandbox Code Playgroud)

  • 你有什么机会接受这个绿色大滴答案吗?:) (25认同)
  • @jake有235个代表,你现在应该能够将此标记为答案. (18认同)
  • @jake来吧你可以做到:D (18认同)
  • @jake经过这么多年,你现在觉得这个答案能解决你的问题吗?只需点击绿色的东西. (11认同)
  • @jake近6年后仍在等着杰克接受这个答案 (8认同)
  • 工作完美.有人给这个人以答案为荣 (7认同)
  • @jake我们全都支持你做出决定:-) (6认同)
  • @jake Cmon,你可以做到!你可以按下那个按钮! (6认同)
  • - 敲敲.- 谁在那? - 不是杰克:-( (5认同)
  • 如果你爱@jake,你必须让他离开.如果他回来,他总是我们的.如果他没有,他从来没有. (5认同)
  • @jake你有这个.你可以实现它.永远不会太迟. (4认同)
  • 人们,@ jake在StackOverflow上已经有6年了!:) (4认同)
  • 我想要离开@ jake的狂热情绪. (4认同)
  • 您无法点击绿色大绿色标记来接受您提出的问题的答案?我认为你甚至可以在你建立代表之前做到这一点(虽然我可能是错的!).干杯 (3认同)
  • @jake很情绪化! (3认同)
  • 希望你没事@jake.6年没有访问SO确实意味着一个人已停止编码(我希望它就是这样). (3认同)
  • 我仍然坚持@jake.除非正式接受,否则我对使用此答案并不自信. (3认同)
  • 嘿杰克,不要让它变坏拿这个答案然后接受它记住在你的代码中测试它然后你可以开始点击那个复选标记嘿杰克,不要害怕你被接受了这个答案分钟你给这个人信用然后你开始变得更好 (3认同)
  • @杰克:我们相信你。 (2认同)
  • 所以我在这里,等待@jake接受答案,然后在我的代码中实现它。 (2认同)
  • @JordiMiralles显然,它在当前不可接受的状态下不可用。 (2认同)
  • @jake我们对您感到非常失望。非常非常失望。 (2认同)
  • 为什么,杰克,你为什么要这样对我们? (2认同)
  • 来吧@jake你可以做到 (2认同)
  • **@杰克:**你听说过左臂和左腿切断的妖精了吗?**水仙女:**呃....不......**@杰克:**没关系,他现在好了!**水仙女:***沉默***@杰克:***独自笑* (2认同)

Hot*_*tel 46

这也有效,并且不需要/ path/to/file URI转换.如果文件在类路径上,则会找到它.

File currFile = new File(getClass().getClassLoader().getResource("the_file.txt").getFile());
Run Code Online (Sandbox Code Playgroud)

  • 如果资源路径(或相对资源的父路径)包含空格,则此方法不起作用.getFile()返回一个带有%20s的URL编码字符串,File(String)构造函数按字面解释.下面的@joelittlejohn答案将正确处理这种情况,因为它将URI传递给`File`构造函数 (2认同)

Gon*_*ndy 18

我发现这个单行代码最有效和最有用:

File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").getFile());
Run Code Online (Sandbox Code Playgroud)

奇迹般有效.

  • 如果资源路径(或相对资源的父路径)包含空格,则此方法不起作用.getFile()返回一个带有%20s的URL编码字符串,File(String)构造函数按字面解释.下面的@joelittlejohn答案将正确处理这种情况,因为它将URI传递给File构造函数.应该是`File file = new File(ClassLoader.getSystemResource("com/path/to/file.txt").toURI());` (4认同)

Jir*_*era 5

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


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

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


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