java读取键盘回车-java 替换回车换行
1、“回车”一词的由来。
关于“回车键”的由来,还得从机械英文打字机说起。 在机械英文打字机上,有一个叫做“Character”的部分,每打出一个字符(本来是一个单词,但我个人认为应该是一个字符),“Car”就前进一格。 当一行字符填满后,打字员必须将“字符车”推到起始位置。 这时,打字机响应两个动作:一个是“字车”回到原位,一个是滚筒卷起一行开始进入下一行,推动“字车”的动作carriage”称为“回车”。 后来,在电动英文打字机上,人们加了一个键,直接起到“回车”的作用。 这个新添加的键称为“回车键”。 后来,“回车”的概念也是在计算机发展时借用的。
2.“换行”是一个操作或动作。
换行符:在计算机上,一般用于编辑软件中,结束一行文本输入,将光标移动到下一行的行首。
3、转义字符“\r”、“\n”。
在C中,有些字母是通过加“\”来定义的,代表不能显示的普通ASCII字符,如\0、\t、\n等,因为后面的字符不是原来的ASCII字符。 对于转义字符,. Java底层是用c和c++写的,Java里面有转义符。
看表头,有控制码和打印码的区别
4.其他一些知识
Unix系统下用“\n”执行换行,Windows操作系统下用“\r\n”执行换行,Mac操作系统下用“\r”执行换行
别人对这些知识点的介绍:
有了上面的理解,我们可以认为
我们通常所说的“回车”就是为了得到换行的效果java读取键盘回车,也就是在电脑上点击回车键
转义字符用于打印数据或在计算机硬盘上输入数据时控制字符的位置。 不显示这些字符以控制某些操作。
回车得到换行的效果,按回车键会产生我们在文本文件中看不到的转义字符
让我们测试一下
1.测试控制台输出(打印)规则
1 public classDemoEscapeCharacter {2 public static voidmain(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");13 System.out.print("转义符\\n\ \r " +"ddd\n\r");14
15 System.out.print("转义符\\nx \\r "+"eeeeeee\nf\r");16 System.out.print("转义符\\n xxx \\r "+"eeeeeee \nfff \r");17 System.out.print("转义字符\\rx \\n "+"eeeeeee\rf\n");18 System.out.print("转义字符\\r xxx \\n " +"eeeeeeee\rfff\n");19 System.out.println("****************************** **** ***********");20 System.out.print("转义字符\\n\\r\\r\\r"+"eeeeeeeeeeeeeeeeeeee\n\r\r \r"+ "abcdefghijk");21 }22 }
原来没有在字符串末尾加转义字符到控制台的输出(print)没有换行,加了“\r”、“\n”、“\r\n”都出现了换行
那么控制台中的换行符是如何实现的呢?
"\r","\n"------>"\r\n" 前两个转换为"\r\n"或者换行的动作,因为Java中有重载的方法,而 是Java面向对象的一个特征多态性。 也可以看出,Java的跨平台可以使用IO流,在内存中读取控制台显示的“文本信息”,无损还原。
"ddd\n\r" 不匹配 "\r", "\n", "\r\n" 任何一个只能执行 "\n", "\r", 即两个换行符,所以打印的时候out, 和"eeeeeee\nf\r"的eeeeeee是一样的,有一个空行
最后,“eeeeeeeeeeeeeeee\n\r\r\rabcdefghijk”有四个换行符,最后一个换行符写了内容,所以有3个空行
2、测试Windows下换行符是否为“\r\n”
1 importjava.io.FileNotFoundException;2 importjava.io.FileReader;3 importjava.io.FileWriter;4 importjava.io.IOException;5
6 public classDemoReader {7 public static voidmain(String[] args) {8 FileReader fr=null;9 try{10 fr=new FileReader("C:/Users/lenovo/Desktop/compile error words.txt");11 char []buf=new char[10];//接受读取的一条信息
12 int realCount=0;13 while ((realCount=fr.read(buf))!=-1){14 for (int i = 0; i
21 System.out.print(buf[i]);22 }23 }24 } catch(FileNotFoundException e) {25 //TODO 自动生成的catch块
26 e.printStackTrace();27 } catch(IOException e) {28 //TODO 自动生成的catch块
29 e.printStackTrace();30 }finally{31 if(fr!=null){32 try{33 fr.close();34 } catch(IOException e) {35 //TODO 自动生成的 catch 块
36 e.printStackTrace();37 }38 }39 }40 }41 }
第一张图是Windows中用记事本打开的原文
第二张图是注释掉15-20行代码实现的无损还原
第3章的图片是在没有注释15-20行代码的情况下实现的添加还原
第三个控制台输出的解释
这样的操作是在代码中进行的。 如果读取到转义字符“\r”,则在控制台输入一个额外的字符串\r
对于读取到的任何转义字符“\n”,在控制台输入一个额外的字符串\n
在这种情况下,由于Windows下记事本打开的每一行末尾都有两个不可见的转义字符“\r”和“\n”,所以在代码中我们在Windows控制字符下回车时,这两个字符正好是ASCII
io流读取数据的时候可以读取,我们在恢复的时候进行特殊处理,判断windows下的换行控制符是什么
以控制台第一行第二行为例,因为第一行“编译异常”的末尾有两个字符“\r”和“\n”。 当我们读到字符“\r”时,我们在原来的末尾添加了字符串“\r”,然后将读到的“\r”输出到控制台,让控制台换行java读取键盘回车,所以当我们读到下一个字符“\n”,输出字符串“\n”在下一行(第二行)的开头显示(打印),然后将读取的转义字符“\n”输出到控制台,即就是,继续回绕,所以控制台第三行输出的是原来的秒
结合控制台打印的特点,我们可以知道,Windows下的换行是由“\r\n”这两个字符控制的或者我们每次换行时按回车键生成两个不可见的转义符“\r” \n”
我们还可以逆向测试从程序中写入硬盘的文本文件的内容
程序如下,结果如下:个人眼力分析很简单
1 importjava.io.FileWriter;2 importjava.io.IOException;3
4 public classTestFileWriter {5 public static voidmain(String[] args) {6 String[] text={7 "This is the first line\n", 8 "This is a TestFileWriter sample program\n", 9 "需要使用FileWriter 打开文件\n",10 "访问后需要关闭文件\n",11 "否则内容不会写入文件,因为只是写入磁盘的缓冲区",12 };13 FileWriter fw=null;14 try{ 15 fw=new FileWriter("C:/Users/lenovo/Desktop/FileWriter1.text");16 for(String str:text){17 char[]buf=str. toCharArray();18 fw.write(buf, 0,buf.length);19 }20 } catch(IOException e) {21 //TODO 自动生成的catch块
22 e.printStackTrace();23 }finally{24 try{25 fw.close();26 } catch(IOException e) {27 //TODO 自动生成的catch块
28 e.printStackTrace();29 }30 }31 }32 }
1 importjava.io.FileWriter;2 importjava.io.IOException;3
4 public classTestFileWriter {5 public static voidmain(String[] args) {6 String[] text={7 "This is the first line\r\n",8 "This is a TestFileWriter sample program\r\n",9 "需要用FileWriter打开文件\r\n",10 "访问后需要关闭文件\r\n",11 "否则内容不会写入文件,因为只写入了磁盘缓冲区",12 };13 FileWriter fw=null;14 try{15 fw=new FileWriter("C:/Users/lenovo/Desktop/FileWriter1.text");16 for(String str:text){17 char[]buf=str.toCharArray() ;18 fw.write(buf,0,buf.length);19 }20 } catch(IOException e) {21 //TODO 自动生成的catch块
22 e.printStackTrace();23 }finally{24 try{25 fw.close();26 } catch(IOException e) {27 //TODO 自动生成的catch块
28 e.printStackTrace();29 }30 }31 }32 }
有一个更简单的方法,但我看不到内容
打开记事本,输入两个汉字回车保存; 检查 6 字节的文件大小[b];
新建记事本文件,输入两个汉字保存; 检查文件大小 4 字节 [b];
一个汉字有两个字节2[b]。