Day33

用随机流分割 进行封装

理解封装的思想

增加一些属性

构造器

初始化

分割思想不变

最后调用

package com.sxt.io;

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

/**
 * 面向对象思想封装 分割
 */
public class SplitFile {
    //源头
    private File src;
    //目的地(文件夹)
    private String destDir;
    //所有分割后的文件存储路径
    private List<String>destPaths;
    //每块大小
    private int blockSize;
    //块数:多少块
    private  int size;

    public SplitFile(String srcPath,String destDir, int blockSize) {
        this.src = new File(srcPath);
        this.destDir = destDir;
        this.destPaths =new ArrayList<String>();
        this.blockSize = blockSize;
    //初始化
        init();
    }
    //初始化
    private void init(){
        //总长度
        long len =this.src.length();
        //块数:多少块
        this.size=(int)Math.ceil(len*1.0/blockSize);//向上取整,如果有小数点3.5,向上取整就是分四块
        //路径
        for (int i = 0; i <size ; i++) {
            this.destPaths.add((this.destDir+"/"+i+"-"+this.src.getName()));
        }
    }
    /**
     * 分割
     * 1、计算每块的起始位置及大小
     * 2、分割
     */
    public void split() throws IOException {
        //总长度
        long len =src.length();
        //起始位置和实际大小
        int beginPos=0;
        //实际大小
        int actuaSize=(int)(blockSize>len?len:blockSize);
        for (int i = 0; i <size ; i++) {
            beginPos=i*blockSize;
            if (i==size-1){//最后一块
                actuaSize=(int)len;
            }else {
                actuaSize=blockSize;
                len-=actuaSize;//剩余量
            }
            splitDetil(i,beginPos,actuaSize);
        }
    }
    /**
     * 指定第i起始位置和实际长度
     * @param i
     * @param beginPos
     * @param actuaSize
     * @throws IOException
     */
    private void splitDetil(int i, int beginPos, int actuaSize) throws IOException {
        RandomAccessFile raf = new RandomAccessFile(this.src, "r");
        RandomAccessFile raf2 = new RandomAccessFile(this.destPaths.get(i), "rw");
        //随机读取
        raf.seek(beginPos);
        //读取
        byte[] flush = new byte[1024];//缓冲容器
        int len = -1;//接受长度
        while ((len = raf.read(flush)) != -1) {
            if (actuaSize>len){//获取本次读取的所有内容
                raf2.write(flush,0,len);
                actuaSize-=len;
            }else {
                raf2.write(flush,0, actuaSize);
                break;
            }
        }
        raf.close();
        raf2.close();
    }

    public static void main(String[] args) throws IOException {
        SplitFile sf=new SplitFile("src/com/sxt/io/SplitFile.java","dest", 1024);
        sf.split();
    }
}
合并流

SequenceInputStream

多个输入流读取到一个合并流SequenceInputStream中给程序

SequenceInputStream中有个Enumeration接口

看到这个Enumeration接口我们就会用这个Vector,Vector有个elements方法会返回Enumeration

package com.sxt.io;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * 面向对象思想封装 分割
 */
public class SplitFile {
    //源头
    private File src;
    //目的地(文件夹)
    private String destDir;
    //所有分割后的文件存储路径
    private List<String>destPaths;
    //每块大小
    private int blockSize;
    //块数:多少块
    private  int size;

    public SplitFile(String srcPath,String destDir, int blockSize) {
        this.src = new File(srcPath);
        this.destDir = destDir;
        this.destPaths =new ArrayList<String>();
        this.blockSize = blockSize;
    //初始化
        init();
    }
    //初始化
    private void init(){
        //总长度
        long len =this.src.length();
        //块数:多少块
        this.size=(int)Math.ceil(len*1.0/blockSize);//向上取整,如果有小数点3.5,向上取整就是分四块
        //路径
        for (int i = 0; i <size ; i++) {
            this.destPaths.add((this.destDir+"/"+i+"-"+this.src.getName()));
        }
    }
    /**
     * 分割
     * 1、计算每块的起始位置及大小
     * 2、分割
     */
    public void split() throws IOException {
        //总长度
        long len =src.length();
        //起始位置和实际大小
        int beginPos=0;
        //实际大小
        int actuaSize=(int)(blockSize>len?len:blockSize);
        for (int i = 0; i <size ; i++) {
            beginPos=i*blockSize;
            if (i==size-1){//最后一块
                actuaSize=(int)len;
            }else {
                actuaSize=blockSize;
                len-=actuaSize;//剩余量
            }
            splitDetil(i,beginPos,actuaSize);
        }
    }
    /**
     * 指定第i起始位置和实际长度
     * @param i
     * @param beginPos
     * @param actuaSize
     * @throws IOException
     */
    private void splitDetil(int i, int beginPos, int actuaSize) throws IOException {
        RandomAccessFile raf = new RandomAccessFile(this.src, "r");
        RandomAccessFile raf2 = new RandomAccessFile(this.destPaths.get(i), "rw");
        //随机读取
        raf.seek(beginPos);
        //读取
        byte[] flush = new byte[1024];//缓冲容器
        int len = -1;//接受长度
        while ((len = raf.read(flush)) != -1) {
            if (actuaSize>len){//获取本次读取的所有内容
                raf2.write(flush,0,len);
                actuaSize-=len;
            }else {
                raf2.write(flush,0, actuaSize);
                break;
            }
        }
        raf.close();
        raf2.close();
    }

    /**
     * 文件的合并 合并流
     */
    public void merge(String destPath) throws IOException {
        //输出流
        OutputStream os = new BufferedOutputStream(new FileOutputStream(destPath,true));
        Vector<InputStream> vi=new Vector<InputStream>();
        SequenceInputStream sis=null;
        //输入流
        for (int i = 0; i <destPaths.size() ; i++) {
            vi.add(new BufferedInputStream(new FileInputStream(destPaths.get(i))));
            }
        sis=new SequenceInputStream(vi.elements());
        //拷贝
        byte[] flush = new byte[1024];//缓冲容器
        int len = -1;//接受长度
        while ((len = sis.read(flush)) != -1) {
            //分段写出
            os.write(flush, 0, len);

        }
        os.flush();
        sis.close();
        os.close();
    }

    public static void main(String[] args) throws IOException {
        SplitFile sf=new SplitFile("src/com/sxt/io/SplitFile.java","dest", 1024);
        sf.split();
        sf.merge("aaa.java");
    }
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值