日期:2014-05-20  浏览次数:20721 次

关于IO的一点疑问
下面是某本书上的一段程序代码,有个疑问如下,红色字体..

Java code

package day1;

import java.io.ByteArrayInputStream;
import java.io.IOException;

public class ByteArrayTester {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        byte[] buff=new byte[]{2,15,67,-1,-9,9};
        ByteArrayInputStream in=new ByteArrayInputStream(buff,1,4);
        int data=in.read();
        while(data!=-1){
            System.out.println(data+" ");
            data=in.read();
        }
        try {
            in.close();//[color=#FF0000]ByteArrayInputStream的close()方法实际上不执行任何操作,那为什么要写呢?
还有in对象应该没有销毁吧,个人认为应该加上  in=null;[/color]            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}




------解决方案--------------------
ByteArrayInputStream的close()方法实际上不执行任何操作,那为什么要写呢?
流用完了要关闭啊
关闭了虚拟机才知道其已经没有价值了
空闲的时候垃圾回收机制会回收的
还有in对象应该没有销毁吧,个人认为应该加上 in=null;
in=null;是显示的告诉虚拟机它已经没有价值了 可以回收 但什么时候回收是虚拟机决定的
不用显示的写出来 在其没有价值的时候 虚拟机也会回收它的 其实in=null;这样的代码意义不大


------解决方案--------------------
那个只是关闭io流而已,和对象没关系
你可以自己+上判断来调节
不过我想问下lz
你传输完毕以后不关闭,想继续传么?那为什么还要判断?
如果不传了,为什么不关闭?等他报溢出的异常么?
================
不懂你的想法。。。
------解决方案--------------------
对于 ByteArrayInputStream 关不关并不影响 GC 回收其占用的资源,但要记得将引用置空(in = null;),以下是源代码及文档注释:
Java code

    /**
     * Closing a <tt>ByteArrayInputStream</tt> has no effect. The methods in
     * this class can be called after the stream has been closed without
     * generating an <tt>IOException</tt>.
     * <p>
     */
    public void close() throws IOException {
    }

------解决方案--------------------
在写数据库程序的时,都有像in=null的语句,好让垃圾收集器把它回收,可能在这里写一下会好一些吧。