DANCE WITH JAVA

开发出高质量的系统

常用链接

统计

积分与排名

好友之家

最新评论

Java中的IO的性能优化

 

Java中的IO的性能优化
在使用IO的时候注意一下细节,能使性能得到很大的优化.
首先读写大文件,使用Buffer是肯定的了,使用方法,有下边两个

 1 方法一:
 2 public   static   void  test1(String fileName)  {
 3      long  start  =  System.currentTimeMillis();
 4      try   {
 5         FileInputStream fis  =   new  FileInputStream(fileName);
 6         BufferedReader br  =   new  BufferedReader( new  InputStreamReader(fis) );
 7         StringBuffer sb  = new  StringBuffer();
 8         String str;
 9          while  ((str  =  br.readLine())  !=   null {
10             sb.append(str);
11         }

12     }
  catch  (IOException e)  {
13     }

14      long  end  =  System.currentTimeMillis();
15      long  time = end - start;
16     System.out.println(time);
17 }

18 方法二:
19 public   static   void  test2(String fileName)  {
20      long  start  =  System.currentTimeMillis();
21      try   {
22         FileInputStream fis  =   new  FileInputStream(fileName);
23          byte  buf[]  =   new   byte [ 8192 ];
24          int  n;
25         StringBuffer sb  =   new  StringBuffer();
26          while  ((n  =  fis.read(buf))  !=   - 1 {
27             sb.append(buf);
28         }

29         fis.close();
30     }
  catch  (IOException e)  {
31     }

32      long  end  =  System.currentTimeMillis();
33      long  time = end - start;
34     System.out.println(time);
35 }


方法一1937ms 
方法二47ms
测试结果相差大概50倍左有,很大。
而我平时的习惯是方法一。问题主要出在readLine()上。

如果只是简单的文件拷贝,下边两种方法也不错

 1 public       static       void    test3()       {
 2     String cmd   =   "  copy d:/out1.txt out2.txt  "  ;
 3      try   {
 4          Runtime.getRuntime().exec(cmd);
 5     }
  catch  (Exception e)  {
 6          e.printStackTrace();
 7     }

 8 }

 9 public     static     void   test4()  {
10     String inFileName   =     "  d:/out1.txt  "  ;
11     String outFileName   =     "  d:/out2.txt  "  ;
12      long   start   =   System.currentTimeMillis();
13      try   {
14         File inFile   =     new   File(inFileName);
15         File outFile   =     new   File(outFileName);        
16         RandomAccessFile inRaf   =     new   RandomAccessFile(inFile,  "  r  "  );
17         RandomAccessFile outRaf   =     new   RandomAccessFile(outFile,  "  rw  "  );             
18         FileChannel infc   =   inRaf.getChannel();
19         FileChannel outfc   =   outRaf.getChannel();             
20         infc.transferTo(  0  , inFile.length(),outfc );             
21         infc.close();
22         outfc.close();
23     }
  catch  (Exception e)  {
24         e.printStackTrace();
25     }

26      long   end   =   System.currentTimeMillis();
27      long   time  =  end  -  start;
28     System.out.println(time);
29 }



posted on 2006-11-10 18:05 dreamstone 阅读(2195) 评论(3)  编辑  收藏 所属分类: jdk相关

评论

# re: Java中的IO的性能优化 2006-11-10 20:49 翔 ruben

你读一行和读byte [ 8192 ]本来就不公平。
新IO优势在非阻塞!不过个人比较喜欢新IO。
不过旧IO真的很简单,直观!
还有编码转化,个人觉得这个才真的令人烦!  回复  更多评论   

# re: Java中的IO的性能优化 2006-11-27 16:12 roygbip

方法一如果用来读取大文件就会出现OutOfMemoryError,所以以后还是用第二个方法好了。  回复  更多评论   

# re: Java中的IO的性能优化 2006-11-27 19:01 dreamstone

读取大文件都不行的,这个只是体现问题的demo,如果要读取大文件须要重写很多,比如加大buffer,读一次写一次,或者直接用channel  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: