我一直认为line.separator
与\n
做同样的事情,是。但是当我测试这段代码时,我注意到这两个值实际上并不相同(可能甚至不接近?):
String str1 = System.getProperty("line.separator");
String str2 = "\n";
System.out.println(str1.equals(str2)); // output:false (as expected)
然后我检查了两者的长度:
System.out.println(str1.length()); //output: 2
System.out.println(str2.length()); //output: 1
想知道为什么str1.length()
是2
,我试过这个:
System.out.println("**"+str1.charAt(0)+"**");
输出:
**
System.out.println("##"+str1.charAt(1)+"##");
输出:
##
##
所以我注意到line.separator
中的实际换行符是第二个字符。那么第一个索引中的值是什么,就像它应该打印****
(至少)时一样,它的打印**
呢?
答案 0 :(得分:5)
取决于您的操作系统。
对于Windows,line.separator
的实际值为\r\n
从您的代码System.out.println(str1.length()); //output: 2
,我相信您使用的是Windows操作系统(其他操作系统将提供输出:1 )
它解释了为什么得到这个输出:
System.out.println("**"+str1.charAt(0)+"**");
输出:
**
\r
是一个回车符,在您打印**
后,指针返回到初始点,然后打印第二个**
,重写第一个**
。最后,您只获得**
作为输出
第二个:
System.out.println("##"+str1.charAt(1)+"##");
输出:
##
##
你得到了这样的输出,因为str1.charAt(1)
实际上是\n
答案 1 :(得分:4)
这取决于平台/操作系统,在Linux中是\n
,在Windows中,它是\r\n
Windows: '\r\n'
Mac (OS 9-): '\r'
Mac (OS 10+): '\n'
Unix/Linux: '\n'
答案 2 :(得分:3)
在Windows上,它是“\ r \ n”,在* NIX上,它是“\ n”,在OSX之前的Mac上它是“\ r”。您可以从System
对象中检索它,因为它取决于操作系统。
答案 3 :(得分:0)
换行 - LF - \ n - 0x0a - 10(十进制)
回车 - CR - \ r - 0x0D - 13(十进制)
既然我们已经明白我们有两种不同的选择来获得新线,那么出现的问题是 - 为什么会这样?
原因很简单。不同的操作系统有不同的理解新线的方式。 Mac只将'\ r'理解为新行,而Unix和Linux将'\ n'理解为新行字符。我们最喜欢的OS窗口需要两个字符一起解释为新行,即'\ r \ n'。这就是为什么在一个操作系统中创建的文件无法在另一个操作系统中正常打开并使其变得混乱的原因。