在下面的例子中关闭输出流后仍然可以从输出流中得到字节数组,那么关闭输出流的的作用是什么,close()完成了那些工作,谢谢!
import java.io.*;
public class PrintStreamTester{
  private static void readBuff(byte[] buff)throws IOException{
    ByteArrayInputStream in=new ByteArrayInputStream(buff);
    int data;
    while((data=in.read())!=-1)
       System.out.print(data+" ");
    System.out.println();
in.close();
  }  public static void main(String agrs[])throws IOException{
     //通过DataOutputStream写字符串“好”
     out=new ByteArrayOutputStream();
     DataOutputStream ds=new DataOutputStream(out);
     ds.writeUTF("好");
     ds.close();     buff=out.toByteArray(); //获得字节数组
     System.out.println("采用适用于Java语言的UTF-8字符编码:");
     readBuff(buff);
   }
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【topcs】截止到2008-07-13 19:52:35的历史汇总数据(不包括此帖):
    发帖的总数量:3                        发帖的总分数:60                       每贴平均分数:20                       
    回帖的总数量:4                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:3                        结贴的总分数:60                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    ByteArrayOutputStream();这个是一个虚拟的流,关闭了你想有啥效果。
    你用一个真正的流看看,比如读取本地文件,或者互联网的页面。
      

  3.   

    释放流占用的系统资源,除此之外什么也不做,用flush()清空输出流
      

  4.   

    同意楼主的关闭流, 就是关闭流链接中所有占用的系统资源, 如文件句柄, socket名柄, 甚至GDI句柄
      

  5.   

    toByteArray() 代码:
        /**
         * Creates a newly allocated byte array. Its size is the current 
         * size of this output stream and the valid contents of the buffer 
         * have been copied into it. 
         *
         * @return  the current contents of this output stream, as a byte array.
         * @see     java.io.ByteArrayOutputStream#size()
         */
        public synchronized byte toByteArray()[] {
            return Arrays.copyOf(buf, count);
        }它返回的是一个buf这个字节数组的复制品。
    buf这个byte[]本来就是在内存里面的,
    所以你关不关流无所谓。第一次知道当一个方法返回一个数组的时候可以这么写:public int getIntArray()[] {
      return new int[10];
    }
      

  6.   

    我的意思是关闭输入流后,是不是这个输出流对象仍然存在,否则怎么还能调用它的方法呢(out.toByteArray();),那在jdbc中,关闭resultset后是不是还可以使用resertset呢?
      

  7.   

    ByteArrayOutputStream这个类的close方法是特例
      

  8.   

    向joejoe1991学了点新知识,o(∩_∩)o...哈哈
      

  9.   

    为了避免造成资源浪费,所以关闭流,及时的释放流所占用的内存.在关闭之前最好flush一下,以保证全部写出了.
      

  10.   

    我刚查了一下ByteArrayOutputStream和resultset的API,不同类的close方法起的作用有一定的差别。ByteArrayOutputStream的close()解释如下:public void close() throws IOException  关闭 ByteArrayOutputStream 无效(Closing a ByteArrayOutputStream has no effect)。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException 异常。 另外查了一下resultset的API,如下:  void close() throws SQLException  立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
     
      关闭 ResultSet 对象不会关闭 ResultSet 创建的 Blob、Clob 或 NClob 对象。Blob、Clob 或 NClob 对象至少在创建它们的事务期间持续有效,除非调用了其 free 方法。   当关闭 ResultSet 时,所有通过调用 getMetaData 方法创建的 ResultSetMetaData 实例都可以访问。   注:当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,该 Statement 对象将自动关闭 ResultSet 对象。   在已关闭的 ResultSet 对象上调用 close 方法是无操作 (no-op)。
     
      

  11.   

    源代码如下,什么都不作:    /**
         * Closing a <tt>ByteArrayOutputStream</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 {
        }