\ n und \ r scheinen überall zu funktionieren. Warum ist line.separator tragbarer?

8

Ich habe nur die Fragen durchgelesen und ich fand System.getProperty(line.separator) anstelle von \n mit dem Kommentar des Autors, dass der Code "portabel" war. In verschiedenen Foren habe ich zwei Gruppen gesehen:

  1. Leute, die sagen, dass es einen Unterschied zwischen Linux und Windows gibt, interpretieren Newline-Zeichen, und das kompensiert dies (ohne eindeutige Beweise).
  2. Leute, die sagen, dass es keinen Unterschied gibt, wenn sie Code- und Ausgabe-Beispiele zeigen, was offensichtlich nur für dieses Codebeispiel gilt und nicht universell.

Mein Gefühl ist: Es sind wahrscheinlich Nicht-Standard-Betriebssysteme, wie zum Beispiel das Betriebssystem Ihres Unternehmens, wo Sie einen Unterschied bemerken. Wann sehe ich einen Unterschied zwischen \n und line.separator ? Können Sie bitte ein Beispiel zeigen? Wie haben Sie herausgefunden, wo die Variation auftritt?

    
Wolfpack'08 17.05.2014, 02:24
quelle

3 Antworten

8

Falsche Zeilenenden sind ein häufiges Ärgernis. Dies zeigt zum Beispiel Windows Notepad beim Schreiben einer Datei mit \n anstelle von \r\n (Windows 'line.separator):

Diese kleinen Boxen sollten Zeilenumbrüche sein.

Anders herum, wenn \r\n anstelle von \n (Unix 'line.separator) verwendet wird, ist es viel schlimmer und bricht Shell-Skripte und Konfigurationsdateien auf seltsame und wunderbare Weise.

Beispielsweise gibt sh auf Debian und abgeleiteten Distributionen aus, wenn ein Shell-Skript ausgeführt wird, das nur ls aber mit \r\n -Zeilentrennzeichen enthält (es sieht verwaist aus, weil der Wagenrücklauf das Terminal dazu veranlasst) Teile der Zeile überschreiben):

%Vor%

Es gibt mehrere Fragen pro Tag auf StackOverflow von Leuten, die davon gebissen werden, wie hier , hier und hier .

    
that other guy 17.05.2014, 02:32
quelle
10

Hier sehen Sie die Standardzeilentrennzeichen nach Betriebssystem:

%Vor%

Das heißt, wenn Sie Ihre Zeilentrennzeichen als \n fest codieren, erhalten Sie unter Linux und OS X die erwarteten Ergebnisse, aber Windows erkennt die Zeilenenden nicht richtig. Wenn Sie jedoch die allgemeinere line.separator zur Darstellung Ihrer Zeilenenden verwenden, werden sie in die von dem ausführenden Betriebssystem erwartete Implementierung von Zeilenenden aufgelöst.

    
Sam Hanley 17.05.2014 02:36
quelle
6

Wenn Sie das falsch verstehen, werden Sie Ihre Fähigkeit, Daten mit anderen Anwendungen auszutauschen, vermasseln. Sie müssen verstehen, wann Sie davon ausgehen können, dass Java Ihnen helfen wird ... und wenn Sie nicht können.

Linux-Anwendungen verwenden normalerweise nur das Zeilenvorschubzeichen (\ n) als Zeilenumbruch. Windows-Anwendungen verwenden die Kombination aus Wagenrücklauf gefolgt von Zeilenvorschub (\ n \ r).

Wenn Sie High-Level-Java-I / O-Routinen verwenden - wenn Sie durch Reader und Writer gehen, die Zeichen verarbeiten, anstatt Low-Level-Streams und insbesondere Byte-Streams - übersetzen die Bibliotheken \ n ( welches Java per Konvention intern als Newline verwendet) in die plattformgerechte Darstellung. Wenn Sie Funktionen auf niedrigerer Ebene verwenden, müssen Sie sich dieser Unterscheidung bewusst sein und das Richtige selbst tun.

    
keshlam 17.05.2014 02:36
quelle

Tags und Links