从ZipEntry中获取RandomAccessFile (Java)

3
我在查找有关通过RandomAccessFile读取zip归档文件的内容。所以,我找到了这个示例:http://www.java2s.com/Code/JavaAPI/java.io/RandomAccessFilereadLine.htm。然而这对我不起作用,它告诉我没有这样的文件或目录,但文件路径是正确的。这个示例是否不正确?
更新:来自docs.oracle.com:

RandomAccessFile(String name, String mode)

创建一个随机访问文件流来读取和可选地写入指定名称的文件。

在此示例中,他们尝试使用entryName作为“name”参数创建RAF,这很奇怪。
还有一个同样的示例:http://www.java-tips.org/java-se-tips/java.util.zip/how-to-read-files-within-a-zip-file-3.html

1
我感觉你实际上拥有错误的文件名,很可能是因为未转义的反斜杠。你改过代码吗? - Jon Skeet
这行代码 RandomAccessFile rf = new RandomAccessFile(entryName, "r"); 没有抛出异常。 文件可读,因为如果我使用 ZipFile 和它的方法 getInputStream(ZipEntry),它可以正常工作。 - user1049280
这就是为什么在提问时描述清楚很重要... 当它失败时,entryName的值是多少? - Jon Skeet
没有路径信息等?(老实说,我不确定继续这样的评论是否有益于生产力...) - Jon Skeet
第二个链接现在已经失效,这并不奇怪。不清楚为什么你首先会寻找这样的东西:你肯定找不到。 - user207421
显示剩余6条评论
2个回答

3
我认为这是未经审核的代码在互联网上引起无尽问题的一个例子。
这两个示例中的代码不可能有任何用处。只有在zip文件的内容已被提取到包含zip的文件夹中时,该代码才能起作用。
长话短说:你不能使用ZipEntry来进行RAF操作,因为ZipEntry指的是压缩流。除非解压整个流并缓冲结果,否则无法在流上进行随机访问。
有趣的是:
a)java-tips文章中的代码没有遵循Java的适当命名约定 b)两篇文章中的代码惊人地相似
这是一个展示如何正确使用ZipInputStream的示例代码Here's sample code that shows how to properly use ZipInputStream

Zip条目被压缩,但不加密。 - Puce
考虑使用NIO.2文件API代替使用低级别的ZiPInputStream API。请参阅我的回答。 - Puce
感谢@Puce,我已更新为使用“编码”而不是“加密”(此帖子发布于10年前,很多事情都发生了变化-感谢您添加NIO.2方法!)。 - Kevin Day
编码仍然是另一回事(例如UTF-8)。这里的数据被压缩:https://en.wikipedia.org/wiki/ZIP_(file_format) - Puce
哦,没错,这是一篇旧帖子。奇怪它为什么又冒出来了。 - Puce
1
@Puce 好的 - 我可能可以辩称“编码”是一个通用术语(即UTF-8是字符集编码的一个例子,但“编码”是一个非常广泛的术语),多年来,我绝对看到过“zip编码”的引用 - 但更清晰的描述应该是zip压缩的流,所以我会调整措辞以增加清晰度。 - Kevin Day

0
使用NIO.2文件API(Java 7),处理zip文件变得更加容易。
尝试以下代码(未经测试):
try (FileSystem zipFS =  FileSystems.newFileSystem(URI.create("jar:" + zipURI), Map.of())) {  
    Path targetInZipPath = zipFS.getPath(targetInZipPathString);  

    // do something here 
}   

在此处阅读有关ZIP文件系统(JDK模块jdk.zipfs)的更多信息:https://docs.oracle.com/en/java/javase/17/docs/api/jdk.zipfs/module-summary.html


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