JAVA并发处理大文件切分

简介: JAVA并发处理大文件切分

业务需要将大文件切分成一块一块的小文件进行传输,接收方需要将一块一块的文件组装起来,起到快速上传的功能。代码如下:

@SpringBootTest(classes= {AppApplication.class})
@RunWith(SpringRunner.class)
publicclassFileReadTest {
privatestaticfinalintCHUNK_SIZE=8*1024*1024; // 8MB chunk sizeprivatestaticfinalintMAX_CONCURRENT_UPLOADS=10; // Maximum number of concurrent uploads@TestpublicvoidtestFileUploadList() throwsIOException, NoSuchAlgorithmException, ExecutionException, InterruptedException {
StringfilePath="C:\\tools\\openjdk-17.0.2_windows-x64_bin.zip";
ExecutorServiceexecutorService=Executors.newFixedThreadPool(MAX_CONCURRENT_UPLOADS);
List<Future<String>>futureList=newArrayList<>();
try (InputStreamis=newFileInputStream(filePath)) {
Filefile=newFile(filePath);
longfileSize=file.length();
intchunkIndex=0;
intbytesRead=0;
byte[] buffer=newbyte[CHUNK_SIZE];
intreadSum=0;
while ((bytesRead=is.read(buffer)) !=-1&& (fileSize-readSum) >0) {
readSum+=bytesRead;
Stringmd5=DigestUtils.md5Hex(buffer);
Stringnewurl="";
StringbytesStr=chunkIndex*CHUNK_SIZE+"-"+Math.min((chunkIndex+1) *CHUNK_SIZE-1, fileSize-1) +"/"+fileSize;
FileTransRequestfileTransRequest=newFileTransRequest(newurl,buffer,bytesStr,chunkIndex,bytesRead,null,md5);
Future<String>future=executorService.submit(fileTransRequest);
futureList.add(future);
chunkIndex++;
if(fileSize-readSum<CHUNK_SIZE){
buffer=newbyte[(int)(fileSize-readSum)];
                }else{
buffer=newbyte[CHUNK_SIZE];
                }
            }
        }
if(futureList.size()>0){
for(Future<String>future:futureList){
Stringres=future.get();
if(StringUtils.hasText(res)){
System.out.println(res);
                }
            }
        }
executorService.shutdown();
    }
}
publicclassFileTransRequestimplementsCallable<String> {
privateStringurl;
privatebyte[] buffer;
privateStringbytesStr;
privateintchunkIndex;
privateintchunkSize;
privateMap<String, String>httpHeaderMap;
privateStringmd5;
publicFileTransRequest(Stringurl,
byte[] buffer,
StringbytesStr,
intchunkIndex,
intchunkSize,
Map<String, String>httpHeaderMap,
Stringmd5){
this.url=url;
this.buffer=buffer;
this.bytesStr=bytesStr;
this.chunkIndex=chunkIndex;
this.chunkSize=chunkSize;
this.httpHeaderMap=httpHeaderMap;
this.md5=md5;
    }
@OverridepublicStringcall() throwsException {
returnchunkIndex+"=="+chunkSize+"==="+md5+">>>"+DigestUtils.md5Hex(buffer);
    }
}

可以在FileTransRequest类中实现文件的网络传输的功能,在FileReadTest类中可以实现处理并发结束以后的文件合并以及将结果存储起来的功能,使用到了apache common-codec的获取文件分块的md5的技术,可以在服务器端对文件的完整性做校验。

目录
相关文章
|
1月前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
31 1
|
1月前
|
Java
java中替换文件内容
java中替换文件内容
14 1
|
1月前
|
Java API
Java中文件与输入输出
Java中文件与输入输出
|
1月前
|
Java
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
10 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
1月前
|
存储 Java 文件存储
如何用 Java 压缩 ZIP 文件?
【2月更文挑战第21天】
34 1
|
1月前
|
Java
Java实现文件和目录的管理
Java实现文件和目录的管理
29 0
|
5天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
31 3
|
1月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
94 3