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也看做是换行



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