почему фрагмент не может определить конец строки - PullRequest
0 голосов
/ 13 августа 2011
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 предложения в новых строках. Почему это так ?

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

Как уже упоминалось, системное свойство line.separator может возвращать более одного символа, например, в Windows, где это \r\n.

В зависимости от вашего варианта использования, вам может быть лучше использовать BufferedReader::readLine() для непосредственного чтения всей строки и во избежание необходимости выполнять ручное сравнение.

1 голос
/ 13 августа 2011
  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 );
    }
    
0 голосов
/ 13 августа 2011

Я не знаю из вашего вопроса, могут ли быть кросс-платформенные проблемы, но есть некоторые различия в распознаваемых символах новой строки между платформами (такими как Unix и DOS), которые могли бы объяснить эту проблему. Я не уверен, но я думаю, что Блокнот использует "/ r / n", и это может не распознаваться вашим кодом как разделитель строк.

Взгляните на Википедия - новая строка

и конкретно в этом разделе: «Различные соглашения о переводе строки часто приводят к некорректному отображению текстовых файлов, которые были переданы между системами разных типов. Например, файлы, созданные в системах Unix или Apple Macintosh, могут отображаться как одна длинная строка в некоторых программах Windows. И наоборот, при просмотре файла, происходящего с компьютера Windows в системе Unix, дополнительный CR может отображаться как ^ M в конце каждой строки или как разрыв второй строки."

Надеюсь, это поможет.

...