黑马程序员技术交流社区

标题: 使用带缓冲功能的字节流复制文件 [打印本页]

作者: 坏男孩    时间: 2014-5-2 16:26
标题: 使用带缓冲功能的字节流复制文件
求教!使用带缓冲功能的字节流复制文件怎么复制?  没接触过流。
作者: 孙旌棋    时间: 2014-5-2 16:49
这个其实很简单的哦, 所谓的缓冲就是一次读取的数据多一点, 不用每次只读取一个字节

举个简单的例子
你要吃花生米, 如果你用筷子夹的话, 正常情况下一次是不是只能夹一粒花生米, 如果你用勺子呢?
是不是每次就可以吃到很多的花生米呢, 缓冲区用的就是这个道理, 可以提高效率的哦, 你想想吃花生米的那个例子觉得是不是呢?
  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;

  6. public class SunJingQi {
  7.         public static void main(String[] args) {

  8.                 BufferedInputStream bufis = null;
  9.                 BufferedOutputStream bufos = null;

  10.                 try {
  11.                         bufis = new BufferedInputStream(new FileInputStream(
  12.                                         "c:\\sunjingqi.mp3"));
  13.                         bufos = new BufferedOutputStream(new FileOutputStream(
  14.                                         "f:\\sunjingqi.mp3"));

  15.                         int byt = 0;
  16.                         while ((byt = bufis.read()) != -1) {
  17.                                 bufos.write(byt);
  18.                         }
  19.                 } catch (IOException e) {
  20.                         throw new RuntimeException("MP3拷贝失败");
  21.                 } finally {
  22.                         try {
  23.                                 if (bufis != null)
  24.                                         bufis.close();
  25.                         } catch (IOException e) {
  26.                                 throw new RuntimeException("读取关闭失败");
  27.                         }
  28.                         try {
  29.                                 if (bufos != null)
  30.                                         bufos.close();
  31.                         } catch (IOException e) {
  32.                                 throw new RuntimeException("写入关闭失败");
  33.                         }
  34.                 }
  35.         }
  36. }
复制代码

作者: 孙旌棋    时间: 2014-5-2 16:50
你可以对比这个没有使用缓冲区的代码, 看看有什么不一样, 很简单的哦
  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;

  4. public class SunJingQi {

  5.         public static void main(String[] args) {

  6.                 FileInputStream fis = null;
  7.                 FileOutputStream fos = null;

  8.                 try {
  9.                         fis = new FileInputStream("c:\\sunjingqi.jpg");
  10.                         fos = new FileOutputStream("F:\\sunjingqi.jpg");

  11.                         byte[] buf = new byte[1024];
  12.                         int len = 0;
  13.                         while ((len = fis.read(buf)) != -1) {
  14.                                 fos.write(buf, 0, len);
  15.                         }

  16.                 } catch (IOException e) {
  17.                         throw new RuntimeException("图片拷贝失败");
  18.                 } finally {
  19.                         try {
  20.                                 if (fis != null)
  21.                                         fis.close();
  22.                         } catch (IOException e) {
  23.                                 throw new RuntimeException("读取关闭失败");
  24.                         }
  25.                         try {
  26.                                 if (fos != null)
  27.                                         fos.close();
  28.                         } catch (IOException e) {
  29.                                 throw new RuntimeException("写入关闭失败");
  30.                         }
  31.                 }
  32.         }
  33. }
复制代码

作者: 来男.    时间: 2014-5-2 16:53
import java.io.*;

class Demo33{

public static void main(String[] args) throws IOException{

  //简化写法,建立BufferdReader和BufferedWriter两个缓冲
  BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("c:\\k1.txt")));
  BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\k2.txt")));
  String line=null;

  //读取k1中的内容
  while((line=bufr.readLine())!=null){
  //写到k2中
   bufw.write(line);

  //换行
   bufw.newLine();

  //刷新
   bufw.flush();
  }

  //关流
  bufw.close();
  bufr.close();
}
}


这其中用到了转换流InputStreamReader和OutputStreamWriter,字节流FileInputStream和FileOutputStream。


