关于BufferedInputStream和BufferedOutputStream的问题

ITurbo 2014-05-01 02:21:57
public class Copypicture {
public static void main(String[] args) {
copy_2();//copy_1();
}
public static void copy_1(){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("1.doc");
fos = new FileOutputStream("2.doc");
byte[] buff = new byte[1024];
int len = 0;
while((len=fis.read(buff))!=-1){
//System.out.println(len);
fos.write(buff,0,len);
}
System.out.println("success!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fis.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void copy_2(){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
//int i = 0;
try {
bis = new BufferedInputStream(new FileInputStream("1.doc"));
bos = new BufferedOutputStream(new FileOutputStream("2.doc"));
//byte[] buff = new byte[1024];
int len = 0;
while((len=bis.read())!=-1){//return getBufIfOpen()[pos++] & 0xff;
//System.out.println(i++);
bos.write(len);//文件有多字节就写多少次
}
System.out.println("success!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
bis.close();
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

问题是:
copy_1()方法和copy_2()方法有什么区别?我理解的是copy_1()方法是从1.doc文件中读1024字节大小的文本到内存中,然后一股脑写入2.doc,而copy_2()方法是读1024字节大小的文本到内存中,然后一个字节一个字节的写入到2.doc中,是这样吗?可是如果是这样,那BufferedOutputStream这个定义了干嘛,效率不是反而低了吗?
...全文
347 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ITurbo 2014-05-26
  • 打赏
  • 举报
回复
一个是:fos.write(buff,0,len); 另一个是:bos.write(len);//文件有多字节就写多少次 方法调用的不一样。 1楼说的是对的 无论copy_1中的buff,和BufferedInputStream自带的缓冲区都是为了提高效率 我那么打印次数是不对的。 具体的执行次序是: BufferedInputStream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。 而FileInputStream通过使用copy_1中的buff效果是基本一样的。 Thanks,各位!
紫炎圣骑 2014-05-20
  • 打赏
  • 举报
回复
要自己控制读取多少字节,否则可能会导致内存溢出 read(byte b[], int off, int len),每次读取1024个字节,写出,然后再次读入
jiekou0704 2014-05-20
  • 打赏
  • 举报
回复
深入了解值得学习。。。mark
zhjdg 2014-05-20
  • 打赏
  • 举报
回复
你这种大进大出,是没有区别的。而且是有点亏。 BufferedInputStream是委托模式。 一般是用read(byte b[], int off, int len),读一点,进行分析,再读一点。
ITurbo 2014-05-20
  • 打赏
  • 举报
回复
引用 4 楼 fanslate 的回复:
copy_2 你应该看看被 BufferedInputStream 包起来的 FileInputStream 里的 read(byte b[], int off, int len) 被调用多少次
没明白,能说的详细点吗/
byourfan 2014-05-09
  • 打赏
  • 举报
回复
copy_2 你应该看看被 BufferedInputStream 包起来的 FileInputStream 里的 read(byte b[], int off, int len) 被调用多少次
ITurbo 2014-05-09
  • 打赏
  • 举报
回复
自己顶一下自己顶一下
ITurbo 2014-05-05
  • 打赏
  • 举报
回复
引用 1 楼 zhanglt 的回复:
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。 BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持“mark()标记”和“reset()重置方法”。 BufferedInputStream 本质上是通过一个内部缓冲区数组实现的。例如,在新建某输入流对应的BufferedInputStream后,当我们通过read()读取输入流的数据时,BufferedInputStream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。 copy_1中的buff类似BufferedInputStream 自带的缓冲区,copy_2中buff那一句已经注释掉了,BufferedInputStream 默认的缓冲字节是8192,无论copy_1中的buff,和BufferedInputStream自带的缓冲区都是为了提高效率,至于两个的效率谁高,这个要测试才知道
可是我测试了啊,copy_1中的while循环 fos.write(buff,0,len)只要执行几十此就OK了,而copy-2中的while循环是一个字节一个字节写入的,需要几万次`````这是为什么呢?既然有了BufferedInputStream,不是应该像copy_1中的那样执行吗?
zhanglt 2014-05-05
  • 打赏
  • 举报
回复
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。 BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持“mark()标记”和“reset()重置方法”。 BufferedInputStream 本质上是通过一个内部缓冲区数组实现的。例如,在新建某输入流对应的BufferedInputStream后,当我们通过read()读取输入流的数据时,BufferedInputStream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。 copy_1中的buff类似BufferedInputStream 自带的缓冲区,copy_2中buff那一句已经注释掉了,BufferedInputStream 默认的缓冲字节是8192,无论copy_1中的buff,和BufferedInputStream自带的缓冲区都是为了提高效率,至于两个的效率谁高,这个要测试才知道

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