使用Apache IO的多线程副本IO操作Java
问题描述:
我正在开发类似主项目中所需的压缩实用程序。使用Apache IO的多线程副本IO操作Java
实用程序所做的是接受用户的请求并开始复制要求制作压缩文件的所有文件,并最终提供该压缩文件以便下载回用户。
现在的问题是,当多个用户发送请求,然后实用程序启动一个单独的线程(最多可以限制的线程数最大限制)。实用程序开始并行复制并变得非常慢,无法使用。
我需要一种方法来解决这个或任何任何方法,以便并行复制应该足够快。
我使用Apache commons io进行复制和Zip4j库进行压缩。
请建议。
答
if (!isFresh) {
ArrayList<String> foldersNamesToBeZipped =
GeneralInfoDownload.getFilesToDownloadForWorkstep(this.map.get("DEPARTMENT"));
ArrayList<File> folderFilesToBeZipped = new ArrayList<File>();
for (String name : foldersNamesToBeZipped) {
folderFilesToBeZipped.add(new File(MasterPath + System.getProperty("file.separator") + name));
}
log.info("****************Copying start TimeStamp***************" + this.map.get("JID"));
TDFileUtil.copyFilesToDirectory(folderFilesToBeZipped,
new File(toPcFolder.getAbsolutePath() + File.separator
+ "NEW_ORIGNALS"));
}
}
GeneralInfoDownload.getFilesToDownloadForWorkstep
函数获取所有要压缩和下载的文件。
TDFileUtil.copyFilesToDirectory
函数里面使用Apache commons方法copyDirectoryToDirectory
和copyFileToDirectory
。
当只有一个或两个请求时,它可以正常工作,但当多个请求排队时,它会变慢。
这是预料之中,但是有任何性能提升可以完成。 (我的意思是说它只是可以忍受的。)
+0
压缩很好,我可以使用SplitStream下载Parellel。但问题是复制文件。 – 2013-03-18 09:03:58
你是否测量过缓慢?一些分析性能消失的地方可能有助于确定瓶颈。还有一些代码会有帮助。 – Markus 2013-03-18 06:25:10
发布一些代码。可能你只需要在zip流下添加一个'BufferedOutputStream'。 – EJP 2013-03-18 06:42:18