RandomAccessFile分割、还原文件(三)
RandomAccessFileadmin 发布于:2015-12-21 13:41:48
阅读:loading
关于前面两篇分割、还原文件的介绍,示例代码运行无误,但发现遇到分割3.xxG大小的操作系统文件时,却出现错误,错误原因为:Exception in thread "main" java.io.IOException: Negative seek offset 意思是说指针位置指向的错了,后来分析半天代码发现在代码实现中定义的分割文件的大小用的int类型,而在参与指针位置计算的时候有long类型的参与,但结果还是ing类型的,可能是int越界吧,成了负数导致,将int修改为long类型的即可。另外还有一个地方计算分割文件的开始、结束位置时采用另外一种运算,感觉这种begin、end范围更加科学,代码参考如下:
package com;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 按指定文件大小分割文件
*
* @author chendd
*
*/
public class SplitFileCore {
private long blockLength;// 分割单个文件大小
public SplitFileCore(int blockLength) {
this.blockLength = blockLength;
}
public void split(File srcFile, String splitFolder) throws Exception {
long fileLens = srcFile.length();// 文件大小
if (fileLens <= this.blockLength) {
System.out.println("分割的文件大小 " + this.blockLength + " 大于文件的大小!");
return;
}
RandomAccessFile raf = new RandomAccessFile(srcFile, "r");
// 根据分割块大小,计算一共有多少块文件
int blockCount = (int) (fileLens % this.blockLength);
if (blockCount == 0) {
blockCount = (int) (fileLens / this.blockLength);
} else {
blockCount = (int) (fileLens / this.blockLength) + 1;
}
// 按快进行读取文件
String srcFileName = srcFile.getName();
for (int i = 0; i < blockCount; i++) {
File destFile = new File(splitFolder + File.separator + srcFileName
+ "." + (i + 1) + ".part");
splitFileDetail(i , destFile, raf);// 分割文件
}
if (raf != null) {
raf.close();
}
}
private void splitFileDetail(int index, File destFile, RandomAccessFile raf)
throws IOException {
byte b[] = new byte[1024];
int lens = 0;
// 如果文件目录不存在,则创建
if (destFile.getParentFile().exists() == false) {
destFile.getParentFile().mkdirs();
}
long begin = index * blockLength;
long end = begin + this.blockLength;
raf.seek(begin);// 设置开始读取的位置
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
while ((lens = raf.read(b)) != -1) {
// 判断文件读取的大小,避免已经读取超过每块的大小了
long currentReadPoint = raf.getFilePointer();//当读取位置
if (currentReadPoint > end) {
break;
}
bos.write(b, 0, lens);
}
if (bos != null) {
bos.flush();
bos.close();
}
}
public static void main(String[] args) throws Exception {
//File srcFile = new File("d:\\splitFolder\\中国政区2500.jpg");
File srcFile = new File("d:\\splitFolder\\123.iso");
String splitFolder = "d:\\splitFolder";// 分割存储路径
//SplitFileCore splitFile = new SplitFileCore(1024 * 1024 * 1);// 按1M的大小去分割文件
SplitFileCore splitFile = new SplitFileCore(1024 * 1024 * 100);// 按1M的大小去分割文件
splitFile.split(srcFile, splitFolder);
System.out.println("文件分割完毕...");
}
}
点赞