在java中读取时跳过文本文件的某些部分

时间:2012-02-08 14:14:23

标签: java

我正在阅读一个文本文件。它有我想删除的块。有没有办法可以说如果读者遇到字符串“账户声明”,它会跳过在该声明之前读取的10行。这是我目前使用的代码,它从文本文件中读取所有内容。

  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();

   }


    }

3 个答案:

答案 0 :(得分: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();
}

如果你真的想要以某种方式消除之前的十行,那么你需要延迟输出(例如将其保存在循环缓冲区中)直到十行以后,以防你看到“账目报表“在几行之内。”

答案 1 :(得分: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();
    }
}

答案 2 :(得分: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();