JAVA 拆分、合并文件

java把拆分文件 中关闭流的风格,修改成 finally 方式

把合并文件 中关闭流的风格,修改成 try()

package file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class TestStream1 {

public static void main(String []args) {
    split();
    merge();
}
 
public static void split() {

// 找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
// 比如文件 eclipse.exe,大小是309k。
// 拆分之后,成为
// eclipse.exe-0
// eclipse.exe-1
// eclipse.exe-2
// eclipse.exe-3
//之前在TestStream里用自己的方式做了一次,现在来用Arrays.copyOfRange再 来做一次
//这一次用的文件只有19K,所以会以2K,或者3K来做拆分
File f = new File(“F:\testFile\lianxi.txt”);
System.out.println(“源文件的是:”+f.getName()+",大小是:"+f.length());
//文件的总长度
long allLength = f.length();
//得到要写入的字节数据的长度
int num = (int) (allLength / 1024 / 2 +1);
//创建文件数据对象
File files[] = new File[num];
//初始化文件
for (int i = 0; i < files.length; i++) {
files[i] = new File(f.getParent(), f.getName()+’-’+i);
}

    FileInputStream fis =null;
    FileOutputStream fos = null;
    try {
        //FileInputStream fis = new FileInputStream(f);
        fis = new FileInputStream(f);
        byte all[] = new byte[(int)allLength];
        fis.read(all);
        for (int i = 0; i < files.length; i++) {
            byte []temp = null;
            if(i == files.length-1) {
                temp = Arrays.copyOfRange(all, i*1024*2, (int)allLength);
            }else {
                temp = Arrays.copyOfRange(all, i*1024*2, (i+1)*1024*2);
            }
            //FileOutputStream fos = new FileOutputStream(files[i]); 
            fos = new FileOutputStream(files[i]); 
            fos.write(temp);
        }
         
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally {
        if(null!=fis) {
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(null!=fos) {
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
     
    for (File file : files) {
        System.out.println("拆分后的文件名是:"+file.getName()+",大小是:"+file.length());
    }
}

public static void merge() {
    //=========================================================================

// 把上述拆分出来的文件,合并成一个原文件。
//
// 以是否能正常运行,验证合并是否正确
//先定义一下要合并的文件
File tagf = new File(“F:\testFile\lianxi11\lianxi.txt”);
tagf.getParentFile().mkdirs();
//假设并不知道要合并的个数,只知道名称样式
//合并文件的总长度
long totalLength = 0;
//要合并的文件个数
int num = 0;

    //遍历目录下我们要合并的文件
    File f = new File("F:\\testFile");
    //目录下的所有文件
    File []files = f.listFiles();
    System.out.println("文件的总个数为:"+files.length);
    //找出要合并的文件是那些
    for (int i = 0; i < files.length; i++) {
        if(files[i].getName().contains("lianxi.txt-")) {
            //得到文件的总长度
            totalLength +=files[i].length();
            //文件个数
            num++;
        }
    }
    System.out.println("总长度为:"+totalLength);
    System.out.println("文件个数为:"+num);
    //创建目标文件的字节数据,用上面找到的长度和个数来创建字节数组tagbb和文件数组files2
    byte tagbb[] = new byte[(int)totalLength];
    File files2[] = new File[num];
    //临时变量
    int j = 0;
    //写入内容,内容要从上面的文件中来
    for (int i = 0; i < files.length; i++) {
        if(files[i].getName().contains("lianxi.txt-")) {
            //得到文件的总长度
            files2[j]=files[i];
            //文件个数
            j++;
        }
    }
    //文件中的内容合并到tagbb中
    //FileInputStream fis = null;
    //这次循环只有循环files2的个数了
    for (int i = 0; i < files2.length; i++) {
        try (FileInputStream fis =new FileInputStream(files2[i])){
            //创建字节输入流
            //fis = new FileInputStream(files2[i]);
            //临时的字节数组
            byte []temp = new byte[(int)files2[i].length()];
            //读入内容
            fis.read(temp);
            //将内容依次写入tagbb中,利用System.arraycopy的功能,下次不要傻傻自己写方法了
            System.arraycopy(temp, 0, tagbb, i*1024*2, temp.length);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
         
    }
     
    //创建字节输出流
    try (FileOutputStream fos = new FileOutputStream(tagf)){
        fos.write(tagbb);
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     
    String str = "合并后的文件目录为%s,合并后的文件大小为:%d";
    System.out.printf(str,tagf.getAbsolutePath(),tagf.length());
     
}

}

JAVA学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值