1. 程式人生 > >java的io,nio和commons的io比較總結

java的io,nio和commons的io比較總結

今天有個任務,有個120M左右,內含600多W條記錄,記錄之間按行分隔的檔案,

分割成20W條記錄每個檔案,以便在其他程式中匯入。

由於自己手殘,機器上裝了WIndows,配置還太差沒法布hadoop,因此只能本機實現了。

使用java自身的IO和commons的IO實現了兩套方法比較一下。

等回家之後,看看用hadoop的api能不能編起來簡單一點

  1. import java.io.*;  
  2. import java.util.*;  
  3. import org.apache.commons.io.*;  
  4. /** 
  5.  * 任務:將一個儲存了大約600W行左右記錄(120M)的檔案按照20W行分割為若干個檔案
     
  6.  * @author RangE 
  7.  * 
  8.  */
  9. publicclass BasicFileSplitter {  
  10.     private BasicFileSplitter() {}  
  11.     /** 
  12.      * 最基本的檔案分割方法,使用BufferedReader和BufferedWriter 
  13.      * about 2700000ms cost on the task on Wed 13 Nov 2013 
  14.      *  
  15.      * 這個方法是最基本的IO,其效能瓶頸主要在於檔案寫入。 
  16.      * 寫入檔案使用的BufferedWriter使用字元流寫入,但此處的實現是寫一行就flush一次輸出流,拖慢了寫入速度
     
  17.      *  
  18.      * @param inputPath 
  19.      * @param outputPath 
  20.      * @throws IOException 
  21.      */
  22.     publicstaticvoid splitFile(String inputPath, String outputPath) throws IOException {  
  23.         BufferedReader reader = null;  
  24.         BufferedWriter writer = null;  
  25.         try {  
  26.             reader = new
     BufferedReader(new InputStreamReader(new FileInputStream(new File(inputPath)), "UTF-8"));  
  27.             String temp = "";  
  28.             int countFiles = 0;  
  29.             int countLines = 0;  
  30.             System.out.println("Starting spliting files...");  
  31.                 while ((temp = reader.readLine()) != null) {  
  32.                     //System.out.println(temp);
  33.                     writer = new BufferedWriter  
  34.                             (new OutputStreamWriter  
  35.                                     (new FileOutputStream(outputPath + countFiles + ".data"true), "UTF-8"));  
  36.                     writer.write(temp + "\n");  
  37.                     writer.flush();  
  38.                     countLines++;  
  39.                     if (countLines == 200000) {  
  40.                         System.out.println("Spliting file into parts: " + countFiles);  
  41.                         countFiles++;  
  42.                         countLines = 0;  
  43.                     }  
  44.                 }  
  45.         } finally {  
  46.             if (reader != null)  
  47.                 reader.close();  
  48.             if (writer != null)  
  49.                 writer.close();  
  50.             System.out.println("Spliting finished successfully.");  
  51.         }  
  52.     }  
  53.     /** 
  54.      * 使用java.nio優化讀寫的分割 
  55.      * @param input 
  56.      * @param path 
  57.      */
  58.     publicstaticvoid splitFileByNewerIO(File input, String path) {  
  59.         //上網上查了一下:
  60.         //要是需要一行一行處理的話還是用BufferedReader的readLine吧...
  61.         //我試了試,用ByteBuffer的話,光處理分行問題就費不少時間.
  62.         //原帖地址:http://bbs.csdn.net/topics/120096457
  63.         //因此不予實現
  64.     }  
  65.     /** 
  66.      * 用org.apache.commons.io完成的檔案分割 
  67.      * 17975ms cost on the task on Wed 13 Nov 2013 
  68.      *  
  69.      * Iterator讀檔案也是使用BufferedReader讀取, 
  70.      * 可知主要的效能提升在於FileUtils的寫(writeLines)方法,最終呼叫了IOUtils的writeLines使用BufferedOutputStream位元組流寫入 
  71.      *  
  72.      * 注:用此方法分割後,分割檔案總大小略大於被分割檔案大小 
  73.      *  
  74.      * @param inputPath 
  75.      * @param outputPath 
  76.      * @throws IOException 
  77.      */
  78.     publicstaticvoid splitFileByCommonsIO(String inputPath, String outputPath)   
  79.             throws IOException {  
  80.         LineIterator it = null;  
  81.         try {  
  82.             it = FileUtils.lineIterator(new File(inputPath), "UTF-8");  
  83.             int lineCounter = 0;  
  84.             int fileCounter = 0;  
  85.             List lineList = new ArrayList();  
  86.             System.out.println("Starting..");  
  87.             while (it.hasNext()) {  
  88.                 lineList.add(it.nextLine());  
  89.                 lineCounter++;  
  90.                 if (lineCounter == 200000) {  
  91.                     FileUtils.writeLines(new File(outputPath + "_" + fileCounter), "UTF-8", lineList, true);  
  92.                     lineList.clear();  
  93.                     lineCounter = 0;  
  94.                     fileCounter++;  
  95.                     System.out.println("Complete file " + fileCounter);  
  96.                 }  
  97.             }  
  98.             if (lineList != null && lineList.size() > 0) {  
  99.                 FileUtils.writeLines(new File(outputPath + "_" + fileCounter + 1), "UTF-8", lineList, true);  
  100.                 System.out.println("Complete the last file.");  
  101.             }  
  102.         } finally {  
  103.             if (it != null

    相關推薦

    java的ioniocommons的io比較總結

    今天有個任務,有個120M左右,內含600多W條記錄,記錄之間按行分隔的檔案, 分割成20W條記錄每個檔案,以便在其他程式中匯入。 由於自己手殘,機器上裝了WIndows,配置還太差沒法布hadoop,因此只能本機實現了。 使用java自身的IO和c

    轉BIONIOAIO講的很明白的文章

    到底什麼是“IO Block” 很多人說BIO不好,會“block”,但到底什麼是IO的Block呢?考慮下面兩種情況: 用系統呼叫read從socket裡讀取一段資料 用系統呼叫read從一個磁碟檔案讀取一段資料到記憶體 如果你的直覺告訴你,這兩種都算“Block”,

    結合程式碼詳細聊聊BIONIOAIO

    作者:大寬寬 1、到底什麼是“IO Block” 很多人說BIO不好,會“block”,但到底什麼是IO的Block呢?考慮下面兩種情況: 用系統呼叫read從socket裡讀取一段資料 用系統呼叫read從一個磁碟檔案讀取一段資料到記憶體 如果你的直覺告

    java集合類ListSet比較各自的子類比較(ArrayListVectorLinkedList;HashSetTreeSet)Map集合比較

    ArrayList,LinkedList,Vector都屬於ListList:元素是有順序的,元素可以重複因為每個元素有自己的角標(索引)|-- ArrayList:底層是陣列結構,特點是:查詢很快,增刪稍微慢點,執行緒不同步:A執行緒將元素放在索引0位置,CPU排程執行緒A停止,B執行,也將元素放在索引0位

    Java中BIONIOAIO使用樣例

    上文中分析了阻塞,非阻塞,同步和非同步概念上的區別以及各種IO模型的操作流程,本篇文章將主要介紹Java中BIO,NIO和AIO三種IO模型如何使用。需要注意的是,本文中所提到的所有樣例都是在一個server對應一個client的情況下工作的,如果你想擴充套件為一個se

    MyBatis的初始化別名事務外掛快取執行原理總結

    MyBatis的初始化的過程其實就是解析配置檔案和初始化Configuration的過程。 1.MyBatis的通用執行流程 參照GOF提出的23種設計模式,可以看出MyBatis的執行流程算是種通用的模板模式,其實現過程也簡單: 首先通過相關的資原始檔配置的載入得到對應的

    Java檔案讀寫IO/NIO及效能比較總結

    幹Java這麼久,一直在做WEB相關的專案,一些基礎類差不多都已經忘記。經常想得撿起,但總是因為一些原因,不能如願。 其實不是沒有時間,只是有些時候疲於總結,今得空,下定決心將丟掉的都給撿起來。 檔案讀寫是一個在專案中經常遇到的工作,有些時候是因為維護,有些時候是新功能開發

    Java NIO與IO的區別比較NIO與IO執行緒池效能比較

         傳統的socket IO中,需要為每個連線建立一個執行緒,當併發的連線數量非常巨大時,執行緒所佔用的棧記憶體和CPU執行緒切換的開銷將非常巨大。使用NIO,不再需要為每個執行緒建立單獨的執行緒,可以用一個含有限數量執行緒的執行緒池,甚至一個執行緒來為任意數量的連線服務。由於執行緒數量小於連線數量,所

    2015年終總結忙碌無所事事的一年

    adding style article 技術 書籍 radi 失望 con 繼續 轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/49805231猶豫了非常久。今年的年終總結究竟要不要寫。我是非常想把

    Social Network Analysis的Centrality總結以及networkx實現EigenCentralityPageRankKatzCentrality的對比

    節點 int nod pos rect arc 分享 http import 本文主要總結近期學習的Social Network Analysis(SNA)中的各種Centrality度量,我暫且翻譯為中心度。本文主要是實戰,理論方面幾乎沒有,因為對於龐大的SNA,我可能連

    python 捕捉錯誤exceptiontracebacksys.exc_info()比較

    提示 for try 包括 traceback code hello form 打印 import traceback,sys import requests try : requests.get(‘dsdsd‘) ##故意讓他出錯 except Except

    大多數情況開發人員都比較煩UI交互

    比較 .com 開發 人員 開發人員 .html http htm fin 大多數情況,開發人員都比較煩UI和交互,如 http://zz.letfind.com/zu/523492.htmlhttp://zz.letfind.com/zu/523495.htmlhttp:

    總結for循環及for循環增強遍歷數組listsetmap

    循環 string 沒有 htable str arr val aaa entry 一.對於集合 (1)普通for循環 int[] arr = { 2, 1, 2 }; for(int i=0;i<arr.length;i++){

    虛擬混合SD-WAN如何比較對比

    寬帶連接 物理 硬件 均衡 策略 設備 網絡工程 技術 架構 不同的WAN技術軟件定義網絡(SDN)在重塑廣域網(WAN)方面發揮了重要作用。因此,其他WAN技術(如虛擬WAN和混合WAN)經常被錯誤地與SD-WAN混為一談。雖然虛擬和混合WAN技術與SD-WAN具有相似的

    關於RigidbodyColliderCharacterController三者之間的關系用法的總結

    詭異 nor 觸發 回調函數 force body 想要 die 實現 Rigidbody:多用在“物體”上,因為“物體”都是“死”的,他們的運動一般都是靠物理系統。所以對於Rigidbody的移動,不要用Translate(),要用各種“力”, 比如:Rigidbody的

    版本更新相關CFBundleVersionCFBundleShortVersionString的比較獲取版本號

    移動客戶端進行版本迭代時,需要進行本地版本號和伺服器版本號比較,從而實現更新提示。本文祥講怎樣獲取版本號,具體的比較方法。 一、CFBundleShortVersionString和CFBundleVersion     &nb

    26 Java學習之NIOIO得比較

    轉自:https://www.cnblogs.com/aspirant/p/8630283.html    一、概念      NIO即New IO(非阻塞IO),這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,

    原生Js實現複製功能的方法總結execCommandclipboardData的使用

    原生Js實現複製(Copy)的兩種方法,一種是利用 clipboardData,另外一種則是用 execCommand(),今天將統一講解一下關於他們的使用方法。   document.execCommand 當一個HTML文件切換到設計模式(designMode)時,文件物件

    貪心演算法遞迴演算法動態規劃演算法比較總結

    一般實際生活中我們遇到的演算法分為四類: 一>判定性問題 二>最優化問題 三>構造性問題 四>計算性問題 而今天所要總結的演算法就是著重解決 最優化問題 《演算法之道》對三種演算法進行了歸納總結,如下表所示: 分

    互斥同步程序間通訊總結

    互斥######################### 中斷遮蔽***********************************   原子變數和原子位操作***********************************   自旋鎖*******