最好建网站系统的软件,化妆品产品的自建网站有哪些,简单的响应式网页,简述程序开发的流程一、前言
各位亲爱的们#xff0c;之前介绍过了上传超大文件到MinIO#xff1a;
MinIO分片上传超大文件#xff08;纯服务端#xff09;MinIO分片上传超大文件#xff08;非纯服务端#xff09;
这里最后再补充一下从MinIO下载超大文件。
二、从MinIO分片下载大文件 …一、前言
各位亲爱的们之前介绍过了上传超大文件到MinIO
MinIO分片上传超大文件纯服务端MinIO分片上传超大文件非纯服务端
这里最后再补充一下从MinIO下载超大文件。
二、从MinIO分片下载大文件
2.1、确定文件大小
根据文件名查找MinIO上对应文件的大小。
核心APIminioClient.statObject(StatObjectArgs args)。
StatObjectResponse statObjectResponse minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());
long totalLength statObjectResponse.size();
System.out.println(目标文件总大小: totalLength);2.2、分片下载
这里举例分片大小为1000个字节根据文件总大小计算出分片数最后将每个分片保存下来。
核心APIminioClient.getObject(GetObjectArgs args)。
final long CHUNK_LENGTH 1000;
// 从目标文件开始下载
long startByte 0l;
long chunkCount (long) Math.ceil((double) totalLength / CHUNK_LENGTH);
System.out.println(预计总分片数: chunkCount);
String targetPath C://tmp;
for (long i 0; i chunkCount; i) {GetObjectResponse response minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).offset(startByte).length(CHUNK_LENGTH).build());String chunkFilePath targetPath // (i 1) .part;FileOutputStream fileOutputStream new FileOutputStream(chunkFilePath);byte[] buffer new byte[1024];int bytesRead;while ((bytesRead response.read(buffer)) ! -1) {fileOutputStream.write(buffer, 0, bytesRead);}System.out.println(分片已下载: chunkFilePath 大小: new File(chunkFilePath).length());startByte (i 1) * CHUNK_LENGTH;
}2.3、合并分片
将每个分片文件合并到一个文件里。
String mergedFilePath targetPath // result.txt;
BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(mergedFilePath));
for (long i 0; i chunkCount; i) {String chunkFilePath targetPath // (i 1) .part;BufferedInputStream bis new BufferedInputStream(new FileInputStream(chunkFilePath));byte[] buffer new byte[1024];int bytesRead;while ((bytesRead bis.read(buffer)) ! -1) {bos.write(buffer, 0, bytesRead);}bis.close();
}
bos.close();三、完整测试代码
import io.minio.*;
import java.io.*;public class MinioMain4Download {static CustomMinioClient minioClient new CustomMinioClient(MinioClient.builder().endpoint(http://192.168.2.195:9000).credentials(minioUser, minioUser123).build());// 测试桶static String bucketName test;static {try {boolean found minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!found) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}} catch (Exception e) {throw new RuntimeException(e);}}public static void main(String[] args) throws Exception {// 大小 1295 ByteString fileName 202410181656357348160;// 第一步查询目标文件大小StatObjectResponse statObjectResponse minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());long totalLength statObjectResponse.size();System.out.println(目标文件总大小: totalLength);// 第二步分片下载(最简单的同步方式)// 假设1000个字节作为一个分片final long CHUNK_LENGTH 1000;// 从目标文件开始下载long startByte 0l;long chunkCount (long) Math.ceil((double) totalLength / CHUNK_LENGTH);System.out.println(预计总分片数: chunkCount);String targetPath C://tmp;for (long i 0; i chunkCount; i) {GetObjectResponse response minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).offset(startByte).length(CHUNK_LENGTH).build());String chunkFilePath targetPath // (i 1) .part;FileOutputStream fileOutputStream new FileOutputStream(chunkFilePath);byte[] buffer new byte[1024];int bytesRead;while ((bytesRead response.read(buffer)) ! -1) {fileOutputStream.write(buffer, 0, bytesRead);}System.out.println(分片已下载: chunkFilePath 大小: new File(chunkFilePath).length());startByte (i 1) * CHUNK_LENGTH;}// 第三步合并String mergedFilePath targetPath // result.txt;BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(mergedFilePath));for (long i 0; i chunkCount; i) {String chunkFilePath targetPath // (i 1) .part;BufferedInputStream bis new BufferedInputStream(new FileInputStream(chunkFilePath));byte[] buffer new byte[1024];int bytesRead;while ((bytesRead bis.read(buffer)) ! -1) {bos.write(buffer, 0, bytesRead);}bis.close();}bos.close();System.out.println(合并完成);}
}