黑马程序员技术交流社区

标题: 字节流拷贝图片时间好长. [打印本页]

作者: skill20    时间: 2014-5-13 15:41
标题: 字节流拷贝图片时间好长.
这个是我用字节流复制图片的代码。
  1. package cn.itcast.day;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;

  8. public class StreamTest {

  9.         public static void main(String[] args) throws IOException{
  10.                 // TODO Auto-generated method stub
  11.                 long start = System.currentTimeMillis();
  12.                 copy();
  13.                 long end =  System.currentTimeMillis();
  14.                 System.out.println("time = "+ (end - start));
  15.         }
  16.         public static void copy_1()throws IOException{
  17.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:\\day01\\1.jpg"));
  18.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\day01\\a.jpg"));
  19.                 int len = 0;
  20.                 while((len = bis.read())!= -1){
  21.                         bos.write(len);
  22.                         bos.flush();
  23.                 }
  24.                 bos.close();
  25.                 bis.close();
  26.         }
  27.         public static void copy()throws IOException{
  28.                 FileInputStream fis = new FileInputStream("d:\\day01\\a.jpg");
  29.                 My_Stream ms = new My_Stream(fis);
  30.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:\\day01\\1.jpg"));
  31.                 int len = 0;
  32.                 //System.out.println(ms.myRead());
  33.                 while((len = ms.myRead())!= -1){
  34.                         bos.write(len);
  35.                         bos.flush();
  36.                 }
  37.                 ms.myClose();
  38.                 bos.close();
  39.         }
  40. }
  41. class My_Stream{
  42.         private InputStream ips;
  43.         private byte[] buf = new byte[1024*100];
  44.         private int len = 0;
  45.         private int count = 0;
  46.         public My_Stream(InputStream ips) {
  47.                 this.ips = ips;
  48.         }
  49.         public int myRead()throws IOException{
  50.                 if(len == 0){
  51.                         count = 0;
  52.                         len = ips.read(buf);
  53.                         if(len < 0)
  54.                                 return -1;
  55.                         byte b = buf[count];
  56.                         len--;
  57.                         count++;
  58.                         return b&255;
  59.                 }else if(len > 0){
  60.                         byte b = buf[count];
  61.                         len--;
  62.                         count++;
  63.                         return b&255;
  64.                 }
  65.                 return -1;
  66.         }
  67.         public void myClose()throws IOException{
  68.                 ips.close();
  69.         }
  70. }
复制代码



问题是:这个是啥原因啊,我电脑用的 i 5 的cpu啊。

作者: 神马    时间: 2014-5-13 15:45
问题出在第25行,你读一个字节就刷新一次,硬盘是一个字节一个字节写的,当然慢啦。把这句话注释掉就行了,你再试试看多快。
作者: skill20    时间: 2014-5-13 16:06
神马 发表于 2014-5-13 15:45
问题出在第25行,你读一个字节就刷新一次,硬盘是一个字节一个字节写的,当然慢啦。把这句话注释掉就行了, ...

厉害,原来是flush的问题。
作者: 温水煮青蛙    时间: 2014-5-13 17:19
一般字节流都不要这么刷新的,你可以做个字节流缓冲区,BufferedInputStream  如果你的是1M图片 可以定义个byte []buf=new byte[1024],每当这个缓冲区存满了就 flush一次。




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