【问题标题】:Skipping certain parts of a textfile while reading in java在 java 中读取时跳过文本文件的某些部分
【发布时间】:2012-02-08 22:33:50
【问题描述】:

我有一个正在阅读的文本文件。它有我想要删除的块。有没有办法我可以说如果读者遇到一个字符串“帐户声明”,它会跳过阅读该语句之前的 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();

   }


    }

【问题讨论】:

  • 如果正在读取一个文件,如果它是顺序读取,它如何跳过之前它刚刚读取的行?
  • 我假设您的意思是“之后”而不是“之前”您的关键字。为什么不直接保存这 10 行的数据?
  • 如果有人回答了您的问题,请采纳。

标签: java


【解决方案1】:

我假设您实际上想跳过“帐户声明”行之后的 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();
}

如果您真的想以某种方式消除 前 10 行,那么您需要延迟输出(例如,将其保存在循环缓冲区中)直到 10 行之后,以防万一您看到“帐单”在几行的时间内。

【讨论】:

  • 那不是跳过“账户声明”后面的 10 行文字,而不是前面的 10 行文字吗?
  • 你犯了和我一样的错误,他想跳过 previous 阅读的 10 行,而不是后面的 10 行。
  • @SeanReilly:是的 - 查看代码前后的文字。我强烈怀疑这实际上是 OP 想要的,但他表达得很糟糕。
  • @b1naryj:我已经明确表示我相信 OP 实际上想要跳过触发线之后的 10 行 - 并给出了一个建议的计划,如果他真的想跳过之前的 10 行触发线。
  • @jon:是的,当我第一次看到你的答案时,我错过了。对不起。
【解决方案2】:

您可以通过缓冲队列中的前 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();

【讨论】:

    【解决方案3】:

    听起来你需要维护一个10行的缓冲区,这样当你遇到你的特殊行时,你可以放弃内容。在您看到它之前,您将每一行添加到一端,并且仅在缓冲区已满时从另一端输出。对于这种情况,this question 的答案推荐Queue 或CircularFifoBuffer。

    这是一个使用 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2019-04-29
      相关资源
      最近更新 更多