2012-02-08 95 views
0

我有一個正在閱讀的文本文件。它有我想刪除的塊。有沒有我能說的方法如果讀者遇到一個String「Account of Account」,它將跳過讀取該Statement之前的10行。這是我正在使用的代碼,它從Text文件中讀取所有內容。在java中讀取時跳過文本文件的某些部分

for(int i = 0; i < filenames.length; i++){ 
    FileInputStream fstemp = new FileInputStream("C:/Temporary/" + filenames[i]); 
    FileOutputStream fos = new FileOutputStream("C:/Statements/" + filenames[i]); 
    DataInputStream in1 = new DataInputStream(fstemp); 
    UniqueLineReader brtemp = new UniqueLineReader(new InputStreamReader(in1)); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos)); 
    String strLine; 
    while((strLine = brtemp.readLine()) != null){ 
    bw.write(strLine); 
    bw.newLine(); 
    bw.flush(); 

    } 


    } 
+0

如果通過文件讀取,怎麼了跳過_before_它正在讀取的內容是否按順序讀取? – cdeszaq 2012-02-08 14:19:19

+0

我假設你的意思是「之後」而不是「之前」的關鍵字。爲什麼不保存這10行的數據呢? – Max 2012-02-08 14:19:27

+0

如果有人回答您的問題,請接受答案。 – 2012-02-15 15:30:26

回答

1

您可以通過緩衝在隊列前面的10行做到這一點:

Queue<String> queue = new LinkedList<String>(); 
String strLine; 
while ((strLine = brtemp.readLine()) != null { 
    queue.add(strLine); 
    if (strLine.equals("STATEMENT OF ACCOUNT")) { 
     queue.clear(); 
     continue; 
    } 

    while (queue.size() >= 10) { 
     bw.write(queue.remove()); 
     bw.newLine(); 
    } 
} 
while (!queue.isEmpty()) { 
    bw.write(queue.remove()); 
    bw.newLine(); 
} 
bw.flush(); 
4

我假設你真的想跳過10行線後的「賬戶聲明」。在這種情況下,你想是這樣的:

int linesToSkip = 0; 
String strLine; 
while((strLine = brtemp.readLine()) != null) { 
    if (linesToSkip > 0) { 
    linesToSkip--; 
    continue; 
    } 
    if (strLine.equals("STATEMENT OF ACCOUNT")) { 
    linesToSkip = 10; 
    continue; 
    } 
    bw.write(strLine); 
    bw.newLine(); 
    bw.flush(); 
} 

如果你真的想以某種方式抹殺以前十行,那麼你就需要延遲輸出(例如,保存它在一個週期性緩衝)到十後面幾行,以防萬一您在幾行時間內看到「帳戶報表」。

+0

是不是會跳過「STATUM OF ACCOUNT」之後的10行文本,而不是之前的10行文本? – 2012-02-08 14:23:45

+0

你犯了同樣的錯誤,他想跳過*以前*讀取10行,而不是10行。 – Timeout 2012-02-08 14:24:32

+0

@SeanReilly:是的 - 請參閱代碼前後的文字。我強烈懷疑這實際上是OP的要求,但他表達得很糟糕。 – 2012-02-08 14:25:02

1

這聽起來像你需要保持10行的緩衝區,以便當你遇到你的特殊線路時,你可以放棄內容。在你看到它之前,你將每行添加到一端,並且只在緩衝區滿時從另一端輸出。對於這種情況,this question的回答建議使用QueueCircularFifoBuffer

下面是一個使用CircularFifoBuffer一個未經測試的代碼示例:

for (int i = 0; i < filenames.length; i++) { 
    FileInputStream fstemp = new FileInputStream("C:/Temporary/" + filenames[i]); 
    FileOutputStream fos = new FileOutputStream("C:/Statements/" + filenames[i]); 
    DataInputStream in1 = new DataInputStream(fstemp); 
    UniqueLineReader brtemp = new UniqueLineReader(new InputStreamReader(in1)); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos)); 
    Buffer ringbuf = new CircularFifoBuffer(10); 
    String strLine; 
    while ((strLine = brtemp.readLine()) != null) { 
     if (strLine.equals("STATEMENT OF ACCOUNT")) { 
      ringbuf.clear(); 
     } 

     ringbuf.add(strLine); 

     if (ringbuf.isFull()) { 
      bw.write(ringbuf.remove()); 
      bw.newLine(); 
      bw.flush(); 
     } 
    } 

    for (Object item : ringbuf) { 
     bw.write(item); 
     bw.newLine(); 
     bw.flush(); 
    } 
} 
相關問題