4

我正在编写一个类,它将在更新时从日志文件中读取行。

我正在使用 Apache VFS2 来获取更新文件时调用的方法。我的主要问题是,如果该行尚未完成,我不想从文件中读取该行,因为它的末尾确实有一个“\n”或“\r”行分隔符类型字符。我想我已经查看了所有可以读取行的 Java 库,但它们都丢弃了 EOF 和行终止信息,所以我认为我不能使用它们。

相反,我正在查看逐字节读取它,然后检查结果以丢弃最后一行分隔符之后的所有内容。我想知道你们对执行此操作的最佳方法有何看法。

例如:

2013-Jul-01_14:07:17.875 - Connection to Message Bus is reestablished<LF>
2013-Jul-01_14:07:17.875 - Connection to Message Bus is reestablished<LF>
2013-Jul-01_14:15:08.205 - No connection to Message Bus - reestablish before we can publish<LF>
2013-Jul-01_14:15:08.205 - NOT A REAL LINE PLEASE DONT READ

我想阅读前 3 个而不是第四个,因为它没有换行符或回车符 ()。

我看过 Apache commons-io Tailer 的东西,但我不知道这是否会给我“不完整”的行(我意识到我必须放弃 VFS2 的东西才能使用它)。

所以伪代码:

private void ingestFileObject(FileObject file) {
  BufferedInputStream bs = new BufferedInputStream(file.getContent().getInputStream());

  StringBuilder result = new StringBuilder();

  while (bs.available() > 0) {
     result.append((char) bs.read());
  }
  bs.close();

  String resultString = result.toString();
  //determine what part of resultString is after last carriage return/line seperate (using regex [\\r\\n]+?
  //remove the offending part of String.
  }

或者在这一点上也欢迎任何其他完全忽略我的伪代码的解决方案......

谢谢

4

2 回答 2

1

使用对你有Scanner帮助吗?

        Scanner scanner = new Scanner(file);

        //block till there is some thing with a new line
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            //do processing.
        }
于 2013-07-16T04:44:12.867 回答
1

这就是我最终做的事情:

 BufferedReader bufReader = new BufferedReader(new InputStreamReader(file.getContent().getInputStream()));
 StringBuilder result = new StringBuilder();
 int readInInt = -1;
 String charsSinceLastLineSep = "";

 if (bufReader.ready()) {
     while (-1 != (readInInt = bufReader.read())) {
        char readInChar = (char) readInInt;

        // if new line reset line buffer, otherwise add to buffer
        if (readInChar == '\n' || readInChar == '\r') {
           charsSinceLastLineSep = "";
        } else {
           charsSinceLastLineSep += readInChar;
        }

        result.append(readInChar);
     }
     bufReader.close();

     // remove all characters added since last Carriage Return or NewLine was found indicating
     // that line was not a complete log line
     String resultString = (result.subSequence(0, (result.length() - charsSinceLastLineSep.length())).toString());
于 2013-07-16T20:40:10.270 回答