2012-07-05 24 views
0

我有一個問題搞清楚如何將一個字符串拆分爲多個文件。目前我應該使用JSON數據獲取兩個文件。下面的代碼寫入第一個文件,但第二個文件留空。任何想法爲什麼?java拆分字符串[]數組到多個文件

public void splitFile(List<String> results) throws IOException { 

    int name = 0; 
    for (int i=0; i<results.size(); i ++) { 

    write = new FileWriter("/home/tom/files/"+ name +".json"); 
    out = new BufferedWriter(write); 
    out.write(results.get(i)); 

    if (results.get(i).startsWith("}")) { 
     name++; 
    }  
    } 
} 

編輯:它分裂在符合{開始,因爲這表示JSON文檔的末尾。

+0

你在哪裏關閉文件與'close()方法' ?如果您一次寫入所有內容,則不需要BufferedWriter。在循環內部寫入一個局部變量。 – 2012-07-05 10:44:29

+0

代碼被破壞,因爲它試圖在迭代中重新打開相同的文件。另外,完成後關閉流。將'write'移出循環並在'if'語句中關閉當前並打開下一個文件。 – 2012-07-05 10:44:33

回答

1

增強切控制

獲得togher這樣的:

write = new FileWriter("/home/tom/files/"+ name +".json"); 
out = new BufferedWriter(write); 

這:

name++; 

檢查開始,而不是結束

檢查從{開始的行,並執行這三行來打開文件。

記住關閉和沖洗

如果不是第一行(i > 0),然後關閉最後一個作家(write.close();)。

關閉最後打開的作家

if (!results.isEmpty()) 
    out.close(); 

結果

它應該是這個樣子:

public void splitFile(List<String> results) throws IOException { 

    int name = 0; 

    BufferedWriter out = null; 
    for (int i=0; i<results.size(); i ++) { 
    String line = results.get(i); 
    if (line.startsWith("{")) { 
     if (out != null) // it's not the first 
      out.close(); // tell buffered it's going to close, it makes it flush 
     FileWriter writer = new FileWriter("/home/tom/files/"+ name +".json"); 
     out = new BufferedWriter(writer); 
     name++; 
    } 
    if (out == null) 
     throw new IllegalArgumentException("first line doesn't start with {"); 
    out.write(line); 
    } 

    if (out != null) // there was at least one file 
    out.close(); 
} 
+0

如果您在第一次迭代中獲得{這將會失敗。沒有嘗試過,但我敢打賭它甚至沒有編譯(「'out'可能沒有被初始化」)。 – 2012-07-05 11:08:18

+0

這與我正在使用的測試文件完美配合。寫出並在類中聲明「私有靜態」,以便它們被初始化。謝謝=) – 2012-07-05 11:09:54

+0

我想你想說「如果你沒有{在第一次迭代中」會失敗。當然。我不確定編譯錯誤。我寫在這裏,沒有嘗試過。但這只是所有建議的外觀。我會糾正沒有被初始化。 – helios 2012-07-05 11:11:14

1

我會在每次完成寫入序列後關閉緩衝寫入器。即在將write分配給新的FileWriter()之前,在循環的每次迭代之後。

關閉BufferedWriter將關閉底層FileWriter,和因此迫使上寫入磁盤數據刷新。

注意:如果每個循環使用不同的FileWriter,那麼我會將該變量作用於該內部循環,例如,

FileWriter write = new FileWriter("/home/tom/files/"+ name +".json"); 

BufferedWriter也是如此。其實你可以這樣寫:

BufferedWriter outer = new BufferedWriter(new FileWriter(... 

剛處理outer

+0

問題是Schmooo想要將幾行(幾次循環迭代)寫入同一個文件。這就是爲什麼在循環結尾查找最外層的JSON對象關閉。 – helios 2012-07-05 11:00:48

+0

我不得不說這不是最明確表達的問題 – 2012-07-05 12:51:14

0

試試下面的代碼..

public void splitFile(List<String> results) throws IOException { 

    int name = 0; 
    for (int i = 0; i < results.size(); i++) { 

     write = new FileWriter("/home/tom/files/" + name + ".json"); 
     out = new BufferedWriter(write); 
     out.write(results.get(i)); 
     out.flush(); 
     out.close(); // you have to close your stream every time in your case. 

     if (results.get(i).startsWith("}")) { 
      name++; 
     } 
    } 
} 
+0

這將踐踏在先前迭代中創建的文件的內容。 – 2012-07-05 10:51:09

+0

我認爲結果是線條和一些線條放在同一個文件中(這就是爲什麼只有當找到'}'時名稱纔會增加)。 – helios 2012-07-05 10:53:02

+0

這不會踐踏內容,無論如何解決這個問題?使用StringBuilder然後將其內容寫入文件會更好嗎? – 2012-07-05 11:05:15