Java IO 关闭流的方式

摘要:
=i){eachContent=数组.copyOfRange(字节,eachReadSize*i,(i+1)*eachReadSize);}否则{eachContent=数组.copyOfRange(字节,eachReadSize*i,(int)file.length());}FilesubFile=newFile(dir+“/lol”+“-”+i+“.txt”);fileOutputStream=新文件输出流(子文件);文件输出流。写入(每个内容);文件输出流。close();系统出来printf(“输出子文件:%s,其大小为%d”,subFile,subFile.length());}}catch(IOExceptione){e.printStackTrace();}最后{if(fileInputStream!=null&&fileOutputStream!

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();
        }

    }
}


传送门:这里更详细

免责声明:文章转载自《Java IO 关闭流的方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AppScanGojs学习史(一):基本定义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转载-&amp;gt;C#异常处理

C#异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally和throw。 try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 cat...

使用try-with-resource遇到的问题

JDK1.7增加了try-with-source语法。在try中声明一个或者多个资源,在try块代码执行完成后自动关闭流,不用再写close()进行手动关闭。 1 try(Resource res = xxx)//可指定多个资源 2 { 3 work with res 4 } 5 // 实现了AutoCloseable接口的类的对象就是资源 于...

Java基础知识提要

1、简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机、冰箱等 2、简单写出Java特点,写出5个以上,越多越好 简单的、面向对象的、分布式的、安全的、稳定的、与平台无关的、可解释的、多线的、动态的语言。 3、什么是Java? JAVA:一种编程...

redis 的简明教程

redis 结合ssm使用 一、Redis使用 1、jedis操作redis非关系型数据库 2、spring 集成redis 二、两者区别: 一、Redis使用 1、jedis操作redis非关系型数据库 (1)、pom.xml <!-- redis客户端jar --> <dependency> &l...

SQLiteHelperSQLite帮助类

最近做项目用到了SQLite数据库,就自己写了个SQLite帮助类,类似于SQLHelper。 不过是按照我常用方式写的,主要与SQLHelper不同的是 1、这个帮助类并没有内置ConnectionString,是需要在调用方法的时候指定的,这样的好处的是:在一般的三层架构时都会在Helper里指定一个数据库连接,但是如果我又想用这个帮助类但是我想查询其...

JVisualVM简介与内存泄漏实战分析

一、JVisualVM能做什么       VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由...