使用Apache IO Java执行多线程复制IO操作
我正在开发类似于压缩实用程序的东西,这是一个重大项目所需要的 实用程序所做的是从用户那里获取请求,并开始复制请求的所有文件以生成一个zip文件,最后提供该zip文件以下载回用户 现在的问题是,当多个用户发送请求时,实用程序会启动一个单独的线程(最多可以是定义的最大线程数限制)。实用程序开始并行复制,速度非常慢,就像无法使用一样 我需要一种方法来解决这个问题或任何方法,以便并行复制应该足够快 我使用ApacheCommonsIO进行复制,使用Zip4j库进行压缩 如果(!isFresh),请建议。使用Apache IO Java执行多线程复制IO操作,java,multithreading,io,copy,apache-commons,Java,Multithreading,Io,Copy,Apache Commons,我正在开发类似于压缩实用程序的东西,这是一个重大项目所需要的 实用程序所做的是从用户那里获取请求,并开始复制请求的所有文件以生成一个zip文件,最后提供该zip文件以下载回用户 现在的问题是,当多个用户发送请求时,实用程序会启动一个单独的线程(最多可以是定义的最大线程数限制)。实用程序开始并行复制,速度非常慢,就像无法使用一样 我需要一种方法来解决这个问题或任何方法,以便并行复制应该足够快 我使用ApacheCommonsIO进行复制,使用Zip4j库进行压缩 如果(!isFresh),请建议。
{
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"));
}
}
ArrayList折页=
GeneralInfoDownload.getFilesToDownloadForWorkstep(this.map.get(“部门”));
ArrayList folderFilesToBeZipped=新建ArrayList();
for(字符串名称:foldersNamesToBeZipped){
folderFilesToBeZipped.add(新文件(MasterPath+System.getProperty(“File.separator”)+名称));
}
log.info(“****************复制开始时间戳*******************”+this.map.get(“JID”));
TDFileUtil.copyFilesToDirectory(folderFilesToBeZipped,
新文件(toPcFolder.getAbsolutePath()+File.separator
+“新原件”);
}
}
GeneralInfoDownload.getFilesToDownloadForWorkstep
函数获取要压缩和下载的所有文件
TDFileUtil.copyFilesToDirectory
函数内部使用Apache commons方法copyDirectoryToDirectory
和copyFileToDirectory
当只有一个或两个请求时,这种方法可以很好地工作,但当多个请求排队时,它会变得很慢
这是意料之中的,但是否可以提高性能。(我的意思是可以忍受。)你测量过它在哪里变慢了吗?对性能进行一些分析可以帮助确定瓶颈。还有一些代码会很有帮助。发布一些代码。也许你只需要在zip流下添加一个
BufferedOutputStream
。zip很好,我可以通过SplitStream使其与下载并行。但问题是复制文件。