1. import java.io.File;
    2. import java.io.IOException;
    3. import java.io.RandomAccessFile;
    4. /**
    5. * 文件分块读取
    6. * 将一个文件分成多块进行读取
    7. * 讲道理我觉得一般的FileInputStream用while循环和缓冲容器分批读取一个文件的内容就是一种文件分块读取
    8. * 但不同的是这个程序可以多线程运行,毕竟可以指定开始的位置
    9. * 第一个线程从0读到1k的位置,第二个线程从1.1k读到2k的位置,这样
    10. * 一般的FileInputStream就做不到这样
    11. */
    12. public class Subsection{
    13. public void toBlock() throws IOException {
    14. File src = new File("F:\\Java\\IO Study 02\\src\\Arr.java");
    15. //一共读多少字节:这里读整个文件
    16. long len = src.length();
    17. //每块多大
    18. int blockSize = 1024;
    19. //一共分多少块:文件大小除每块大小并向上取整
    20. int blockNum = (int)Math.ceil(len*1.0/blockSize);
    21. //定义开始位置
    22. int beginPos;
    23. //定义实际上要读多长,因为不一定每一次都会读满一块的内容
    24. int actualSize;
    25. RandomAccessFile raf = new RandomAccessFile(src, "r");
    26. byte[] flush = new byte[blockSize];
    27. int cut, j;
    28. for(int i = 0; i<blockNum; i++){
    29. j = i+1;
    30. //设置开始位置,当i=0即第一块时,从0即第一个字节开始,当i=1即第二块时,从第1024个字节即第一块的最后一个字节的下一个字节开始
    31. beginPos = i * blockSize;
    32. if( i == blockNum-1 ){
    33. //若是最后一块,就读取剩余长度个大小
    34. actualSize = (int)len;
    35. }else{
    36. //若不是最后一块,就将一块读满,然后用文件的大小减去一块的长度,算出剩余长度
    37. actualSize = blockSize;
    38. len -= blockSize;
    39. }
    40. System.out.println("第"+j+"块:从"+beginPos+"开始,读取"+actualSize+"个字节");
    41. raf.seek(beginPos);
    42. cut = raf.read(flush);
    43. if (actualSize > cut) {
    44. System.out.println(new String(flush, 0, cut));
    45. } else {
    46. System.out.println(new String(flush, 0, actualSize));
    47. }
    48. System.out.println("-----------------------------------");
    49. }
    50. raf.close();
    51. }
    52. }