缓冲区的作用是,先把数据放着先,等足够多的时候,我再来取,这样效率高 —— 我就拿字节流的缓冲区来说明吧。
- public static void copy_1() throws IOException
- {
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream("1.mp3"));
- BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("3.mp3"));
-
- int len = 0;
- while((len = bis.read())!=-1)
- {
- bos.write(len);
- }
- bis.close();
- bos.close();
- }
复制代码
我想问的是, BufferedInputStream 查看API 可以了解,它已经有buf ,我不用自己定义, buf是受保护的,
问题1:我没法指向它,这导致我无法给缓冲区定制大小,它是根据机子的性能决定的是吗 ?
不知道大家有印象没,老毕在讲IO流的时候,自己写了一个MyBufferedInputStream , 它自己定义了个缓冲区,效率比JAVA还要高很多,
问题2: 效率的提高,是根据缓冲区的大小是吗?
然后我突发奇想 , 好像不用老毕那么麻烦的写法,我也能定制一个缓冲区,而且还可以规定它的大小,你们看我下面的代码:
- public static void copy_2() throws IOException
- {
- FileInputStream fis = new FileInputStream("1.mp3");
- FileOutputStream fos = new FileOutputStream("4.mp3");
- byte[] buf = new byte[1024*4];
- int len = 0;
- while((len = fis.read(buf))!=-1)
- {
- fos.write(buf,0,len);
- }
- fis.close();
- fos.close();
- }
复制代码
实际的运行,通过时间来计算, 效率好像比JAVA的缓冲区还好,
我想知道,我定义的跟自带的缓冲区的区别在于哪里 ~ 哪个更为高效 , 为什么 ~ 请指出 !!
- long start = System.currentTimeMillis();
- copy_1();
- long end = System.currentTimeMillis();
- System.out.println((end-start)+"毫秒");
- long start = System.currentTimeMillis();
- copy_2();
- long end = System.currentTimeMillis();
- System.out.println((end-start)+"毫秒");
复制代码
|
|