import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;public class TestInputStreamReader{
public static void main(String args[]){
        ByteArrayOutputStream byos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(byos);
        try{
        dos.writeInt(99);
        dos.writeDouble(Math.random());
        dos.writeChar('A');
        dos.close();  
        byos.close();
                                //这边把流close掉
        }catch(IOException e){
           e.printStackTrace();
        }
        DataInputStream dis = 
            new DataInputStream(new ByteArrayInputStream(byos.toByteArray()));
                                                          //这边怎么还能继续调用啊?
        try{
        System.out.println(dis.readInt());
        System.out.println(dis.readDouble());
        System.out.println(dis.readChar());
    }catch(IOException e){
       e.printStackTrace();
    }
}
}

解决方案 »

  1.   

    API如下:public class ByteArrayOutputStreamextends OutputStream此类实现了一个输出流,其中的数据被写入一个字节数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 检索数据。 关闭 ByteArrayOutputStream 无效。在关闭此流后且没有生成 IOException 时,可以调用此类中的该方法。
    ------------------
    这个流本质是字节数组流,外面包装一层流过滤,字节流关闭无效,仍可以调用。其他流就不行了。抛出流已经关闭异常。
      

  2.   

    最好不要在try块里面关闭流,如果在代码运行时,在close函数运行之前就抛出异常退出了,那么这些关闭流的语句将不会被执行。所以在catch后面再加一个finally,将close的操作放在finally块里面,这样不论有没有异常发生,都会执行finally块,保证关闭流的语句执行。
      

  3.   


    toByteArray
    public byte[] toByteArray()创建一个新分配的字节数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。 返回:
    以字节数组的形式返回此输出流的当前内容。
    另请参见:
    size()
    这个关闭流有什么关系吗?上下文的联系而已。
      

  4.   

     
    dos.close();  
    byos.close();
    dos和byos起的作用是往该缓冲区写东西,你写完后,就必须手动将他们关闭(你可看作是一种编程规范),代表不再进行写操作了,其实你在最后关闭也没什么影响,只不过那样你可能就好理解了,而后面的byos.toByteArray()是把该缓冲区的内容转换为一个字节数组,该方法byos关不关闭都没影响,前后之间并没有矛盾