使用RandomAccessFile完成对文件的切分

本文介绍了一种使用Java的RandomAccessFile类将大文件切分为指定大小块的方法,并展示了如何逐块读取这些文件块。通过计算文件的总长度和设定的块大小,程序能够确定文件将被切分为多少个块,并打印出每个块的起始位置和大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:将一个文件中的内容切分,并显示切分多少块及每块的内容。

代码如下:

public class RandomAccessFileTest {
    public static void main(String[] args) {
    //doc.txt文件内容随机
        File file = new File("doc.txt");
        //整个文件的大小
        long length = file.length();
        //规定块的大小
        int blockSize = 1024;
        //文件可以被切分成多少个块
        int size = (int)Math.ceil(length*1.0/blockSize);
        System.out.printf("要被切成%d块",size);
        System.out.println();

        int beginPos = 0;
    int actualSize = (int)(blockSize>length?length:blockSize);
    for(int i = 0;i<size;i++){
        //每次读取块的时候的起始偏移量
        beginPos = i*blockSize;
        if(i==size-1){
            actualSize = (int)length;
        }else {
            actualSize = blockSize;
            length -= actualSize;
        }
        System.out.println(i+"--起始位置是:"+beginPos+"---读取的大小是:"+actualSize);
        readSplit(i,beginPos,actualSize);
    }
}

public static void readSplit(int i,int beginPos,int actualSize){
    RandomAccessFile randomAccessFile = null;
    try {
        randomAccessFile = new RandomAccessFile(new File("doc.txt"),"r");
        //表示从哪个偏移量开始读取数据
        randomAccessFile.seek(beginPos);
        byte[] bytes = new byte[1024];
        int length = 0;
        while((length = randomAccessFile.read(bytes))!=-1) {
            if (actualSize > length) {
                System.out.println(new String(bytes, 0, length));
                actualSize -= length;
            }else {
                System.out.println(new String(bytes,0,actualSize));
                break;
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            randomAccessFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }
}

不实现readSplit(i,beginPos,actualSize); 这行代码的结果如下显示:
要被切成21块
0–起始位置是:0—读取的大小是:1024
1–起始位置是:1024—读取的大小是:1024
2–起始位置是:2048—读取的大小是:1024
3–起始位置是:3072—读取的大小是:1024
4–起始位置是:4096—读取的大小是:1024
5–起始位置是:5120—读取的大小是:1024
6–起始位置是:6144—读取的大小是:1024
7–起始位置是:7168—读取的大小是:1024
8–起始位置是:8192—读取的大小是:1024
9–起始位置是:9216—读取的大小是:1024
10–起始位置是:10240—读取的大小是:1024
11–起始位置是:11264—读取的大小是:1024
12–起始位置是:12288—读取的大小是:1024
13–起始位置是:13312—读取的大小是:1024
14–起始位置是:14336—读取的大小是:1024
15–起始位置是:15360—读取的大小是:1024
16–起始位置是:16384—读取的大小是:1024
17–起始位置是:17408—读取的大小是:1024
18–起始位置是:18432—读取的大小是:1024
19–起始位置是:19456—读取的大小是:1024
20–起始位置是:20480—读取的大小是:256

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值