-
先说小知识:
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return
换行 \n 本义是光标往下一行,n的英文newline,控制字符可以写成LF,即Line Feed -
代码案例:
具体例子说明:有个循环,循环10次给buffer加字符串,结果最后只打印了 一行数据。public class demoLogger { public static void main(String[] args) { StringBuffer buffer = new StringBuffer(); int i = 0; while (i < 10){ String msg = "我是第" + i + "行数据,啦啦啦啦啦"; buffer.append(msg).append("\r"); i++; } System.out.println(buffer); System.out.println("---------------"); } }
这是因为 \r 是将光标重新回到开头,导致继续添加数据,会把之前的数据给删除掉。测试案例:
public class demoLogger { public static void main(String[] args) { System.out.println("ac\nb"); System.out.println("--------"); System.out.println("a\rb"); System.out.println("--------"); System.out.println("ab\n"); System.out.println("--------"); System.out.println("ab\r"); System.out.println("--------"); // 为什么这个可以打印 a b呢,因为先\r把光标重回开头,但是\n 直接换行,不会覆盖之前所写内容 System.out.println("a\r\nb"); System.out.println("--------"); System.out.println("a\n\rb"); System.out.println("--------"); // 这里没有打印c 是因为\n换行之后,先打印了c,然后\r 光标回到开头,b覆盖了c System.out.println("a\nc\rb"); } }
-
总结:
- 一般在win下的换行符是使用\r\n 两个一起使用的,或者单独使用\n 也是可以的。
- 在UNIX类系统,换行\n就表现为光标下一行并回到行首。
- 在MAC上,\r就表现为回到本行开头并往下一行。