当前位置: 首页 > 知识库问答 >
问题:

将Java资源作为文件访问

钮轩昂
2023-03-14

我正在尝试从类路径/JAR 文件作为文件对象访问资源。我知道这是使用输入流对象的首选方法,但我使用的是需要文件对象的外部库(WorldEdit)。

这是我的代码:

InputStream templStream = "".getClass().getResourceAsStream("/res/template.prom");
System.out.println("templateStream: " + templStream.toString());
File templFile = new File("".getClass().getResource("/res/template.prom").toURI());
System.out.println("templateFile: " + templFile.canRead());

现在,当我还在eclipse中时,访问资源的两种方式都可以完美地工作并产生以下输出:

templStream: java.io.BufferedInputStream@746d1683
templFile: true

但是,在将代码导出到 JAR 存档后,代码将失败:

templStream: sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@47aa261b
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:392)
    at SMCToPROM.main(SMCToPROM.java:101)

因此,我一直在寻找一种方法,要么直接以文件形式访问资源,要么使用InputStream并将该InputStream转换为文件,但没有成功。

最坏情况下的回退解决方案是将 InputStream 复制到文件系统上的文件,然后打开该文件,但我希望这不是必需的。

共有3个答案

吕飞翼
2023-03-14

您可以编写一个由输入流字节数组或字节缓冲区支持的文件包装器对象,然后将其传递到编写不佳的库代码中。

这并不简单,如果您不知道该库在File对象上调用了哪些方法,则需要您为每个方法编写正确的实现。

我在类似的情况下做过一次,但是我知道调用的子集,并且不必正确实现每个方法。你可能会很幸运,库所做的唯一一件事就是调用. getInputStream()并且很容易完成。

暨宸
2023-03-14

您不能以Files的形式直接访问jarred资源。相反,您需要将资源的内容复制到实际文件中,并将其传递给第三方库(您可以使用从getResourceAsInputStream()获得的InputStream()进行此操作)

陆飞龙
2023-03-14

简而言之,您不能这样做,因为资源不是文件。

如果第三方库只想从源读取数据(因此它应该采用InputStream),则第三方库编写得很糟糕,或者该库实际上想要进行特定于文件的操作。

假设这不是可以修复的库中的一个疏忽,您将需要自己实际创建一个文件。尝试调用< code > File . create tempfile(),用资源的内容自己填充该文件,然后将该< code>File对象传递给库。(当然是做完就删)。

 类似资料:
  • 问题内容: Java中是否有一种方法可以在通过类加载器从jar检索的资源上构造File实例? 我的应用程序使用jar(默认)或运行时指定的文件系统目录(用户输入)中的某些文件。我正在寻找一种一致的方式 a)将这些文件作为流加载 b)分别列出用户定义的目录或jar中的目录中的文件 编辑:显然,理想的方法是完全远离java.io.File。有没有办法从类路径加载目录并列出其内容(包含在其中的文件/实体

  • 问题内容: 在我的Spring 3.0应用程序中,我有一些资源。在运行时,我需要其中一些作为(或其他类型)。我该如何找回它们?是否可以正常注射? 问题答案: 这是通过注释执行此操作的最简单方法:

  • ServletContext接口定义了三个方法来访问当前Web应用程序的资源文件,这三个方法如下: l getResourcePaths方法 该方法返回指定Web应用程序目录中的所有子目录和文件,这些返回的目录文件不包括嵌套目录和文件。这些返回的子目录和文件都封装在该方法返回的一个Set对象中。getResourcePaths方法的定义如下: public Set getResourcePaths

  • 问题内容: 我必须阅读一个包含字符串列表的文件。我试图遵循建议这个职位。两种解决方案都需要使用,但使用而不是a 作为参数。 我需要一个。 这篇文章 将 是我的问题,除非OP被劝说不要完全使用文件。如果要使用Apache方法,则需要一个文件,这是我最初遇到的问题的首选解决方案。 我的文件很小(大约一百行),每个程序实例一个文件,因此我不必担心在内存中有另一个文件副本。因此,我可以使用更基本的方法来读

  • 问题内容: 我的/ res / raw /文件夹(/res/raw/textfile.txt)中有一个资源文件,我正在尝试从我的android应用中读取该文件进行处理。 我尝试了不同的路径语法,但始终会遇到 java.io.FileNotFoundException 错误。如何访问/res/raw/textfile.txt进行处理?是 File file = new File(“ res / ra

  • 我正在从主类访问资源文件夹中的文件 我收到了这个错误: 我甚至打开了jar文件,remoteUnitsIdsInOldServer.txt文件就在那里,在类内部