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(); }}