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

关于java 输入输出流的问题,高手进
String str ="a,b,c" ;
ByteArrayInputStream bos=new ByteArrayInputStream(str.getBytes());
 ByteArrayOutputStream dis =new ByteArrayOutputStream();
 

这两个一个是往内存里写入str字符串数据 一个是从内存中读取数据吧。。
 

不过这两个有必要配合着一起使吗?

 
我干嘛要先把他写入到内存中 在从内存中读取呢?


我直接 try{
  dis.write(str.getBytes());
  }catch (Exception e){
  e.printStackTrace();
  }

不是也可以把数据写入进去吗? 

还是我把概念弄混了。。望高手指点。。。




------解决方案--------------------
ByteArrayInputStream 没怎么用过
ByteArrayOutputStream 可以在你需要循环从InputStream中读取字节数组时很有帮助
比如
for(xxx)
{
byte[] xx = new byte[100]
is.read(100)//简写,每次读取100个给数组
byteArrayOutputStream.write(xx);
}
然后出来之后整个输入流就转到byteArrayOutputStream,想要得到数组就toArray就很方便了
------解决方案--------------------
或者说这两个类更多的是结合过滤流使用的,有时候得到过滤流需要中转的时候就没必要都往文件中写,
可以通过这两个方法写到内存中
当然可能还有其他作用,等高手继续
------解决方案--------------------
首先LZ你可以先看一下 JDK API文档,ByteArrayInputStream在构造的过程中就要求接收一个字节数组,IO包内的所有流都是继承自这四种抽象流类型(InputStream,OutputStream,Writer,Reader),按照不同的方式我们可以把他们分为以下3种流类型:1、按照数据流动的方向可以分为输入流、输出流。2、按照处理数据的单位不同可以分为字节流和字符流。3、按照处理的方式不同可以节点流和处理流,而ByteArrayInputSream、ByteArrayOutputStream是属于处理流(套在已有流上的流,相当于过滤器),两者可以不一起使用,但一般建议是一起使用,这样比较方便。LZ应该在用电驴吧,它是属于P2P的软件,如果每读写一个字节就访问我们的硬盘一次那对我们的硬盘损坏很大。ByteArrayInputSream是输入流你的告诉它从哪里读取数据吧!而ByteArrayOutputStream是输出流,你总得告诉它往哪里写吧?在构造的时候系统会默认分配一块内存空间。当我们要读取它那里面的数据时,可以通过它的toByteArray()方法得到分配的内存,这样我们的ByteArrayInputSream就刚好用上了。还有就是假设我们要从一个文件中读取数据,按照LZ的思想FileInputStream就可以了,当时如果文件中有中文的化,那么你读取出来的数据就是一个个?号,这时就可以为它套上FileReader,一个字符一个字符的读取。
------解决方案--------------------
Java code

import java.io.*;

public class ByteArrayOutputStreamDemo01{
    public static void main(String args[])throws Exception{
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        out.write("我".getBytes());
        byte[]b = out.toByteArray();
        out.close();
        ByteArrayInputStream in = new ByteArrayInputStream(b);
        byte[]b2 = new byte[1024];
        int len = in.read(b2);
        String str = new String(b2,0,len);
        System.out.println(str); 
        in.close();
    }
}