【问题标题】:How do I strip empty lines from an InputStream?如何从 InputStream 中删除空行?
【发布时间】:2016-01-20 07:59:56
【问题描述】:

从 java 中的 InputStream 中去除空行的最佳方法是什么?

【问题讨论】:

  • 如果你对行感兴趣,你也可以在 Java 8 中使用 new BufferedReader(new InputStreamReader(is)).lines().filter(line -> !line.isEmpty()) 之类的东西(如果需要,请尝试使用资源)。这会生成输入流中非空行的Stream<String>

标签: java filtering inputstream


【解决方案1】:

可以使用自定义的 FilterReader,最好也可以处理不同的行尾(\n\r\r\n)。

用法:

StripEmptyLinesReader reader = new StripEmptyLinesReader(new InputStreamReader(origStream));
ReaderInputStream newStream = new ReaderInputStream(reader, someCharset);

课程如下:

public class StripEmptyLinesReader extends FilterReader {

  private char[] prevChars = new char[3];

  public StripEmptyLinesReader(Reader reader) {
    super(reader);
  }

  @Override
  public int read(char[] buffer, int fromIndex, int length) throws IOException {
    int numChars = 0;
    while (numChars == 0) {
        numChars = in.read(buffer, fromIndex, length);
        if (numChars == -1) {
            return -1;
        }
        int lastIndex = fromIndex;
        for (int i = fromIndex; i < fromIndex + numChars; i++) {
            int charsToSkip = numberOfNewlineCharactersToSkip(buffer[i]);
            switch (charsToSkip) {
                case 0:
                    buffer[lastIndex++] = buffer[i];
                    break;
                case 2:
                    lastIndex--;
                    break;
            }
            prevChars[0] = buffer[i];
            prevChars[1] = (i > 0) ? buffer[i - 1] : '\0';
            prevChars[2] = (i > 1) ? buffer[i - 2] : '\0';
        }
        numChars = lastIndex - fromIndex;
    }
    return numChars;
  }

  private int numberOfNewlineCharactersToSkip(char currentChar) {
    if ((currentChar == '\n' && prevChars[0] == '\n') || (currentChar == '\r' && prevChars[0] == '\r')) {
        return 1;
    }
    if ((currentChar == '\n' && prevChars[0] == '\r' && prevChars[1] == '\n' && prevChars[2] == '\r')) {
        return 2;
    }
    return 0;
  }

  @Override
  public int read() throws IOException {
    char[] buffer = new char[1];
    int result = read(buffer, 0, 1);

    return (result == -1) ? -1 : (int) buffer[0];
  }
}

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2011-02-20
    • 2012-10-20
    • 2011-10-24
    • 2015-11-15
    • 2013-01-18
    • 2017-05-14
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多