zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    [原]获取openstack-pike安装包
    [原]Failed connect to mirrors.cloud.aliyuncs.com:80; Connection refused
    [原]shell批量文件增删改前后缀
    [原]CentOS 7 chrony 笔记
    [原]Docker-issue(2) http: server gave HTTP response to HTTPS client
    [原]Docker-issue(1) image name 显示为 <none>
    [原]Django(1)----Django-setting中的STATIC_URL 和STATIC_ROOT 和STATICFILES_DIRS 的区别
    [原]Django-issue(1)---postgresql数据库连接密码错误
    [转]50个极好的bootstrap 后台框架主题下载
    [原]eclipse + pydev :Error in sitecustomize; set PYTHONVERBOSE for tracaeback: KeyError: 'sitecustomize'
  • 原文地址:https://www.cnblogs.com/wztblog/p/789lk.html
Copyright © 2011-2022 走看看