BufferedReader 被不同的行分隔符弄乱了

BufferedReader messed up by different line seperators

我正在缓冲 reader 流式传输文件。目前有两种情况:

它正在流式传输在一台PC 上生成的文件,我们称它为File1。 它正在流式传输在另一台计算机上生成的文件,我们称之为 File2。

我假设我的问题是由 EOL 引起的。

BufferedReader 会读取这两个文件,但对于 File2,它会为每个新行读取一个额外的空行。

此外,当我使用 line.equalsIgnoreCase("abc") 比较该行时,鉴于该行是 "abc" 它不 return 正确。

将此代码与两个链接中提供的两个文件一起使用以复制问题:

public class JavaApplication {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {
    File file = new File("C:/Users/User/Downloads/html (2).htm");
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
    String line = "";

    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }
}

File1, File2

注意第二个文件如何在每行后打印 一个空行...

我一直在搜索、尝试、搜索、尝试,但找不到解决方案。

有什么解决办法吗? (特别是比较的东西?)

适合我。

public class CRTest
{
   static StringReader test = new StringReader( "Line 1\rLine 2\rLine 3\r" );
   public static void main(String[] args) throws IOException {
      BufferedReader buf = new BufferedReader( test );
      for( String line = null; (line = buf.readLine()) != null; )
         System.out.println( line );
   }
}

打印:

run:
Line 1
Line 2
Line 3
BUILD SUCCESSFUL (total time: 1 second)

正如 Joop 所说,我认为您混淆了哪个文件不起作用。请使用上面的框架创建一个 MCVE 并向我们确切说明哪些文件输入不适合您。


由于您的文件似乎有 \r\n 行颠倒,这是我第一次尝试修复。请测试一下,我还没有尝试过。你需要用这个 class 包住你的 InputStreamReader,然后像往常一样把 BufferedReader 包在外面。

class CRFix extends Reader
{

   private final Reader reader;
   private boolean readNL = false;

   public CRFix( Reader reader ) {
      this.reader = reader;
   }

   @Override
   public int read( char[] cbuf, int off, int len )
           throws IOException
   {
      for( int i = off; i < off+len; i++ ) {
         int c = reader.read();
         if( c == -1 )
            if( i == off ) return -1;
            else return i-off-1;
         if( c == '\r' && readNL ) { 
            readNL = false;
            c = reader.read();
         }
         if( c == '\n' ) 
            readNL = true;
         else 
            readNL = false;
         cbuf[i] = (char)c;
      }
      return len;
   }

   @Override
   public void close()
           throws IOException
   {
      reader.close();
   }

}

Joop 是对的,经过更多研究后似乎,即使两个文件都在其 header 中指定了 UTF-16 编码,但一个是用 UTF-16 编码的,另一个 (File1)在 UTF-8 中。这导致了"double line effect"。 感谢您为回答这个问题所做的努力。