java - 多线程 Zip 文件读取器

标签 java multithreading zip

我正在进行的项目需要多线程Zip文件阅读器。当我说多线程时,我的意思是例如有两个线程并且都尝试读取同一个文件,所以我需要在两个单独的线程上创建输入流的东西,这样zip 文件不会损坏。我想知道是否有任何可用的现有代码可以完成这项工作,因为我不想重新发明轮子。

此外,如果代码只为我提供在单独线程上创建的缓冲读取器的新实例,这样我就可以使用读取器并继续我的工作,这也是很好的。此外,代码还必须处理线程池,并在工作完成后将其自身从线程池中删除。

最佳答案

首先,正如我在上面的评论中所写,磁盘 IO 是一个瓶颈,有时当已经有一个打开的文件描述符时您无法访问文件。

这是一个很大的问题,但作为一些深思熟虑的东西,您可以在每个线程中打开一个 FileInputStream ,然后在它们之间同步您正在读取的位置。

假设我们有两个流:

FileInputStream f1 = new FileInputStream("test.zip"),
  f2 = new FileInputStream("test.zip");

您可以像平常一样读取,然后在一个线程中读取一些字节后skip(long n)。假设您使用 f1 读取 10 个字节,那么您需要在读取 f2 之前执行 f2.skip(10),因为它会返回否则相同的字节。当然,假设这就是您想要的。

读取 Zip 文件的 header 后,您可以确定存档的所有各个部分在文件中的位置,并分别读取这些确切的 block 。但是,正如 Dave Newton 正确指出的那样,您应该使用定义良好的库来读取 Zip 文件。

关于java - 多线程 Zip 文件读取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262400/

相关文章:

java - 生产者消费者多线程为什么需要Thread.sleep?

java - 在Java中压缩现有文件的简单方法?

java - 如何在Java中滚动文本输出?

java - spring messages.properties 使用变量名

c# - 进程线程(或整个进程)是否被挂起

python - 在 Python 中并行化列表理解

javascript - Google Drive API - 使用 JSZip 获取文件和压缩返回损坏的文件

java - 为什么 ZipInputStream 无法读取 ZipOutputStream 的输出?

java - 如何为 AWS Lambda 函数指定自定义配置?

java - Apache 的 HttpAsyncClient 在执行后永远不会返回