Java IO 关闭流的方式

分类

  • 在try中关闭
    弊端是如果文件不存在或者读取的时候有问题而抛出异常,那么就不会执行流的关闭语句,存在资源占用隐患
  • 在finally中关闭
    这是标准的关闭流的方式
    1、首先把引用声明在try外面,使其作用域达到finally
    2、在finally中先判断应用是否为空
    3、再使用一次try catch进行关闭
  • 使用try()关闭
    把流定义在try()里,try,catch或者finally结束的时候,会自动关闭

练习:将分割文件中的流关闭方式改为finally形式

package JavaIOTest;

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

public class SplitFileTest {
    public static void main(String[] args) {
        //每次读的字节数
        int eachReadSize = 2;
        //子文件数量
        int subFileNumber;
        //每次读取的内容存放到eachContentzhong
        byte[] eachContent;
        //创建文件对象
        File file = new File("d:/xyz/z/zzz/zzzz/lol.txt");
        File dir = file.getParentFile();
        //判断父目录是否存在,不存在则创建父目录
        if (!dir.exists()){
            dir.mkdirs();
        }
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try{
            //创建输入流一次性读取文件中所有字节
             fileInputStream = new FileInputStream(file);
            byte[] bytes = new byte[(int)file.length()];
            fileInputStream.read(bytes);
            //判断子文件数量
            if (0 == file.length()%eachReadSize){
                subFileNumber = (int)file.length()/2;
            }else{
                subFileNumber = (int)file.length()/2 + 1;
            }

            for(int i = 0; i < subFileNumber;i++){
                //判断每次写文件的长度,如果不是最后一个文件则长度为2字节,如果是最后一个文件则长度是文件剩余长度
                if(subFileNumber-1 != i){
                    eachContent = Arrays.copyOfRange(bytes,eachReadSize * i,(i+1) * eachReadSize);
                }else {
                    eachContent = Arrays.copyOfRange(bytes,eachReadSize * i,(int)file.length());
                }
                File subFile = new File(dir+"/lol"+"-"+i+".txt");
                fileOutputStream = new FileOutputStream(subFile);
                fileOutputStream.write(eachContent);
                fileOutputStream.close();
                System.out.printf("输出子文件:%s,其大小是%d\n",subFile,subFile.length());
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (fileInputStream!=null && fileOutputStream !=null ){
                try {
                    fileOutputStream.close();
                    fileInputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

练习:文件合并中的流关闭方式改为try()形式

package JavaIOTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//1、创建目标文件
//2、读一次子文件写一次子文件
//3、使用输出IO流输出
public class MergeFileText {

    public static void main(String[] args) {
        //创建最终写入的目标文件对象
        File targetFile = new File("d:/xyz/z/zzz/zzzz/lol3.txt");
        //创建一个文件列表对象用于存放子文件对象
        List<File> subFiles = new ArrayList<>();
        //获取当前目录对象
        File dir = targetFile.getParentFile();
        //得到当前目录下的所有文件和目录的数组
        File[] allFiles = dir.listFiles();
        //创建一个字节数组对象长度为2
        byte[] b = new byte[2];
        //读取文件的实际长度为len
        int len = -1;
        //找到所有的子文件并添加到列表中
        for (File file : allFiles){
            if (file.isFile()&& file.getName().startsWith("lol-")){
                subFiles.add(file);
            }
        }
        try( FileOutputStream fileOutputStream = new FileOutputStream(targetFile)){
            //创建输出流
            //每读一个写一个
            for(File file : subFiles){

               try(FileInputStream inputStream = new FileInputStream(file)) {
                   len = inputStream.read(b);
                   System.out.println(len);
               }
                fileOutputStream.write(b,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}


传送门:这里更详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值