欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础学习总结--IO流关闭

程序员文章站 2022-04-16 09:24:21
一、为什么java中io流必须关闭 当我们new一个java流对象之后,不仅在计算机内存中创建了一个相应类的实例对象。而且,还占用了相应的系统资源。在内存中的实例对象,当没有引用指向的时候,java垃圾收集器会按照相应的策略自动回收,但是却无法对系统资源进行释放。所以,我们需要主动调用close() ......

一、为什么java中io流必须关闭

当我们new一个java流对象之后,不仅在计算机内存中创建了一个相应类的实例对象。而且,还占用了相应的系统资源。在内存中的实例对象,当没有引用指向的时候,java垃圾收集器会按照相应的策略自动回收,但是却无法对系统资源进行释放。所以,我们需要主动调用close()方法释放java流对象。

二、释放资源的方法:

1、方法一:
        file file = new file("f:/javapractice/io2/src/test");
        fileinputstream is = null;
        try {
            is = new fileinputstream(file);
            byte[] flush = new byte[1024];
            int len=0;
            while((len=is.read(flush)) != -1) {
                //此处一定要放实际的读取长度,否则会将flush数组中的非读取到的数据也输出,如:默认值0
                system.out.print(new string(flush, 0, len));        
            }
        }catch(filenotfoundexception e) {
            e.printstacktrace();
        }catch(ioexception e) {
            e.printstacktrace();
        }finally {
            try {
                if(is != null) {
                    is.close();
                }
            }catch(ioexception e) {
                e.printstacktrace();
            }
        }
2、方法二:

若需要关闭的流较多,可以利用closeable接口自己封装一个方法

public static void close(closeable... ios) {    //其实此处应用的是多态原理
        for(closeable io:ios) {
            try {
                if(io != null) {
                    io.close();
                }
            }catch(ioexception e) {
                e.printstacktrace();
            }
        }
    }

补充:public static void close(closeable... ios),此处的三点并不是省略号,而是可变参数。

3、方法三:

在java7之后,可以使用try-with-resources语句来释放java流对象,从而避免了try-catch-finally语句的繁琐。

public static void copy(string srcpath, string destpath) {
        //创建源
        file src = new file(srcpath);
        file dest = new file(destpath);
        
        //选择流
        try(fileinputstream is = new fileinputstream(src);
            fileoutputstream os = new fileoutputstream(dest)) { 
            //操作
            byte[] flush = new byte[1024*2];
            int len = 0;
            while((len=is.read(flush)) != -1) {
                os.write(flush, 0, len);
            }
            os.flush();
        }catch(filenotfoundexception e) {
            e.printstacktrace();
        }catch(ioexception e) {
            e.printstacktrace();
        }
    }
java新手,若有错误,欢迎指正!