回车,换⾏,转义字符“r”,“n”是什么关系?
1.“回车”这个名词的来历。
关于“回车键”的来历,还得从机械英⽂打字机说起。在机械英⽂打字机上,有⼀个部件叫“字车”,每打⼀个字符(原为单词,但是个⼈觉得这⾥应该是字符),“字车”就前进⼀格。当打满⼀⾏字符后,打字者就得推动“字车”到起始位置,这时打字机会有两个动作响应:⼀是“字车”被归位,⼆是滚筒上卷⼀⾏,以便开始输⼊下⼀⾏,这个推动“字车”的动作叫“回车”。后来,在电动英⽂打字机上,⼈们增加了⼀个直接起“回车”作⽤的键。这个新增的键就被称为“回车键”。后来电脑的研制时也借⽤这个“回车”的概念。
2.“换⾏”是⼀种操作或者动作。
换⾏:在电脑上,编辑软件中⼀般⽤于结束⼀⾏⽂字输⼊,并将光标移到下⼀⾏的⾏⾸的位置。
3. 转义字符“\r”,“\n”。
在C中定义了⼀些字母前加"\"来表⽰常见的那些不能显⽰的ASCII字符,如\0,\t,\n等,因为后⾯的字符,都不是它本来的ASCII字符意思了就称为转义字符,。Java是在的底层⽤c 和c++写的,Java中也有转义字符这⼀说。
详情看ASCII码表
看表头有控制码和打印码的区分
4.其他的⼀些知识
在Unix系统下执⾏换⾏操作⽤“\n” 在windows 操作做系统下执⾏换⾏操作⽤“\r\n” 在Mac操作系统下执⾏换⾏操作⽤“\r”
其他⼈对这些知识点的介绍:
有了上⾯的了解我们可以这样认为
我们通常说的“回车” 也就是得到换⾏的效果也就是点电脑上的enter键
转义字符是⽤在打印数据时或者说在电脑硬盘上输⼊数据使⽤来控制字符的位置这些字符不显⽰来控制⼀些操作
回车得到换⾏的效果,敲enter键,在⽂本⽂件中产⽣我们看不见的转义字符
下⾯来测试⼀下
1.测试控制台输出(打印)规律
1public class DemoEscapeCharacter {
2public static void main(String[] args) {
3 System.out.print("aaa");
4 System.out.print("bbb");
5 System.out.print("ccc");
6 System.out.print("ddd");
7 System.out.print("eee");
8 System.out.print("fff");
9 System.out.println("*************");
10 System.out.print("转义字符\\r "+"aaa\r");
11 System.out.print("转义字符\\n "+"bbb\n");
12 System.out.print("转义字符\\r\\n "+"ccc\r\n");
generated13 System.out.print("转义字符\\n\\r "+"ddd\n\r");
14
15 System.out.print("转义字符\\n x \\r "+"eeeeeee\nf\r");
16 System.out.print("转义字符\\n xxx \\r "+"eeeeeee\nfff\r");
17 System.out.print("转义字符\\r x \\n "+"eeeeeee\rf\n");
18 System.out.print("转义字符\\r xxx \\n "+"eeeeeee\rfff\n");
19 System.out.println("******************************************");
20 System.out.print("转义字符\\n\\r\\r\\r"+"eeeeeeeeeeeeeeeee\n\r\r\r"+"abcdefghijk");
21 }
22 }
原先没有在字符串末尾加转义字符的输出(打印)到控制台没有换⾏加有"\r","\n","\r\n"的都出现换⾏
那么在控制台的换⾏是如何实现的那?
"\r","\n"------>"\r\n" 前两者都转换为了“\r\n” 或者说都是换⾏的动作因为Java中有重载⽅法,也就是Java⾯向对象的⼀个特征多态。也可以看出Java的跨平台⽆论什么平台⽤IO流读到内存中显⽰到控制台上的" ⽂本信息"可以⽆损还原。
“ddd\n\r” 不符合 "\r","\n","\r\n" 任何⼀个只能执⾏“\n”,"\r",也就是两次换⾏所以打印出来时和“eeeeeee\nf\r” 的eeeeeee有⼀⾏空⾏
最后“eeeeeeeeeeeeee\n\r\r\rabcdefghijk”有四次换⾏最后⼀次换⾏有内容写⼊所以有3⾏空⽩⾏
2.测试Windows下的换⾏是否是“\r\n”
1import java.io.FileNotFoundException;
2import java.io.FileReader;
3import java.io.FileWriter;
4import java.io.IOException;
5
6public class DemoReader {
7public static void main(String[] args) {
8 FileReader fr=null;
9try {
10 fr=new FileReader("C:/Users/lenovo/Desktop/编译错误单词.txt");
11char []buf=new char[10];//接受读取的⼀段信息
12int realCount=0;
13while ((ad(buf))!=-1){
14for (int i = 0; i <realCount; i++) {
15// if(buf[i]=='\r'){
16// System.out.print(" \\r");
17// }
18// if(buf[i]=='\n'){
19// System.out.print(" \\n");
20// }
21 System.out.print(buf[i]);
22 }
23 }
24 } catch (FileNotFoundException e) {
25// TODO Auto-generated catch block
26 e.printStackTrace();
27 } catch (IOException e) {
28// TODO Auto-generated catch block
29 e.printStackTrace();
30 }finally{
31if(fr!=null){
32try {
33 fr.close();
34 } catch (IOException e) {
35// TODO Auto-generated catch block
36 e.printStackTrace();
37 }
38 }
39 }
40 }
41 }
第⼀张图⽚是Windows中⽤记事本打开的原⽂本
第⼆张图⽚是注释掉15-20⾏代码实现的⽆损还原
第三章图⽚是不注释15-20⾏代码实现的增加还原
第三张控制台输出内容的解释
代码中进⾏了这样的操作凡是读取到的转义字符“\r”向控制台多输⼊⼀个字符串\r
凡是读取到的转义字符“\n”向控制台多输⼊⼀个字符串\n
这样的话因为 Windows 下记事本打开的每⾏末尾都有两个我们看不见的转义字符"\r","\n",这两个字符是我们在Windows下敲enter键产⽣的正是ASCII码中的控制字符
io流读取数据时可以读取到,我们在还原时进⾏特殊的处理来确定 Windows下的换⾏控制字符是什么
以控制台第⼀⾏第⼆⾏为例因为在第⼀⾏ “编译异常”末尾有“\r”,“\n”两个字符当我们读取到字符“\r”时我们在原来的末尾加上了字符串“\r”,然后读取到的“\r”向控制台输出即让控制台换⾏,所以当我们读取到下⼀个字符“\n”时输出的字符串“\n”在下⼀⾏(第⼆⾏)⾏⾸显⽰(打印)出来然后读取到的转义字符“\n”向控制台输出即继续换⾏所以原来的第⼆在控制台的第三⾏输出
结合控制台打印特点可知道Windows下的换⾏是通过 “\r\n”两个字符控制的或者说我们每次换⾏敲下enter键就产⽣了两个我们看不见的转义字符“\r\n”
我们还可以逆向测试从程序中向硬盘写⼊ text⽂件的内容
程序如下结果如下分析靠个⼈眼⼒很简单
1import java.io.FileWriter;
2import java.io.IOException;
3
4public class TestFileWriter {
5public static void main(String[] args) {
6 String[] text={
7 "这是第⼀⾏\n",
8 "这是⼀个TestFileWriter⽰例程序\n",
9 "需要⽤FileWriter打开⽂件\n",
10 "访问结束后需要关闭⽂件\n",
11 "否则内容不会写⼊⽂件,因为只写到了磁盘的缓冲区",
12 };
13 FileWriter fw=null;
14try {
15 fw=new FileWriter("C:/Users/lenovo/"); 16for(String str:text){
17char[]CharArray();
18 fw.write(buf,0,buf.length);
19 }
20 } catch (IOException e) {
21// TODO Auto-generated catch block
22 e.printStackTrace();
23 }finally{
24try {
25 fw.close();
26 } catch (IOException e) {
27// TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 }
31 }
32 }
1import java.io.FileWriter;
2import java.io.IOException;
3
4public class TestFileWriter {
5public static void main(String[] args) {
6 String[] text={
7 "这是第⼀⾏\r\n",
8 "这是⼀个TestFileWriter⽰例程序\r\n",
9 "需要⽤FileWriter打开⽂件\r\n",
10 "访问结束后需要关闭⽂件\r\n",
11 "否则内容不会写⼊⽂件,因为只写到了磁盘的缓冲区",
12 };
13 FileWriter fw=null;
14try {
15 fw=new FileWriter("C:/Users/lenovo/"); 16for(String str:text){
17char[]CharArray();
18 fw.write(buf,0,buf.length);
19 }
20 } catch (IOException e) {
21// TODO Auto-generated catch block
22 e.printStackTrace();
23 }finally{
24try {
25 fw.close();
26 } catch (IOException e) {
27// TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 }
31 }
32 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论