黑马程序员技术交流社区

标题: 关于内存流的一个问题 [打印本页]

作者: 李敏    时间: 2012-4-11 11:40
标题: 关于内存流的一个问题
内存流的目标是内存。因为没有具体文件,所以我觉得应该先将内容写到内存中再读取。
                //ByteArrayOutputStream bo=new ByteArrayOutputStream();-----创建输出流
                byte[] b="hello".getBytes();
                //bo.write(b);--------------------先写到内存
                //System.out.println(bo);
                ByteArrayInputStream bs=new ByteArrayInputStream(b);
                int len=0;
                while((len = bs.read(b)) !=-1){-------再从内存中读到程序
                        
                        //System.out.println(new String(b, 0,len));
                }
可是视频中是ByteArrayInputStream bs=new ByteArrayInputStream(“hello”.getBytes());
是不是意味着在创建流的时候这个数组就已经到了内存??只有先写进去了才有内容读取啊?
有点晕。。。。
作者: 刘士    时间: 2012-4-11 12:34
本帖最后由 刘士 于 2012-4-11 12:45 编辑
ByteArrayOutputStream(从内存读出程序)
ByteArrayInputStream(从程序写入内存)


ByteArrayOutputStream、ByteArrayInputStream的操作与文件流的操作一样只是目标不同罢了,构成方法:public ByteArrayInputStream(byte [] buf)


  1. public class ByteArrayTest {

  2.     public static void main(String[] args) {

  3.        String str = "hello";

  4.        ByteArrayInputStream bin = new ByteArrayInputStream(str.getBytes());//实例化输入流

  5.        ByteArrayOutputStream bout = new ByteArrayOutputStream();//实例化输出流

  6.        int temp = 0;

  7.        while((temp = bin.read())!=-1){//直到末尾

  8.            bout.write(temp);

  9.        }

  10.        String result = bout.toString();//拿出缓存中的数据

  11.        System.out.print(result);

  12.     }

  13. }
复制代码
视频的写的是一种省略方法:
byte[] b="hello".getBytes();
ByteArrayInputStream bs=new ByteArrayInputStream(b);

ByteArrayInputStream bs=new ByteArrayInputStream(“hello”.getBytes());

这两种写法的目的是一样的。你的是产生b,传入。老师的写法是直接用b的产生语句传入。
希望你能明白。
作者: 任杰    时间: 2012-4-11 12:39
ByteArrayInputStream 内置一个缓冲区,该缓冲区包含从流中读取的字节
作者: adison    时间: 2012-4-11 12:43
其实我觉得输出流和输入流并没有必要联系,它们可以单独操作数据,管道流例外,管道输入流应该连接到管道输出流,管道输入流提供要写入管道输出流的所有数据字节。注意,那也是“应该”而已,我们亦可以单独写管道输入流,而没有管道输出流,但那没啥意义。输出流和输入流最大区别在于操作数据的动作不同,输出流是写,输入流是读。那么以你这个例子来说,ByteArrayInputStream bs=new ByteArrayInputStream(“hello”.getBytes());//只要有数据让ByteArrayInputStream读就行了,管你有没输出流。
创建流的时候这个数组就当然到了内存,虚拟机难道不是在内存中运行吗,那么一个程序要运行,其代码必然要加载到内存中了。
所以,你这个例子改成下面也行,不是说一定要先写才能读:
      
     byte[] b="hello".getBytes();
        ByteArrayInputStream bs=new ByteArrayInputStream(b);
        int len=0;
        while((len = bs.read(b)) !=-1){
               
                System.out.println(new String(b, 0,len));
        }
        ByteArrayOutputStream bo=new ByteArrayOutputStream();
        bo.write(b);
        System.out.println(bo);
作者: 李敏    时间: 2012-4-11 13:44
刘士 发表于 2012-4-11 12:34
ByteArrayOutputStream、ByteArrayInputStream的操作与文件流的操作一样只是目标不同罢了,构成方法:pub ...

不是不是, 我是问 这个 ----
是不是意味着在创建流的时候这个数组就已经到了内存??只有先写进去了才有内容读取啊?
你创建输入流的时候传入的内容是你声明的一个 字符串,但是这个字符串是不是就在内存中?因为这个是内存流,操作的是内存中的内容啊。。。。
作者: 刘士    时间: 2012-4-11 13:53
李敏 发表于 2012-4-11 13:44
不是不是, 我是问 这个 ----
是不是意味着在创建流的时候这个数组就已经到了内存??只有先写进去了才有 ...

数组创建的时候,int[] x = {1,2,3,4};
1,2,3,4 这四个数已经存在内存的堆区里面了的。string也一样存在于内存中的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2