黑马程序员技术交流社区
标题:
缓冲区技术到底快在哪里???
[打印本页]
作者:
as604049322
时间:
2014-12-3 10:30
标题:
缓冲区技术到底快在哪里???
本帖最后由 as604049322 于 2014-12-3 10:39 编辑
import java.io.*;
class CopyMp3
{
public static void main(String[] args) throws IOException
{
long start = System.currentTimeMillis();
copy_2();
long end = System.currentTimeMillis();
System.out.println("copy2消耗时间"+(end-start)+"毫秒");
}
public static void copy_3()throws IOException
{
FileInputStream bufis = new FileInputStream("d:\\in.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("d:\\out3.mp3"));
int num = 0;
byte[] buf = new byte[1024*4];
//System.out.println("第一个字节:"+bufis.myRead());
while((num=bufis.read(buf))!=-1)
{
for(byte i:buf)
bufos.write(i);
//for(int i=0;i<num;i++)
//bufos.write(buf[i]);
}
bufos.close();
bufis.close();
}
public static void copy_2()throws IOException
{
MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("d:\\in.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("d:\\out2.mp3"));
int by = 0;
//System.out.println("第一个字节:"+bufis.myRead());
while((by=bufis.myRead())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.myClose();
}
//通过字节流的缓冲区完成复制。
public static void copy_1()throws IOException
{
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("d:\\in.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("d:\\out1.mp3"));
int by = 0;
while((by=bufis.read())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.close();
}
}
复制代码
QQ拼音截图未命名.png
(59.32 KB, 下载次数: 4)
下载附件
2014-12-3 10:28 上传
昨天看到IO部分,就想我不使用缓冲区,直接写出去能怎么样,然后就自己加上了函数copy_3,然后测试了一下copy_2与copy_3的耗时,明显平均速度还是毕老师使用缓冲区技术快了几毫秒。
不明白具体快在了哪里。。。
作者:
a371166028
时间:
2014-12-3 10:43
你问我天有多高,我只能告诉你很高很高...
作者:
as604049322
时间:
2014-12-3 11:17
本帖最后由 as604049322 于 2014-12-3 11:21 编辑
下面是MyBufferedInputStream类的代码:
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)获取。
public int myRead()throws IOException
{
//通过in对象读取硬盘上数据,并存储buf中。
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;
}
if(count>=0)
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
复制代码
作者:
hello_csu
时间:
2014-12-3 11:36
你要明白I/O的输出对系统来说其实是一个中断操作,那使用缓冲技术就是减少了高频率的中断,那么时间和性能上肯定是会提高的。
作者:
liuhao0324
时间:
2014-12-3 11:40
不明白,
作者:
马个了黑_邓
时间:
2014-12-3 12:01
事实证明自定义一个数组比加缓冲区快得多
作者:
wtjohn
时间:
2014-12-3 12:17
{:2_32:} 说一个简单的,水缸里有水,需要你把水全倒出来,你可以使用勺子,也可以使用水桶,你说哪个快{:2_43:}
作者:
Tae丶Yeon
时间:
2014-12-3 19:37
缓冲区技术不是就是在内部封装了一个数组吗
作者:
cbb
时间:
2014-12-3 20:41
记得有一道题就是:怎么高效复制文件!却是使用字符数组最快!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2