欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java高效文件流讀寫操作詳解

 更新時間:2019年07月10日 09:39:19   作者:伏地魔帕薩醬就是我  
這篇文章主要介紹了java高效文件流讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

導語

防止自己以后忘記,記錄一些文件流的性能對比。

平常經(jīng)常會操作到文件讀寫,java當中提供了許多操作文件的類,一般來說,文件操作也叫流操作,可以按照以下方式分類:

  • 按照功能分類,字節(jié)流和字符流。
  • 按照節(jié)點流和過濾流,節(jié)點流直接操作文件,過濾流包裝了節(jié)點流和過濾流。如FileInputStream和BufferedFileInputStream就是分別是節(jié)點流和過濾流。

文件流比較

下面重點比較我們經(jīng)常用的幾個流

(1) DataInputStream+FileInputStream

(2) DataInputStream+BufferedInputStream

(3) BufferedReader+FileReader(緩沖流大小不同性能也不同,如1K和8K)

(4) BufferedFileReader

先貼結論:

耗時對比為:

(4)優(yōu)于(3)—8096優(yōu)于(3)-1024優(yōu)于(2)<(1)

另外,BufferedFileReader如果涉及到讀取文件的每一行內容還可以在優(yōu)化,傳統(tǒng)的代碼如下所示:

BufferedFileReader in = new BufferedFileReader(); 
for (int i=0; i < nargs; i++) { 
 try { 
  in.open(args[i]); 
  while ((line = in.readLine()) != null) { 
   nlines++; 
  } in.close(); 
} catch (Exception e) { 
 System.out.println(" BFRTest: exception:" + e ); 
}

代碼中第5行,BufferedReader首先生成一個StringBuffer,然后轉成一個String返回,這里涉及到兩次字符拷貝。假設讀取10000行,會有10000個臨時的String對象生成,內存比較耗費,由于BufferedReader的緩沖流是私有的,因此這里的優(yōu)化點是可以自己管理緩沖流。最佳的讀文件的方法代碼如下:

  FileReader fr;
  int nlines = 0;
  char buffer[] = new char[8192 + 1];
  int maxLineLength = 128;

  //assumes no line is longer than this
  char lineBuf[] = new char[maxLineLength];
  for (int i = 0; i < nargs; i++) {
   try {
    fr = new FileReader(args[i]);

    int nChars = 0;
    int nextChar = 0;
    int startChar = 0;
    boolean eol = false;
    int lineLength = 0;
    char c = 0;
    int n;
    int j;

    while (true) {
     if (nextChar >= nChars) {
      n = fr.read(buffer, 0, 8192);
      if (n == -1) { // EOF
       break;
      }
      nChars = n;
      startChar = 0;
      nextChar = 0;
     }

     for (j = nextChar; j < nChars; j++) {
      c = buffer[j];
      if ((c == '\n') || (c == '\r')) {
       eol = true;
       break;
      }
     }
     nextChar = j;

     int len = nextChar - startChar;
     if (eol) {
      nextChar++;
      if ((lineLength + len) > maxLineLength) {
       // error
      } else {
       System.arraycopy(buffer, startChar, lineBuf, lineLength, len);
      }
      lineLength += len;

      //
      // Process line here
      //
      nlines++;

      if (c == '\r') {
       if (nextChar >= nChars) {
        n = fr.read(buffer, 0, 8192);
        if (n != -1) {
         nextChar = 0;
         nChars = n;
        }
       }

       if ((nextChar < nChars) && (buffer[nextChar] == '\n'))
        nextChar++;
      }
      startChar = nextChar;
      lineLength = 0;
      continue;
     }

     if ((lineLength + len) > maxLineLength) {
      // error
     } else {
      System.arraycopy(buffer, startChar, lineBuf, lineLength, len);
     }
     lineLength += len;
    }
    fr.close();
   } catch (Exception e) {
    System.out.println("exception: " + e);
   }

NIO文件流

FileChanel介紹

通道,之前流是單向的,而通道是雙向的,既可以讀,也可以寫。讀取文件效率參考這里。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • logback?OutputStreamAppender高效日志輸出源碼解析

    logback?OutputStreamAppender高效日志輸出源碼解析

    這篇文章主要介紹了為大家logback?OutputStreamAppender日志輸出效率提升示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • springboot+mybatis-plus基于攔截器實現(xiàn)分表的示例代碼

    springboot+mybatis-plus基于攔截器實現(xiàn)分表的示例代碼

    本文主要介紹了springboot+mybatis-plus基于攔截器實現(xiàn)分表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java中的synchronized和ReentrantLock的區(qū)別詳細解讀

    Java中的synchronized和ReentrantLock的區(qū)別詳細解讀

    這篇文章主要介紹了Java中的synchronized和ReentrantLock的區(qū)別詳細解讀,synchronized是Java內建的同步機制,所以也有人稱其為 IntrinsicLocking,它提供了互斥的語義和可見性,當一個線程已經(jīng)獲取當前鎖時,其他試圖獲取的線程只能等待或者阻塞在那里,需要的朋友可以參考下
    2024-01-01
  • java如何判斷一個數(shù)是否是素數(shù)(質數(shù))

    java如何判斷一個數(shù)是否是素數(shù)(質數(shù))

    這篇文章主要介紹了java如何判斷一個數(shù)是否是素數(shù)(質數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java HashSet集合存儲遍歷學生對象代碼實例

    Java HashSet集合存儲遍歷學生對象代碼實例

    這篇文章主要介紹了Java HashSet集合存儲遍歷學生對象代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java實現(xiàn)學生信息管理系統(tǒng)(借助Array?List)

    Java實現(xiàn)學生信息管理系統(tǒng)(借助Array?List)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生信息管理系統(tǒng),借助Array?List,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring Boot項目實戰(zhàn)之攔截器與過濾器

    Spring Boot項目實戰(zhàn)之攔截器與過濾器

    這篇文章主要介紹了Spring Boot項目實戰(zhàn)之攔截器與過濾器,文中給大家詳細介紹了springboot 攔截器和過濾器的基本概念,過濾器的配置,需要的朋友可以參考下
    2018-01-01
  • SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)

    SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)

    這篇文章主要介紹了SpringBoot項目的logback日志配置(包括打印mybatis的sql語句),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java使用Collections.sort()排序的示例詳解

    Java使用Collections.sort()排序的示例詳解

    這篇文章主要介紹了Java使用Collections.sort()排序的示例詳解,Collections.sort(list, new PriceComparator());的第二個參數(shù)返回一個int型的值,就相當于一個標志,告訴sort方法按什么順序來對list進行排序。對此感興趣的可以了解一下
    2020-07-07
  • 淺談JVM垃圾回收有哪些常用算法

    淺談JVM垃圾回收有哪些常用算法

    今天給大家?guī)淼氖顷P于Java虛擬機的相關知識,文章圍繞著JVM垃圾回收有哪些常用算法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論