最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

先貼結(jié)論:

耗時對比為:

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

另外,BufferedFileReader如果涉及到讀取文件的每一行內(nèi)容還可以在優(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,然后轉(zhuǎn)成一個String返回,這里涉及到兩次字符拷貝。假設讀取10000行,會有10000個臨時的String對象生成,內(nèi)存比較耗費,由于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介紹

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

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

相關(guān)文章

  • Java獲取泛型實際類型的方法詳解

    Java獲取泛型實際類型的方法詳解

    這篇文章主要介紹了Java獲取泛型實際類型的方法詳解,泛型,即“參數(shù)化類型”,一提到參數(shù),最熟悉的就是定義方法時有形參列表,普通方法的形參列表中,每個形參的數(shù)據(jù)類型是確定的,而變量是一個參數(shù),需要的朋友可以參考下
    2023-11-11
  • java編寫的文件管理器代碼分享

    java編寫的文件管理器代碼分享

    本文給大家分享的是一則使用java編寫的文件管理器的代碼,新人練手的作品,邏輯上還是有點小問題,大家?guī)兔纯窗伞?/div> 2015-04-04
  • java求100以內(nèi)的素數(shù)示例分享

    java求100以內(nèi)的素數(shù)示例分享

    素數(shù)是指因數(shù)只有1和本身的數(shù)字,這篇文章主要介紹了java求100以內(nèi)的素數(shù)示例,需要的朋友可以參考下
    2014-03-03
  • 新手初學Java繼承、封裝與多態(tài)

    新手初學Java繼承、封裝與多態(tài)

    封裝、繼承、多態(tài)三大特征是java中比較常用的,務必要掌握,下面給大家介紹Java封裝、繼承、多態(tài)三大特征的理解,有不清楚的朋友可以一起學習下
    2021-07-07
  • 小議Java的源文件的聲明規(guī)則以及編程風格

    小議Java的源文件的聲明規(guī)則以及編程風格

    這篇文章主要介紹了小議Java的源文件的聲明規(guī)則以及編程風格,僅給Java初學者作一個簡單的示范,需要的朋友可以參考下
    2015-09-09
  • idea啟動報錯:Command line is too long問題

    idea啟動報錯:Command line is too long問題

    在使用IDEA時,若遇到"Commandlineistoolong"錯誤,通常是因為命令行長度超限,這是因為IDEA通過命令行或文件將classpath傳遞至JVM,操作系統(tǒng)對命令行長度有限制,解決方法是切換至動態(tài)類路徑,通過修改項目的workspace.xml文件
    2024-09-09
  • 基于Java中字符串indexof() 的使用方法

    基于Java中字符串indexof() 的使用方法

    今天小編就為大家分享一篇基于Java中字符串indexof() 的使用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例

    java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例

    今天小編就為大家分享一篇java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java使用Redis的方法實例分析

    Java使用Redis的方法實例分析

    這篇文章主要介紹了Java使用Redis的方法,接合實例形式分析了相關(guān)redis驅(qū)動包安裝、java連接redis服務器、數(shù)據(jù)存儲、讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Java中數(shù)據(jù)庫加密的方式分享

    Java中數(shù)據(jù)庫加密的方式分享

    在現(xiàn)今互聯(lián)網(wǎng)時代,數(shù)據(jù)安全已經(jīng)成為了我們必須要面對的重要課題,在本文中,我們將會介紹Java中常用的幾種數(shù)據(jù)庫加密方式并分析一下它們的優(yōu)缺點,希望對大家有所幫助
    2023-05-05

最新評論

犍为县| 张家港市| 嵊州市| 麦盖提县| 汽车| 扬中市| 海淀区| 黎城县| 儋州市| 广西| 丰顺县| 东乡族自治县| 莫力| 开鲁县| 恩施市| 小金县| 苏尼特右旗| 原平市| 敦化市| 略阳县| 大姚县| 台湾省| 南通市| 河北区| 芜湖县| 宝清县| 临桂县| 霞浦县| 颍上县| 乌什县| 惠安县| 宝坻区| 昭平县| 嵩明县| 慈溪市| 柞水县| 公主岭市| 大安市| 噶尔县| 青阳县| 柳州市|