首页 > 编程语言 > 详细

Java学习笔记 之I/O流系列 关闭流 拆分文件 合并文件

时间:2020-01-31 14:49:26      阅读:57      评论:0      收藏:0      [点我收藏+]

Java学习笔记 之I/O流系列 关闭流 拆分文件 合并文件

流的概念

所有的流,无论是输入流还是输出流,使用完毕之后,都应该关闭。 如果不关闭,会产生对资源占用的浪费。 当量比较大的时候,会影响到业务的正常开展。

关闭流的方法

我们可以把定义在try()里 try,catch,finally结束的时候 会自动关闭

这种编写代码的方式叫做try-with-resources 这是从JDK7开始支持的技术

所有的流,都实现了一个接口叫做 AutoCloseable,任何类实现了这个接口,都可以在try()中进行实例化。 并且在try, catch, finally结束的时候自动关闭,回收相关资源

示例:
public static void main(String[] args) {
    File f = new File("d:/test.txt");
    try(FileInputStream fis = new FileInputStream(f)){
        byte[]all = new byte[(int)f.length()];
        fis.read(all);
        for(byte b : all){
            System.out.println(b);
        }
    }catch(IOException e){
        e.printStackTrace();
    }
}

拆分文件

D盘新建test.txt写上一些数据

本文以10.6M文本文件 10240000字节拆分为例 暂时不考虑大文件

思路
  • 读取文件数据
  • 计算出拆分文件的个数(循环的次数)
  • for循环写出即可
代码
public static void main(String[] args) {
    File f = new File("d:/test.txt");
    try(FileInputStream fis = new FileInputStream(f)){
        byte[]all = new byte[(int)f.length()];
        fis.read(all);
        for (int i = 0;i <= all.length/10240000; i++){
            String eachName =  f.getName() + "-" + i;
            File eachFile = new File(f.getParent() + eachName);
            FileOutputStream fos = new FileOutputStream(eachFile);
            if (i == all.length/10240000){
               fos.write(all,i*10240000,all.length - i*10240000);
            }else{
                fos.write(all,i*10240000,10240000);
            }
            fos.close();
        }
    }catch(IOException e){
        e.printStackTrace();
    }
}
注意

文本文件中含有中文的话 查看拆分文件部分可能乱码 没关系 这是因为 中文字符串转换成字节是两个字节 拆分中 i*10240000 可能把两个字节分开了 不影响之后的合并文件

合并文件

思路
  • FileOutputStream(File file)构造方法是覆盖写入 可以使用FileOuputStream(File file,boolean appendFlag)来追加写入
  • 按顺序循环读取拆分的文件的内容 再写入到合并文件中
  • 也可以把拆分文件内容写到byte数组中 最后再一起写入合并文件中
代码
File f = new File("d:/test.txt");
for (int i=0;i<=13;i++){
    File eachFile = new File("d:/test.txt-" + i);
    File mergeFile = new File("d:/testMerge.txt");
    try(FileInputStream fis = new FileInputStream(eachFile)){
        byte[]all = new byte[(int)eachFile.length()];
        fis.read(all);
        FileOutputStream fos = new FileOutputStream(mergeFile,true);
        fos.write(all);
        fos.close();
        System.out.println(eachFile.length());
    }catch (IOException e){
        e.printStackTrace();
}

Java学习笔记 之I/O流系列 关闭流 拆分文件 合并文件

原文:https://www.cnblogs.com/rongyaommm/p/12245227.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!