BufferedReader被不同的行分隔符

时间:2016-04-12 19:14:35

标签: java bufferedreader

我正在使用缓冲读卡器来传输文件。现在有两种情况:

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

我认为我的问题是由EOL引起的。

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

此外,当我使用line.equalsIgnoreCase("abc")比较该行时,如果该行为"abc" ,则不会返回true。

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

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);
    }
}

File1File2

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

我一直在搜索和尝试,搜索和尝试,但无法提出解决方案。

任何想法如何解决? (特别是比较的东西?)

2 个答案:

答案 0 :(得分:1)

适合我。

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行的文件,这是我第一次尝试修复。请测试一下,我还没试过。您需要将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();
   }

}

答案 1 :(得分:0)

Joop是对的,经过一些更多的研究似乎,即使两个文件都在其标题中指定了UTF-16编码,一个编码为UTF-16,另一个(File1)编码为UTF-8。这导致了双线效应&#34;。 感谢您在回答这个问题时付出的努力。