2011-12-13 51 views
4

什麼是最有效的方式(就時間而言)將文本文件讀入數組列表。文件大小爲100 MB至2 GB。該文件包含以下格式的數據:使用java快速高效地讀取tab分隔文件

From  TO   time  

a   b  13 decc 2009 
b   c  13 decc 2009 
c   d  13 decc 2009 
f   h  13 decc 2009 
f   g  13 decc 2009 

編輯: 以下是代碼讀取文件

public List<InputDataBean> readInputData() throws Exception{ 
     List<InputDataBean> dataSet = new ArrayList<InputDataBean>(); 
     FileInputStream fstream = null; 
     BufferedReader br = null; 
     try{ 
      fstream = new FileInputStream(filePath); 
      br = new BufferedReader(new InputStreamReader(fstream)); 
      String strLine; 
      Set<String> users = new TreeSet<String>(); 
      while ((strLine = br.readLine()) != null) { 
       InputDataBean data = validateRecord(strLine); 
       if(data==null) 
        continue; 
       dataSet.add(data); 
       users.add(data.getFromName()); 
       users.add(data.getToName()); 
      } 
      UserKeys.setUsers(users); 

     }catch (Exception e){ 
      throw e; 
     }finally{ 
      try { 
       if(null!=br) 
        br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return dataSet; 
    } 

讀取文件我想存入數組不是數據庫之後。

如果有其他更好的替代方法來讀取文件?從java程序調用腳本並使用腳本讀取數據並將其存儲到java數組中是否好主意?

P.S .:我真的很感激,如果有人可以編輯或改進標籤。

+0

不要忘記嘗試使用像ensureCapacity() – Mikhail

+0

你在做什麼與數據?如果它轉到數據庫,則應該使用數據庫提供的工具(大多數數據庫都可以)。將大約2 GB的數據存儲到堆中(當您讀取文件時)可能並不是一個好主意......通常,如果您必須在java中執行此操作,緩衝讀取器才能正常工作。 – aishwarya

+0

@aishwarya:我已經添加了我的文件閱讀程序。讀取數據後,我想存儲到數組中並對此數據執行一些操作。我們沒有將數據存儲到數據庫中。 – Raje

回答

3

圍繞FileInputStream可能包裝BufferedInputStream將進一步提高性能(因爲讀取將以4 KB的倍數進行緩衝)。你也可以用緩衝區大小來玩一下。

如果你知道它只是ASCII,你可以避免使用Reader,並可能避免爲每一行創建String

如果您有時間,我會比較您的解決方案與現有的CSV閱讀器工具的性能,如CSV tool from the H2 database(披露內容:我寫的)。