Почему эта простая программа приводит к другому файлу возврата каретки / перевода строки при выполнении в Java и AIX? - PullRequest
1 голос
/ 13 октября 2011

Если я запускаю эту простую программу в Windows 7, а затем в AIX (система Unix) и сравниваю два сгенерированных файла с помощью такого инструмента, как Winmerge или Compare It, он говорит мне, что возврат каретки и перевод строки отличаются, ноСодержание идентично.

  • Почему это так?Разве не должно быть одинаковым, если оба используют одну и ту же кодировку "UTF-8" в этом случае?

  • Как сделать оба файла полностью равными?

public class WriteFile {

    public static void main(String[] args) throws IOException {
        write();

    }

    public static void write() throws IOException {
        File file = new File("/tmp/test.txt");
        file.delete();
        file.createNewFile();
        String str = "hello";
        FileOutputStream fileOs = new FileOutputStream(file);
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(fileOs, "UTF-8"), true);
        writer.println(str);
        writer.close();
    }

}

Ответы [ 3 ]

5 голосов
/ 13 октября 2011

Различные операционные системы используют разные соглашения о новой строке:

  • В Windows символами новой строки являются CR+LF;
  • В Unix символами новой строки являются LF.

(Если вам интересно, есть больше .).

Если вам нужно, чтобы выходные файлы были идентичными, не используйте println(), но пишите \nили \r\n вместо:

writer.printf("%s\n", str);   // LF
writer.printf("%s\r\n", str); // CR+LF
3 голосов
/ 13 октября 2011

Использование

writer.print(str + "\n");

вместо

writer.println(str);
1 голос
/ 13 октября 2011

Как уже было сказано, вы должны переключиться с использования println (String) на print (String) или printf (String, ...)

Ознакомьтесь с документацией для println (String) (выделено мной):

Печатает строку , а затем завершает строку .Этот метод ведет себя так, как будто он вызывает print (String) , а затем println () .

и документы для println () :

Завершает текущую строку записью строки-разделителя .Строка разделителя строк определяется системным свойством line.separator и является , а не , обязательно одним символом новой строки ('\ n').

Вы можете прочитать о line.separator системное свойство здесь .

Я бы согласился с предложением Экс использовать

writer.printf("%s\n", str);
...