2011-08-13 30 views
0
FileReader reader = new FileReader("d:\\UnderTest\\AVS\\tester.txt"); 
     char ch; 
     int x; 
     while((x = reader.read()) != -1) { 
       // I use the following statement to detect EOL 
       if(Character.toString((char)x) == System.getProperty("line.separator")) { 
        System.out.println("new line encountered !"); 
       } System.out.print((char)x); 
     } 

在此代码中,if语句从不工作,但在tester.txt中有2个句子写在新行上。 这是为什么呢?为什么片段无法检测到行尾

回答

2

如一些人所提到的,系统属性line.separator可能会返回一个以上的字符,例如在Windows上,它是\r\n

根据您的使用情况,最好使用BufferedReader::readLine()来直接读取整个行,并避免执行手动比较。

0

我不知道你的问题是否可能涉及跨平台问题,但是在可能解释这个问题的平台(例如Unix和DOS)之间的已识别换行字符有一些差异。我不确定,但我认为记事本使用“/ r/n”,可能无法将您的代码识别为行分隔符。

看一看Wikipedia - newline

并且具体在本节:“不同的换行符约定常引起已不同类型的系统之间传送文本文件被错误地显示例如,文件始发于Unix。或Apple Macintosh系统可能在某些Windows程序中显示为单个长行,反之,在Unix系统上查看源自Windows计算机的文件时,额外的CR可能在每行的末尾显示为^ M或作为第二次换行

我希望有帮助。

+0

这就是我使用'System.getProperty(“line.separator”)''的原因! –

+0

@Suhail,但是当你阅读和比较单个字符时,你永远不会检测到多字符EOL。 –

+0

@马特球是的,我现在意识到。 –

1
  1. 什么字符串是由System.getProperty("line.separator")返回?它是多个字符,例如"\r\n"?任何单个字符都不会等于包含多个字符的字符串。
  2. 但更基本的是,代码使用==而不是String.equals()检查字符串相等时,请勿使用==。始终使用String.equals()

    FileReader reader = new FileReader("d:\\UnderTest\\AVS\\tester.txt"); 
    char ch; 
    int x; 
    final String linesep = System.getProperty("line.separator"); 
    while((x = reader.read()) != -1) 
    { 
        if(linesep.equals(Character.toString((char)x))) 
        { 
         System.out.println("new line encountered !"); 
        } 
        System.out.print((char)x); 
    } 
    
相关问题