/*
技术贴(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);
}
}
|
|