zoukankan      html  css  js  c++  java
  • 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
    ",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();
            }
    
        }
    }
    
    

    传送门:这里更详细

  • 相关阅读:
    实现USB即插即用 教您怎么取消安全删除硬件功能
    如何用EFS对脱机文件加密
    快速美化封面用word就可以
    给iPhone联系人设置小头像的两种方法
    文件夹加密巧用“类标识符”
    保存网页FLASH有妙招
    使用EFS对你电脑上的脱机文件加密
    虚拟xp系统如何在win7系统中安装
    医药圈 www.eyaoq.com
    《eyaoq.com医药圈医药人自己的社区邀请函》
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860164.html
Copyright © 2011-2022 走看看