黑马程序员技术交流社区

标题: 输入流写入遇到的问题 [打印本页]

作者: 象牙    时间: 2014-8-19 18:25
标题: 输入流写入遇到的问题
bis =new BufferedInputStream(new FileInputStream("1.mp3"));
bos = new BufferedOutputStream(new FileOutputStream("2.mp3"));
int len=0;
byte[] buf = new byte[bis.available()];
while((len=bis.read())!=-1)
{
bos.write(buf,0,len);
}
下边这个
bis =new BufferedInputStream(new FileInputStream("1.mp3"));
bos = new BufferedOutputStream(new FileOutputStream("2.mp3"));
int len=0;
while((len=bis.read())!=-1)
{
bos.write(len);
}
上边的方法写入的时候,发现了两个小问题,这两个方法用的是字节流缓冲技术,第一个问题是在进行写入的时候发现了无线循环,第二个能够正常复制,明白的一点是由于用的是缓冲技术,已经用到了字节数组,按照视频写入的时候就不需要再用数组去存放,我只是好奇实验了一下,结果出现了死循环,哪位高手能解释一下为什么出现死循环

作者: 付江涛    时间: 2014-8-19 19:32
bos.write(buf,0,len) ,buf一直是null,数据在缓冲区,读数组木意义。
作者: 象牙    时间: 2014-8-19 21:01
付江涛 发表于 2014-8-19 19:32
bos.write(buf,0,len) ,buf一直是null,数据在缓冲区,读数组木意义。

恩 我测验是null,我不明白它这个地方是怎么去读的,为什么是个死循环,再就是它为什么是null 呢
作者: 付江涛    时间: 2014-8-19 22:03
本帖最后由 付江涛 于 2014-8-19 22:06 编辑

为什么是null,因为你定义好数组以后就没在数组里添加数据呗。
至于死循环:
api文档里,InputStream的read()方法是这么说的“在输入数据可用、检测到流末尾或抛出异常之前,此方法将一直阻塞。 ” 数据存在缓冲区,而你的输出流一直在写空数组buf。导致缓冲区数据一直没被写出去。所以 bis.read() 不会等于-1。
表述不清,也不知道我这样理解对不对
作者: 象牙    时间: 2014-8-19 22:16
付江涛 发表于 2014-8-19 22:03
为什么是null,因为你定义好数组以后就没在数组里添加数据呗。
至于死循环:
api文档里,InputStream的read ...

这个write方法不是再往buf中传数据吗?其实这个地方我不懂,从运行效果来看往Buf 中传数据 传的是一堆0。write(buf,0,len)到底是怎么运行的我看视频没看明白,重点在这里 在读BufferedInputStream不用write(buf,0,len)而用write(len)是OK的,而用InputStream的时候用write(buf,0,len)是OK的,为何呢 ,仅仅是加入了一个缓冲区,我这个地方糊里糊涂的
作者: LoveJava8    时间: 2014-8-19 22:35
len=bis.read())!=-1) read的时候你都没给参数,把数组的参数传进去就行了
作者: 付江涛    时间: 2014-8-20 11:56
象牙 发表于 2014-8-19 22:16
这个write方法不是再往buf中传数据吗?其实这个地方我不懂,从运行效果来看往Buf 中传数据 传的是一堆0。 ...

首先write()是OutputStream也是子类FileOutputStream的方法,不是往buf里传数据的,而是往输出流写数据。你的数据是通过read()方法读到了底层内置的缓冲区。
bos.write(buf,0,len);,意为将buf数组中0角标位到len角标位的数据写入输出流,也就是你定义的“2.mp3”中。而buf数组你并没有输入数据。如果想输入数据,至少也应该定义read的重载方法“read(buf) ”,将数据定义到你自定义的数组中。
--------------------------------
至于:
读BufferedInputStream不用write(buf,0,len)而用write(len)是OK的,而用InputStream的时候用write(buf,0,len)是OK的,为何呢 ,仅仅是加入了一个缓冲区

说白了,在使用BufferedInputStream,BufferedOutputStream时,底层已经给你增加了缓冲功能,为什么还非得写到自己定义的数组里呢。
--------------------------------
语文不好,表述不清,怎么感觉越说越迷糊{:3_62:}

作者: 象牙    时间: 2014-8-20 19:17
付江涛 发表于 2014-8-20 11:56
首先write()是OutputStream也是子类FileOutputStream的方法,不是往buf里传数据的,而是往输出流写数据。 ...

谢谢 ,我只是好奇尝试了一下,我自己再好好消化一下,麻烦了




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