日志文章

2019-12-24 aflfte2011

使用随机读取和写入流分割文件

package com.aflfte.io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

/**
 * 面向对象思想封装分割
 * @author root
 *
 */
public class SplitFile {
    //源文件
    private File src;
    //目的地(存放分割后的文件)
    private String dir;
    //分割后的文件路径
    private List<String> paths;
    //每块大小
    private int blocksize;
    //块数:多少块
    private int size;
    
    public SplitFile(String src, String dir, int blocksize) {
        super();
        this.src =new File(src);
        this.dir = dir;
        this.blocksize = blocksize;
        this.paths=new ArrayList<String>();
        //初始化
        init();
    }
    private void init() {
        //总大小
        long len=this.src.length();
        //块数
        this.size=(int)Math.ceil(len*1.0/blocksize);
        //路径
        for(int i=0;i<size;i++) {
            this.paths.add(this.dir+"/"+i+"-"+this.src.getName());
        }
        
    }
    /*
     * 分割操作
     * 1.计算每一块的起始点
     * 2.分割
     */
    public void split() throws IOException {
        //总长度
        long len=src.length();
        int beginpos=0;//起始位置
        int actualsize=(int)(blocksize>len?len:blocksize);//实际大小
        for(int i=0;i<size;i++) {
            beginpos=i*blocksize;
            if(i==size-1) {
                actualsize=(int)len;
            }else {
                actualsize=blocksize;
                len-=actualsize;
            }
            splitDetail(i,beginpos,actualsize);
        }
    }
    //第I块的起始位置和实际长度
    private void splitDetail(int i,int beginpos,int size) throws IOException {
        RandomAccessFile raf=new RandomAccessFile(this.src, "r");
        RandomAccessFile raf2=new RandomAccessFile(this.paths.get(i), "rw");
        raf.seek(beginpos);
        byte[] flush=new byte[1024];
        int len=-1;
        while((len=raf.read(flush))!=-1) {
            if(size>len) {//获取本次读取的所有内容
                raf2.write(flush,0,len);
                size-=len;
            }else {
                raf2.write(flush, 0, size);
                break;
            }
        }
        raf2.close();
        raf.close();
    }
    public static void main(String[] args) throws IOException {
        SplitFile sf=new SplitFile("src/com/aflfte/io/DataTest.java", "dir", 1024);
        sf.split();
    }
}

« 利用合并流合并文件 | 打印流的使用»