import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 文件分块读取
* 将一个文件分成多块进行读取
* 讲道理我觉得一般的FileInputStream用while循环和缓冲容器分批读取一个文件的内容就是一种文件分块读取
* 但不同的是这个程序可以多线程运行,毕竟可以指定开始的位置
* 第一个线程从0读到1k的位置,第二个线程从1.1k读到2k的位置,这样
* 一般的FileInputStream就做不到这样
*/
public class Subsection{
public void toBlock() throws IOException {
File src = new File("F:\\Java\\IO Study 02\\src\\Arr.java");
//一共读多少字节:这里读整个文件
long len = src.length();
//每块多大
int blockSize = 1024;
//一共分多少块:文件大小除每块大小并向上取整
int blockNum = (int)Math.ceil(len*1.0/blockSize);
//定义开始位置
int beginPos;
//定义实际上要读多长,因为不一定每一次都会读满一块的内容
int actualSize;
RandomAccessFile raf = new RandomAccessFile(src, "r");
byte[] flush = new byte[blockSize];
int cut, j;
for(int i = 0; i<blockNum; i++){
j = i+1;
//设置开始位置,当i=0即第一块时,从0即第一个字节开始,当i=1即第二块时,从第1024个字节即第一块的最后一个字节的下一个字节开始
beginPos = i * blockSize;
if( i == blockNum-1 ){
//若是最后一块,就读取剩余长度个大小
actualSize = (int)len;
}else{
//若不是最后一块,就将一块读满,然后用文件的大小减去一块的长度,算出剩余长度
actualSize = blockSize;
len -= blockSize;
}
System.out.println("第"+j+"块:从"+beginPos+"开始,读取"+actualSize+"个字节");
raf.seek(beginPos);
cut = raf.read(flush);
if (actualSize > cut) {
System.out.println(new String(flush, 0, cut));
} else {
System.out.println(new String(flush, 0, actualSize));
}
System.out.println("-----------------------------------");
}
raf.close();
}
}