作者: skill20    时间: 2014-5-2 17:11
  1. import java.io.*;
  2. class Copy
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 copy();
  7.         }
  8.         public static void copy()
  9.         {
  10.                 BufferedInputStream bis = null;
  11.                 BufferedOutputStream bos = null;
  12.                 File file1 = new File("D:\\a.jpg");
  13.                 File file2 = new File("D:\\b.jpg");
  14.                 try
  15.                 {
  16.                         bis = new BufferedInputStream(new FileInputStream(file1));
  17.                         bos = new BufferedOutputStream(new FileOutputStream(file2));
  18.                         int num = 0;
  19.                         byte[] buf = new byte[1024];
  20.                         while ((num = bis.read(buf)) != -1)
  21.                         {
  22.                                 bos.write(buf);
  23.                         }
  24.                 }
  25.                 catch (IOException e)
  26.                 {
  27.                         throw new RuntimeException("复制失败");
  28.                 }
  29.                 finally
  30.                 {
  31.                         try
  32.                         {
  33.                                 if( bis != null)
  34.                                         bis.close();
  35.                         }
  36.                         catch (IOException e)
  37.                         {
  38.                                 throw new RuntimeException(e);
  39.                         }
  40.                         try
  41.                         {
  42.                                 if( bos != null)
  43.                                         bos.close();
  44.                         }
  45.                         catch (IOException e)
  46.                         {
  47.                                 throw new RuntimeException(e);
  48.                         }
  49.                 }
  50.        
  51.         }
  52. }
复制代码

作者: 坏男孩    时间: 2014-5-3 10:52
来男. 发表于 2014-5-2 16:53
import java.io.*;

class Demo33{

挺好,我刚学到流,挺简洁的
作者: 来男.    时间: 2014-5-3 11:14
坏男孩 发表于 2014-5-3 10:52
挺好,我刚学到流,挺简洁的

同学,你之前说的复制文件是文本、照片还是mp3呀?
作者: 坏男孩    时间: 2014-5-3 11:41
来男. 发表于 2014-5-3 11:14
同学,你之前说的复制文件是文本、照片还是mp3呀?

文本,这是黑马基础测试的一道题,我之前没接触过流
作者: Piston    时间: 2014-7-20 10:47
碰到同样的问题,谁测试 做过了?
作者: 黑马_小漒    时间: 2014-8-20 02:04
大神无处不在啊~~~

作者: mengzi987    时间: 2014-10-18 10:20
孙旌棋 发表于 2014-5-2 16:49
这个其实很简单的哦, 所谓的缓冲就是一次读取的数据多一点, 不用每次只读取一个字节

举个简单的例子

如何将你所要复制的文件路径与代码文件的路径相关联

作者: biebie    时间: 2014-12-16 16:17
这个太赞了
作者: 刘建华    时间: 2015-1-23 15:26

这个太赞了
作者: 延续梦境    时间: 2015-3-2 20:33
孙旌棋 发表于 2014-5-2 16:49
这个其实很简单的哦, 所谓的缓冲就是一次读取的数据多一点, 不用每次只读取一个字节

举个简单的例子

这个如果不使用缓冲区也是一样的吗?

作者: IT未来    时间: 2015-3-5 20:44
大学学的东西全忘了,现在一点一点捡
作者: 嘎嘎鸭子    时间: 2015-5-16 13:42
用到了转换流InputStreamReader和OutputStreamWriter,字节流FileInputStream和FileOutputStream。
作者: xiaoqiao    时间: 2015-5-28 14:30
赞一个!刚好今天碰到了,,嘿嘿~~~
作者: gaoyilin    时间: 2015-6-29 22:00
还是看不懂啊。。。。。
作者: maizi1912    时间: 2015-7-15 14:52
这个要多看看   我还不怎么懂
作者: dajiaoya    时间: 2015-7-17 11:57
分享快乐 赞一个
作者: liuch111    时间: 2015-7-26 11:12
不错 写的                                      
作者: 暴走的牛奶    时间: 2015-8-11 00:38
孙旌棋 发表于 2014-5-2 16:49
这个其实很简单的哦, 所谓的缓冲就是一次读取的数据多一点, 不用每次只读取一个字节

举个简单的例子

睡不着,来论坛逛逛
作者: phantom33    时间: 2015-10-8 21:41
这个太赞了
作者: phantom33    时间: 2015-10-8 21:59
程序是遇到-1就会停止不读了
作者: Pinfan    时间: 2015-10-17 12:39
孙旌棋 发表于 2014-5-2 16:49
这个其实很简单的哦, 所谓的缓冲就是一次读取的数据多一点, 不用每次只读取一个字节

举个简单的例子

例子很生动啊
作者: 为爱算了吧    时间: 2015-11-22 14:40
孙旌棋 发表于 2014-5-2 16:49
这个其实很简单的哦, 所谓的缓冲就是一次读取的数据多一点, 不用每次只读取一个字节

举个简单的例子

挺好的  参考一下




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