2014-05-17 32 views
8

Właśnie przeglądałem pytania i znalazłem System.getProperty(line.separator) użyte zamiast \n z komentarzem autora, że ​​kod był "przenośny". Czytając różne fora, widziałem dwie grupy: ni r wydaje się działać wszędzie. Dlaczego line.separator jest bardziej przenośny?

  1. Ludzie, którzy twierdzą, że istnieje różnica między interpretacją znaków nowej linii przez Linuksa i Windowsa, a to rekompensuje (bez wyraźnych dowodów).
  2. Ludzie, którzy twierdzą, że nie ma różnicy, pokazując kod i przykłady wyników, co oczywiście odnosi się tylko do tego przykładu kodu, a nie do wszystkich.

Mam wrażenie, że jest to prawdopodobnie niestandardowy system operacyjny, na przykład na przykład system operacyjny skanera Twojej firmy, gdzie zauważysz różnicę. Kiedy zobaczę różnicę między \n a line.separator? Czy możesz pokazać przykład? Jak udało Ci się odkryć, gdzie występuje zmiana?

+0

Spróbuj napisać kilka plików tekstowych, z "\ n", jednym z '\ r' iz' \ n \ r' jako zakończeniami linii, otwórz to w Notatniku w systemie Windows, aby zobaczyć różnicę – MadProgrammer

+0

Windows i Unix rzeczywiście różne kody końca linii. Różnica ta pojawi się lub nie pojawi się w zależności od aplikacji konsumującej. –

+5

Separatory linii są również bardzo ważne w niektórych protokołach sieciowych. Najlepiej szanować standardy. – Palpatim

Odpowiedz

8

Nieprawidłowe zakończenia linii są częstym problemem. Na przykład, to co Notatnika Windows pokazuje pisząc plik z \n zamiast \r\n (line.separator okien):

Notepad with boxes instead of line breaks

Te małe pudełka miały być podziały wiersza.

W drugą stronę, gdy \r\n jest używany zamiast \n (Unix 'line.separator), jest o wiele gorszy, a łamie skrypty powłoki i pliki konfiguracyjne w dziwny i cudowny sposób.

Na przykład, to co sh wyjścia na Debianie i dystrybucje pochodne, gdy próbuje uruchomić skrypt powłoki, który zawiera tylko ls ale z \r\n separatorów (wygląda kosza, ponieważ powrót karetki powoduje terminal do nadpisania części linii):

: not foundsh: ls 

Istnieje kilka pytań dziennie na StackOverflow od ludzi ugryzieniu przez to, jak here, here i here.

+0

"Uruchom' ls' z pliku formatu dos "nie znaczy nic. – dfeuer

+0

@dfeuer Przepiszę to, ale o co w szczególności się sprzeciwiłeś? –

+0

Po prostu nie ma wystarczającego kontekstu, aby łatwo zrozumieć, co to ma znaczyć. Najwyraźniej chodziło o "przetworzyć plik składający się z ciągu' 'ls \ r \ n" "jako skrypt powłoki Bourne'a", ale zamiast tego mówiłeś o uruchomieniu czegoś z pliku, co nie znaczy nic szczególnie. – dfeuer

6

Jeśli zrobisz to źle, ZNALAZISZ twoją zdolność do wymiany danych z innymi aplikacjami. Musisz zrozumieć, kiedy możesz uciec, zakładając, że Java ci pomoże ... a kiedy nie.

W aplikacjach systemu Linux jako punkt podziału linii zwykle używany jest tylko znak końca linii (\ n). Aplikacje Windows używają kombinacji powrotu karetki, a następnie linii (\ n \ r).

Jeśli używasz wysokopoziomowych procedur wejścia/wyjścia Java - jeśli przechodzisz przez Czytniki i zapisy, które przetwarzają znaki, a nie strumienie niskiego poziomu, a zwłaszcza strumienie bajtów - biblioteki będą tłumaczyć \ n (które java, zgodnie z konwencją, używa wewnętrznie jako swojej nowej linii) w reprezentacji odpowiedniej dla platformy. Jeśli korzystasz z funkcji niższego poziomu, musisz zdawać sobie sprawę z tego rozróżnienia i robić to sam.

10

Oto standardowe separatorów przez OS:

Windows: '\r\n' 
Mac (OS 9-): '\r' 
Mac (OS 10+): '\n' 
Unix/Linux: '\n' 

Co to znaczy, że jeśli ciężko kodzie separatory linii jako \n, masz zamiar uzyskać oczekiwane rezultaty w systemach Linux i OS X, ale System Windows nie rozpozna poprawnie zakończeń linii. Jednakże, używając bardziej ogólnego line.separator do reprezentowania twoich zakończeń linii, będą one reagować na to, co może się zdarzyć, że oczekiwana implementacja zakończenia linii na uruchomionym systemie operacyjnym może być.

+0

Dziwne, biblioteka tekstowa I/O Glasgow Haskell jest w stanie obsłużyć współczesną konwencję, '' \ n "' i konwencję Windows, '" \ r \ n "', ale nie jest starym '" \ r " 'Konwencja Mac. – dfeuer

+0

To jest naprawdę fajna odpowiedź. Lubię przykłady: cytat i obraz. Nadal uważam, że byłoby miło wiedzieć: gdzie konkretnie są rysowane linie (ponieważ nie napotkałem żadnych problemów przy użyciu '\ n' w Windowsie z Javą) i jak mogę znaleźć te informacje. –

+0

Cieszę się, że próbuję rozszerzyć odpowiedź, ale co dokładnie rozumiesz przez "gdzie konkretnie rysują się linie"? Jak stwierdził Keshlam w swojej odpowiedzi, jakiś kod wysokiego poziomu poprawnie przekonwertuje '\ n' na odpowiednią znak nowej linii dla środowiska, ale jeśli myślisz, że chcesz potencjalnie uruchomić na wielu platformach, lepiej nie polegając na tym zachowaniu i po prostu używając globalnej reprezentacji separatora linii. O ile mi wiadomo, nie ma kompleksowej dokumentacji tego, gdzie się znajdą i nie będą dla ciebie nawrócone. –