2014-02-22 62 views
1

以下是我的代碼來閱讀和拆分文本文件的內容。如何將大尺寸的.txt文件數據拆分成小部分並插入到數據庫中?

try { 

     br = new BufferedReader(new FileReader("F:\\Test.txt")); 
     final char[] cbuf = new char[2048]; 
     final int length = br.read(cbuf); 

     cbuf[length] = '@'; 
     String packet = new String(cbuf, 0, length + 1); 
     final String[] splitedPacket=packet.split("@"); 
     for(int i=0;i<splitedPacket.length;i++) 
     { 
      if(splitedPacket[i].contains("POS")) 
      { 
       System.out.println(splitedPacket[i]+"@"); 
       preparedstatement=connection.prepareStatement("insert into inserttextfile([file]) values(?)"); 
       preparedstatement.setString(1, splitedPacket[i]+"@"); 
       preparedstatement.executeUpdate(); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (br != null)br.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

這是工作的罰款在我的小尺寸.txt文件,但如果我使用超過30 MB的文本文件,我得到數組索引出界異常。

那麼如何拆分和讀取這種.txt文件並插入數據庫? (特別期待拆分大尺寸文件(例如,從30 MB到5 MB)並插入到數據庫中) 請指導我解決此問題。

+0

1.you不讀取整個文件讀取文件http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#read()。不要嘗試一次讀取所有文件內容。讀入循環並插入到數據庫中。使用掃描儀根據分隔符進行閱讀。 – Mani

+0

記事本文件?你的意思是文本文件? – m0skit0

+0

@ m0skit0是.txt文件。 – Rameshbabu

回答

2

你不使用的readLine

try { 
     FileInputStream fis = new FileInputStream("F:\\Test.txt"); 
     reader = new BufferedReader(new InputStreamReader(fis));   
     String line = reader.readLine(); 
     while(line != null){ 

      //process your line here, it's just a String... 

      line = reader.readLine(); 
     }   

    } catch (FileNotFoundException ex) { 
     ... 
    } catch (IOException ex) { 
+0

它工作的很好。使用這個我們可以讀到多少尺寸。 – Rameshbabu

+0

你可以閱讀很多東西,至少在你的jvm設置下可能是100兆字節。如果內存不足,請查看如何增加JVM內存大小。 – jeremyjjbrown

+0

ohh ..謝謝你的建議。 – Rameshbabu

2
try (Scanner read = new Scanner(new File("/tmp/datafile.txt"));) { 
     read.useDelimiter("@"); 
     while (read.hasNext()) { 
      String splitedPacket = read.next(); 
      System.out.println(splitedPacket); 
      // Perform DB Operation 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
  1. 做硬盤的方式不要讀取整個文件。
  2. 使用掃描儀在任何給定時間只讀取和保持一次讀取 - 以避免OOM
  3. 如果可能以批量執行Db操作。 如果您正在一個事務中運行,請讀取1000條記錄並作爲單獨的批量插入進行處理。
+0

感謝您的解決方案。我發現這也工作.. – Rameshbabu

+0

不幸的是我沒有一個選項爲您的ansewer投票... – Rameshbabu

+0

不是問題。我很高興你的問題得到解決。請始終閱讀規格。它有很多信息。 – Mani

相關問題