黑马程序员技术交流社区

标题: 技术贴(bug贴) : BufferedInputStream字节缓冲流中的bug。 [打印本页]

作者: zms2100    时间: 2013-5-9 08:31
标题: 技术贴(bug贴) : BufferedInputStream字节缓冲流中的bug。
/*
        技术贴(bug贴) : BufferedInputStream字节缓冲流中的bug。

        技术贴,定义已解决是解决了自己昨晚头疼的问题 : http://bbs.itheima.com/forum.php ... mp;extra=#pid318109
           【话说版主们可能太忙了,都没给我加点技术分,5555555...........O(∩_∩)O~,如果觉得这贴有内涵等,可否再多给点,呵呵O(∩_∩)O~】

回到问题上来 :  ——————————————————————————————————————————————————————————————————
        当使用BufferedInputStream操作大数据文件时往往不能仅靠BufferedInputStream默认的8192字节byte[]数组
        (版本不同,默认容量会有不同);因此就要使用到BufferedInputStream(InputStream in,int size)构造函数。

        异常 bug: 设置了该size数值后,能指定buf数组的长度,但是(有比较郁闷的情况,为便于了解,下面举较简单的情况/例子)
                        按道理buf数组会直接指定给缓冲流的read()语句(因为这是它本身的byte数组),
                        但是在实际操作时read()并没有将缓冲流读取到的数据传递给buf数组,导致它read每次只读取几个字节,
                        相当于没有添加byte[]数组,因此变成单字节的读写操作复制文件的过程。
                                【下面是代码、图片(图片中有测试结果以及解析)】

        (PS: 我不知道这是我JDK版本的问题还是大多数的情况,分享给大家了解吧,至少也可了解如何解决遇到的问题。)
*/
package hehe;
import java.io.*;
import java.util.*;

class Buffered extends BufferedInputStream
{
        Buffered(InputStream in,int size)                        //因为BufferedInputStream中的byte[]数组的buf是被protected修饰的,
        {                                                                                //所以想要获得调用它的方法就是变成BufferedInputStream的子类。
                super(in,size);                                        //(这是之前在网上了解BufferedInputStream的默认buf数组容量时发现的方法,学以致用,O(∩_∩)O~)
        }
        Buffered(InputStream in)
        {
                super(in);
        }
        public static void main(String[] args)throws Exception
        {
                long start = System.currentTimeMillis();
                long startTime = System.nanoTime();

                Buffered bis = new Buffered(new FileInputStream
                                ("F:\\KuGouCache\\Java核心技术,卷1(原书第8版).pdf"),1024*1024*2);

                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\KuGouCache\\Java.pdf"));

                int i = 0;
                while((i=bis.read())!=-1)
                {
                        sop(bis.buf.length);
                        sop(bis.count);
                        sop("每次写入的:::"+i);
                        bos.write(i);                                        //bis.buf / i
                        sop("写入之后:::"+bis.count);
                }
                bis.close();
                bos.close();
                long C = System.currentTimeMillis() - start;
                long estimatedTime = System.nanoTime() - startTime;

                sop("毫秒:"+C);
                sop("毫微秒:"+estimatedTime);
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}



BufferedInputStream测试结果2.JPG (123.35 KB, 下载次数: 0)

指定缓冲流自身buf数组

指定缓冲流自身buf数组





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