使用Apache IO Java执行多线程复制IO操作

使用Apache IO Java执行多线程复制IO操作,java,multithreading,io,copy,apache-commons,Java,Multithreading,Io,Copy,Apache Commons,我正在开发类似于压缩实用程序的东西,这是一个重大项目所需要的 实用程序所做的是从用户那里获取请求,并开始复制请求的所有文件以生成一个zip文件,最后提供该zip文件以下载回用户 现在的问题是,当多个用户发送请求时,实用程序会启动一个单独的线程(最多可以是定义的最大线程数限制)。实用程序开始并行复制,速度非常慢,就像无法使用一样 我需要一种方法来解决这个问题或任何方法,以便并行复制应该足够快 我使用ApacheCommonsIO进行复制,使用Zip4j库进行压缩 如果(!isFresh),请建议。

我正在开发类似于压缩实用程序的东西,这是一个重大项目所需要的

实用程序所做的是从用户那里获取请求,并开始复制请求的所有文件以生成一个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使其与下载并行。但问题是复制文件。