您现在的位置:主页 > java教程 > 思维拓展 > >

2分钟理解文件IO -我对文件IO的理解与实验对比



时间: 2017-03-20 10:58     来源 : cnblogs      点击:

关键词: javaio    BufferedInpu   



本文介绍了不同的IO方式以及他们之间的效率比较
 
1.一次读取写入单个字节(读取400M的文件浪费了很久,等了很久没读取完成,证明其效率很差)
 copyright www.itxxz.com 
 内容来自www.itxxz.com 
 
 1 public class CopyFileDemo {
 2     public static void main(String[] args) throws IOException {
 3         FileInputStream fis = new FileInputStream("a.txt");
 4         FileOutputStream fos = new FileOutputStream("b.txt");
 5         
 6         // 方式一:一次读取写入单个字节
 7         int i = 0;
 8         while ((i = fis.read()) != -1) {
 9             fos.write(i);
10         }
11         fos.close();
12         fis.close();
13     }
14 } 
itxxz.com
 

2.一次读取写入多个字节(读取400M的文件700ms)

 1 public class CopyFileDemo {
 2 public static void main(String[] args) throws IOException {
 3   FileInputStream fis = new FileInputStream("a.txt");
 4   FileOutputStream fos = new FileOutputStream("b.txt");
 5   // 方式二:一次读取写入一个字节数组
 6   byte[] by = new byte[1024];
 7   int len = 0;
 8   while ((len = fis.read(by)) != -1) {
 9     fos.write(by, 0, len);
10   }
11   fos.close();
12   fis.close(); 
13   }
14 } 

内容来自www.itxxz.com

复制代码

3.文件流输入输出(读取400M的文件5000ms,为什么更慢呢,猜测是readline这里,大神可以指出来)


 
 1 public class CopyFileDemo3 {
 2 public static void main(String[] args) throws IOException {
 3     BufferedReader br=new BufferedReader(new FileReader("a.txt"));
 4     //如果d文件中有数据,true表示继续往文件中追加数据
 5     BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt",true));
 6 
 7     String line=null;
 8     //高效字符输入流的特有方法readline(),每次读取一行数据
 9     while((line=br.readLine())!=null){
10         bw.write(line);
11         //高效字符输出流的特有方法newline()
12         bw.newLine();
13         //将缓冲区中的数据刷到目的地文件中
14         bw.flush();
15     }
16     //关闭流,其实关闭的就是java调用的系统底层资源。在关闭前,会先刷新该流。
17     bw.close();
18     br.close();
19 }
20 } IT学习者(www.itxxz.com) 
 


BufferedInputStream 会根据情况自动为我们预读更多的字节数据到它自己维护的一个内部字节数组缓冲区中,这样我们便可以减少系统调用次数,从而达到其缓冲区的目的。所以要明确的一点是 BufferedInputStream 的作用不是减少 磁盘IO操作次数(这个OS已经帮我们做了),而是通过减少系统调用次数来提高性能的。

 1 public class CopyFileDemo {
 2     public static void main(String[] args) throws IOException {
 3         FileInputStream fis = new FileInputStream("a.txt");
 4         FileOutputStream fos = new FileOutputStream("b.txt");
 5         
 6         // 方式一:一次读取写入单个字节
 7         int i = 0;
 8         while ((i = fis.read()) != -1) {
 9             fos.write(i);
10         }
11         fos.close();
12         fis.close();
13     }
14 } copyright www.itxxz.com 
 

4.NIO读取 (400M的视频文件,读取要长达700ms)

 
 1 public class ReadDemo{
 2 public static void main(String[] args) throws IOException {
 3      File file = new File("sdtgj.mp4");  
 4      FileInputStream in = new FileInputStream(file);  
 5      FileChannel channel = in.getChannel();  
 6      ByteBuffer buff = ByteBuffer.allocate(1024);   
 7        
 8      long begin = System.currentTimeMillis();  
 9      while (channel.read(buff) != -1) {  
10          buff.flip();  
11          buff.clear();  
12      }  
13      long end = System.currentTimeMillis();  
14      System.out.println("time is:" + (end - begin)+"毫秒   "+"读取 "+file.getName());  
15 }
16 } itxxz.com 
 

5.内存映射读取 (400M的视频文件,读取只要100ms)


 
 1 public class ReadDemo{
 2  
 3      static final int BUFFER_SIZE = 1024;  
 4       
 5         public static void main(String[] args) throws Exception {  
 6       
 7             File file = new File("sdtgj.mp4");  
 8             FileInputStream in = new FileInputStream(file);  
 9             FileChannel channel = in.getChannel();  
10             MappedByteBuffer buff = channel.map(FileChannel.MapMode.READ_ONLY, 0,  
11                     channel.size());  
12       
13             byte[] b = new byte[1024];  
14             int len = (int) file.length();  
15       
16             long begin = System.currentTimeMillis();  
17       
18             for (int offset = 0; offset < len; offset += 1024) {  
19       
20                 if (len - offset > BUFFER_SIZE) {  
21                     buff.get(b);  
22                 } else {  
23                     buff.get(new byte[len - offset]);  
24                 }  
25             }  
26       
27             long end = System.currentTimeMillis();  
28             System.out.println("time is:" + (end - begin)+"毫秒   "+"读取 "+file.getName()); 
29       
30         }  
31 }
 

官网:http://www.itxxz.com

 


DirectMemory不受JVM堆大小控制,速度最快。






文章除注明转载外,均为IT学习者原创或编译
欢迎任何形式的转载,但务必请以超链接形式注明出处
本文出自:cnblogs
链接地址:http://www.cnblogs.com/douyamv/p/6586068.html



微信公众号:喝咖啡的螃蟹

喝咖啡的螃蟹
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
  • 美腿mm
    2017-03-22 05:03:46发表

    江疏影再现美腿杀￑高跟黑丝￑吊丝袜￑ www.meinv95.com

  • 葛仪融
    2017-03-21 01:00:56发表

    臭丝袜 丝袜片 性感丝袜美臀 美腿控的福音 原味丝袜 丝袜交 www.meinv95.com

  • 谢华彩
    2017-03-20 22:08:28发表

    ⣘送58元 金沙集团 彩金派发专员QQ:3447473623

  • 注册送88元
    2017-03-20 20:38:41发表

    新年红包߰ 蓝鼎国际 新濠 E乐博 澳门巴黎人 1118T。CoM

  • 制服美腿
    2017-03-20 13:51:43发表

    谢楠丝袜 丝袜家 hTtP://8636.meizi1.com