javaIO流学习 2019.3.2

文件分割与合并技术
本文介绍了一种文件分割与合并的方法,使用Java实现,详细解释了如何将大文件分割成小块并存储,以及如何将这些小块重新合并成原始文件。此外,还展示了如何利用Apache Commons IO库进行文件操作,包括获取文件大小、列出目录下的文件等。

增加了文件的合并方法

package com.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;

import org.omg.CORBA.portable.InputStream;

/*
 * 面向对象思想封装分割随机读取
 */
public class SplitFile {
    //源头
    private File src;
    //目的地(文件夹)
    private String destDir;
    //所有分割后的文件储存路径
    private List<String> destPaths;
    //每块大小
    private int blocksize;
    //多少块
    private int size;
    public SplitFile() {
        super();
    }
    public SplitFile(String srcPath, String destDir) {
        this(srcPath,destDir,1024);
    }
    public SplitFile(String srcPath, String destDir, int blocksize) {
        this.src =new File(srcPath);
        this.destDir = destDir;
        this.blocksize = blocksize;
        this.destPaths=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.destPaths.add(this.destDir+"/"+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;//剩余量
            }
            SplitDetail(i,beginPos,actualSize);
        }
    }
    private void SplitDetail(int i,int beginPos,int actualSize) 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(actualSize>len) {
                raf2.write(flush, 0, len);
                actualSize-=len;
            }else {
                raf2.write(flush, 0, actualSize);
                break;
            }
        }
        raf2.close();
        raf.close();
    }
    /*
     * 文件的合并
     */
    public void merge(String destPath) throws IOException {
        //输出流 true为append标识
        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("b.jpg", "dest", 1024*10);
        sf.split();
        sf.merge("a.png");
    }
}

add方法报错,原因未知

以下为测试组件Commons的功能

package com.io;

import java.io.File;

import org.apache.commons.io.FileUtils;

public class CIOTest1 {
    public static void main(String[] args) {
        //文件大小
        long len=FileUtils.sizeOf(new File("D:\\java\\IO_Study\\src\\com\\io\\CIOTest1.java"));
        System.out.println(len);
        //目录大小
        len=FileUtils.sizeOf(new File("D:\\java\\IO_Study"));
        System.out.println(len);
    }
}

package com.io;

import java.io.File;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.EmptyFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;

/*
 * 列出子孙集
 */
public class CIOTest2 {
    public static void main(String[] args) {
        //1.目录       2.EmptyFileFilter.NOT_EMPTY   过滤器,文件不能为空(为空文件就不显示) 3.目录的过滤器
        Collection<File> files=FileUtils.listFiles(new File("D:/java/IO_Study"), EmptyFileFilter.NOT_EMPTY, null);
        for(File file:files) {
            System.out.println(file.getAbsolutePath());
        }
        System.out.println("---------------------");
        //显示目录的子孙集
        files=FileUtils.listFiles(new File("D:/java/IO_Study"), EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE);
        for(File file:files) {
            System.out.println(file.getAbsolutePath());
        }
        System.out.println("---------------------");
        //文件后缀为java或class  还有FileFilterUtils.And
        files=FileUtils.listFiles(new File("D:/java/IO_Study"), FileFilterUtils.or(new SuffixFileFilter("java"),new SuffixFileFilter("class")), DirectoryFileFilter.INSTANCE);
        for(File file:files) {
            System.out.println(file.getAbsolutePath());
        }
    }
}

 

package com.io;

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

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.EmptyFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;

/*
 * 写出内容
 */
public class CIOTest4 {
    public static void main(String[] args) throws IOException {
        //写文件    //true 追加文件
        FileUtils.write(new File("b.txt"), "学习是一件伟大的事\r\n","GBK",true);
        FileUtils.writeStringToFile(new File("b.txt"), "学习是一件辛苦的事\r\n","GBK",true);
        FileUtils.writeByteArrayToFile(new File("b.txt"), "学习是一件幸福的事\r\n".getBytes("GBK"),true);
        //写列表
        List<String> datas=new ArrayList<String>();
        datas.add("一");
        datas.add("二");
        datas.add("三");
        //第三项为List每个项目之间的连接符
        FileUtils.writeLines(new File("b.txt"),datas,"。。。。",true);
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值