思路:使用RandomAccessFile类,先获取文件的总长度,然后设置分片的大小buff,计算出需要分多少块,最后一块存在不满的buff,进行单独的处理。
public static void startMultiPartUpload(String file)
{
RandomAccessFile randomAccessFile = null;
RandomAccessFile out = null;
try{
out = new RandomAccessFile("D:\\data\\xxxx", "rw");
randomAccessFile = new RandomAccessFile(file, "rw");
long fileLength = randomAccessFile.length();
//每个分块为1M
int chunkSize = 1024 * 1024;
byte[] chunkData = new byte[chunkSize];
int offset = 0;
int readLen = 0;
while (true)
{
if (offset >= fileLength) { //当offset偏移与文件长度一致时,停止循环
break;
}
//将指针指向最新的偏移位
randomAccessFile.seek(offset);
if ((readLen = randomAccessFile.read(chunkData, 0, chunkSize)) == -1) //其实此处返回的长度为实际读取到字节数组中的长度
{
break;
}
if(readLen < chunkSize){ //字节数组没有填充满时,进行实际长度的填充
byte[] realChunkData = new byte[readLen];
System.arraycopy(chunkData, 0, realChunkData, 0, readLen);
chunkData = realChunkData;
}
out.write(chunkData);
offset = offset + readLen;
}
}catch(Exception e){
e.printStackTrace();
}finally {
try {
randomAccessFile.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}