A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵文杰 山林野马   /  2012-5-23 14:08  /  2292 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                                                              import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyByArrayDemo {
public static void main(String[] args) throws IOException {
  String s="file.txt";
  FileInputStream fis = new FileInputStream(s);
  String t="desc.txt";
  FileOutputStream fos = new FileOutputStream(t);
  char[]     f=s.toCharArray();
  byte[] buffer = new byte[f.length];    // 定义byte[]用来存储数据
  int len;                // 定义int变量用来记住有效数据的个数
  while ((len = fis.read(buffer)) != -1)    // 一次读取buffer.length个数据, 将数据存在buffer中, len记住个数. 如果没遇到文件末尾, 进入循环
   fos.write(buffer, 0, len);        // 将数组中的数据从0号索引开始, 写出len个
  
  fis.close();
  fos.close();
}
}
public static void main(String[] args) throws IOException {
  FileInputStream fis = new FileInputStream("004.jpg");  // 创建输入流指向file.txt
  FileOutputStream fos = new FileOutputStream("dest.jpg"); // 创建输出流指向dest.txt
  
  int b;              // 定义变量, 用来存储数据
  while ((b = fis.read()) != -1)        // 循环读取, 直到读到末尾为止
   fos.write(b);           // 将读到的字节写出
  
  fis.close();            // 关闭输入流
  fos.close();            // 关闭输出流
}

5 个回复

倒序浏览
肯定是第一种   第一种一次读取buffer个字节以后写入    循环次数少
第二种一次一个字符,循环次数多了,用时肯定就多了
回复 使用道具 举报
下面那种copy文件的效率高

你可以自己测试的
在开始的时候加上long begin = System.currentTimeMillis();
在结束的时候加上long end = System.currentTimeMillis();
然后最后打印end - begin
回复 使用道具 举报
论读取速度来说肯定是第一个慢  一个字符一个字符读 和一串一串读  单个的快点  读一次写一次!
回复 使用道具 举报
        肯定是第一种了,因为第一种是先将文件的内容读到字节数组中,是一次读取buffer.length个数据,再开始循环的,循环次数少,而第二种是一个一个的读,循环的读取,循环次数多,读写转换的次数也多,当然就慢些了
回复 使用道具 举报

RE: 下面那种copy文件的效率高

相对来讲第一个要高一些,但总的来说两个Copy效率都很低:第一个你虽然定义了缓冲区。但缓冲区的大小只有s.length个字节
(byte[] buffer = new byte[f.length];    );
也就是只有8个字节;一般来讲。缓冲区的大小会定义1024的整数倍; 这样会好很多。如果你把缓冲区定义为1M或者更多会更好;如byte[] buffer = new byte[1024*1024*x]; x 就在1到64之间;因为JVM的默认分配内存为64M, 一般不要超过这个数,否则会内存溢出;
当然任何事情都有他的局限性;x定义的越高风险也就越大。比如停电或者死机之类的意外情况:在读取流读取来数据,存在缓冲区中。还没有来的及写入硬盘;则缓冲区中的数据会被清空。因为缓冲区的数据是存在于内存而不是硬盘;JVM关闭之后就会被清空;   
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyByArrayDemo {
public static void main(String[] args) throws IOException {
  String s="file.txt";
  FileInputStream fis = new FileInputStream(s);
  String t="desc.txt";
  FileOutputStream fos = new FileOutputStream(t);
  char[]     f=s.toCharArray();
  byte[] buffer = new byte[f.length];    // 定义byte[]用来存储数据//f.length只有8;所以你的buffer数组也只有8;还是太短。一般建议定义为1024的整数倍;
  int len;                // 定义int变量用来记住有效数据的个数
  while ((len = fis.read(buffer)) != -1)    // 一次读取buffer.length个数据, 将数据存在buffer中, len记住个数. 如果没遇到文件末尾, 进入循环
   fos.write(buffer, 0, len);        // 将数组中的数据从0号索引开始, 写出len个
  
  fis.close();
  fos.close();
}
}
public static void main(String[] args) throws IOException {
  FileInputStream fis = new FileInputStream("004.jpg");  // 创建输入流指向file.txt
  FileOutputStream fos = new FileOutputStream("dest.jpg"); // 创建输出流指向dest.txt
  
  int b;              // 定义变量, 用来存储数据
  while ((b = fis.read()) != -1)        // 循环读取, 直到读到末尾为止
   fos.write(b);           // 将读到的字节写出
  
  fis.close();            // 关闭输入流
  fos.close();            // 关闭输出流
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马