• java知识点8


     我们知道Java中一般的输入输出流类都是用单字节的读取方法来进行I/O操作的,也就是说每次只读写一个字节的数据,这种方法显然繁琐低效。如果从设备读取10M的文件,每次读取一个字节,完成操作将需要做10M/次I/O操作,I/O操作又是一件相当耗时的事情,无疑在很大程度上降低了系统的性能。


        Java中专门提供提高I/O效率的缓冲类,这好比在数据读写时提供一个临时缓冲区,每次读取一个缓冲区大小的数据,将这数据库一次性写入目标设备。下图中分别为两种读取方式。


        举个简单例子,在A地有10000本书需要搬到B地,如果一次搬1本,需要10000次。如果每次取1000本放到一个货车上,运到B地,需要10次完成。货车相当于是缓存区。同样道理,开设一个数据缓存区每次读取一数据块对于提高读取效率有显著提升。下面用一个具体代码示例来表示二者的性能差别。

    Java代码  收藏代码
      1. import java.io.*;  
      2.   
      3. /******************************************************************************* 
      4.  *  
      5.  * @author pengcqu 
      6.  *  
      7.  */  
      8. public class TestBuffer {  
      9.   
      10.     public static void main(String args[]) throws IOException {  
      11.         TestBuffer br = new TestBuffer();  
      12.         String from = "d:/a/1.MP3";  
      13.         long startTime = System.currentTimeMillis();  
      14.         br.readWrite(from,"d:/b/2.MP3");  
      15.         long endTime = System.currentTimeMillis();  
      16.         System.out.println("直接读取耗时:" + (endTime - startTime) +"ms");  
      17.         long startTime1 = System.currentTimeMillis();  
      18.         br.readWriteWithBuffer(from, "d:/b/3.MP3");  
      19.         long endTime1 = System.currentTimeMillis();  
      20.         System.out.println("使用缓冲区读取耗时:" + (endTime1 - startTime1) +"ms");  
      21.           
      22.   
      23.     }  
      24.   
      25.     /*************************************************************************** 
      26.      * 直接读取文件 
      27.      *  
      28.      * @param from 
      29.      * @param to 
      30.      * @throws IOException 
      31.      */  
      32.     public static void readWrite(String from, String to) throws IOException {  
      33.         InputStream in = null;  
      34.         OutputStream out = null;  
      35.         try {  
      36.             in = new FileInputStream(from);  
      37.             out = new FileOutputStream(to);  
      38.             while (true) {  
      39.                 int data = in.read();  
      40.                 if (data == -1) {  
      41.                     break;  
      42.                 }  
      43.                 out.write(data);  
      44.             }  
      45.         } finally {  
      46.             if (in != null) {  
      47.                 in.close();  
      48.             }  
      49.             if (out != null) {  
      50.                 out.close();  
      51.             }  
      52.         }  
      53.     }  
      54.   
      55.     /*************************************************************************** 
      56.      * 使用缓存区读写文件 
      57.      * @param from 
      58.      * @param to 
      59.      * @throws IOException 
      60.      */  
      61.     public static void readWriteWithBuffer(String from, String to)  
      62.             throws IOException {  
      63.         InputStream inBuffer = null;  
      64.         OutputStream outBuffer = null;  
      65.         try {  
      66.             inBuffer = new BufferedInputStream(new FileInputStream(from));  
      67.             outBuffer = new BufferedOutputStream(new FileOutputStream(to));  
      68.             while (true) {  
      69.                 int data = inBuffer.read();  
      70.                 if (data == -1) {  
      71.                     break;  
      72.                 }  
      73.                 outBuffer.write(data);  
      74.             }  
      75.         } finally {  
      76.             if (inBuffer != null) {  
      77.                 inBuffer.close();  
      78.             }  
      79.             if (outBuffer != null) {  
      80.                 outBuffer.close();  
      81.             }  
      82.         }  
      83.     }  
      84.   
      85. }  
  • 相关阅读:
    SQLSERVER 2008 R2导入XLSX文件错误,提示报错:The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. (System.Data)
    转-马斯洛需求层次理论
    邮件发送提示错误“0x800CCC0F”,并存留在发件箱
    WIN10系统JAVA环境配置
    转-简单了解Python装饰器实现原理
    set集合
    阿里云服务器地址及端口
    转:苹果手机同步阿里云邮箱日历
    官方:金蝶实际成本在制品分配详解
    官方:金蝶实际成本在制品材料分配详解
  • 原文地址:https://www.cnblogs.com/wztblog/p/789lk.html
Copyright © 2020-2023  润新知