java中\r與\n的區別 (主要是在windows中DOS命令下)

\r : return 到當前行的最左邊。

\n: newline 向下移動一行,並不移動左右。

歷史:

回車”(Carriage Return)和“換行”(Line Feed)這兩個概念的來歷和區別。
 在計算機還沒有出現之 前,有一種叫做電傳打字機(Teletype Model 33,Linux/Unix下的tty概念也來自於此)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正 好可以打兩個字符。要是在這0.2秒裏面,又有新的字符傳過來,那麼這個字符將丟失。
於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字符。一個叫做“回車(return)”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行(newline)”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。

後來,計算機發明瞭,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認爲在每行結尾加兩個字符太浪費了,加一個就可以。於是,就出現了分歧。 

Linux中\n表示回車+換行;

Windows中\r\n表示回車+換行。(文件以\r\n結尾)

Mac中\r表示回車+換行。

Unix系統裏,每行結尾只有“<換行>”,即“\n”;Windows系統裏面,每行結尾是“<換行><回車>”,即“\n\r”;Mac系統裏,每行結尾是“<回車>”。一個直接後果是,Unix/Mac系統下的文件在Windows裏打開的話,所有文字會變成一行;而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。

1)

import java.util.Vector;
public class Read {
	 public static void main (String[] args) {
		 Vector<Character> v=new Vector<Character>();
		     
		     v.add('a');
		     v.add('s');
		     v.add('d');
		     v.add('w');
		     System.out.print(v);
	   }
}

執行DOS命令:


輸出結果:[a, s, d, w]

2)以\r結尾

import java.util.Vector;
public class Read {
	 public static void main (String[] args) {
		 Vector<Character> v=new Vector<Character>();
		     
		     v.add('a');
		     v.add('s');
		     v.add('d');
		     v.add('w');
		     v.add('\r');
		     System.out.print(v);
	   }
}

執行DOS命令:



輸出結果:]a, s, d, w, (最後含一個空格)

原因:vector的元素應該爲[a, s, d, w, \r],首先程序輸出[a, s, d, w, (最後含一空格)。當輸出\r時打印頭定位到當前行最左邊,然後輸出‘]’,‘]’把最開始的字符‘[’覆蓋掉。(真艹蛋)

3) 輸出‘\r’'\n'

import java.util.Vector;
public class Read {
	 public static void main (String[] args) {
		 Vector<Character> v=new Vector<Character>();
		     
		     v.add('a');
		     v.add('s');
		     v.add('d');
		     v.add('w');
		     v.add('\r');
		     v.add('\n');
		     System.out.print(v);
	   }
}
執行DOS命令

輸出結果:

, , s, d, w, (末尾含一空格)

]

原因:程序應該輸出輸出[a, s, d, w, \r, \n],程序執行時首先輸出[a, s, d, w, (末尾含一空格)。然後輸出\r時,打印頭定位到本行的最左邊,然後把字符‘[’覆蓋輸出字符逗號‘,’,接着覆蓋先前輸出字符‘a’替換成字符空格‘ ’,然後輸出\n時,打印頭定位到下一行,輸出‘]’。

4)以“\r\n”結尾

import java.util.Vector;
public class Read {
	 public static void main (String[] args) {
		 Vector<Object> v=new Vector<Object>();
		     
		     v.add('a');
		     v.add('s');
		     v.add('d');
		     v.add('w');
		     v.addElement("\r\n");
		     System.out.print(v);
	   }
}

執行DOS命令:


Vector的數據爲[a, s, d, w, \r\n]。程序首先輸出[a, s, d, w, (末尾一空格)。然後輸出\r,打印頭定位到本行最左邊,然後輸出\n換行,接着輸出']'

PS:以上程序在IDE下運行,輸出結果除了1)其他都不同。可能IDE下\r也看做是換行



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章