我正在进行的项目需要多线程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/