2015-10-21 91 views
0

在java中从InputStream去除空行的最佳方式是什么?如何去除InputStream中的空行?

+1

如果你有兴趣的线条,你也可以使用类似'新的BufferedReader(新的InputStreamReader(是))线()在Java 8中使用.filter(line - >!line.isEmpty())'(如果需要,请尝试使用资源)。这会在输入流中产生非空行的“Stream ”。 – assylias

回答

3

可以使用自定义滤波器读取器,最好是可以处理不同行结束符的一个(\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]; 
    } 
}