将JAR资源作为文件流打开

5
我有一个项目,我想从另一个项目中访问JAR文件中的资源。由于它不在我的类路径中,因此ClassLoader不是一个选项。我尝试过:

new FileInputStream("C:\\mydir\\my.jar!\\myresource.txt");

但是遇到了FileNotFoundException的错误。
JarInputStream可能是一种可能性,但是我希望输入文件名既可以是JAR资源,也可以是系统上的文件(由用户决定)。是否有一个类可以做到这一点,还是我必须自己构建一个?

1
不确定是否有帮助,但是jar文件基本上就是zip文件,因此如果您可以从zip文件中读取某些内容,那么您也可以以同样的方式从jar文件中读取它--也许这可以扩大您的搜索范围。 - Mark Elliot
1
@Mark - JAR文件本质上是ZIP文件,但目前只是如此。传言称JAR格式在Java 7中将发生变化。希望使用适当的抽象类可以使任何JAR操作代码具备未来兼容性(请参阅java.util.jar包)。 - McDowell
6个回答

3

1

0
  private InputStream twistLid(File jar, String resource) throws IOException {
    return new URL("jar:" + jar.toURI() + "!" + resource).openStream();
  }

0

在许多人的工作基础上,这里提供一个Groovy示例,列出了位于jar文件根目录下名为“resources”的文件夹中的'resource.txt'文本内容。

import java.io.*
import java.util.*
import java.util.jar.*

def getJarResourceAsStream(String jarName, String resource) throws IOException {
    def resourceStr = 'jar:' + (new File(jarName)).toURI() + '!' + resource
    return new URL(resourceStr).openStream()
}

def inputStream = getJarResourceAsStream('/some/file/path/myJar.jar', '/resources/resource.txt')

def reader = new InputStreamReader(inputStream)
BufferedReader buffer = new BufferedReader(reader)
String line
while((line = buffer.readLine()) != null) {
    System.out.println(line)
}

0

尝试使用URLClassLoader。我以前也做过类似的事情,它似乎可以工作(如果您在安全的JVM中,则可能需要修改安全策略文件)。


0

尝试使用java.net.JarURLConnection

URL url = new URL("jar:file:C:\mydir\my.jar!\myresource.txt");

JarURLConnection jarConnection = (JarURLConnection)url.openConnection();


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