1.“回車”這個名詞的來歷。
關於“回車鍵”的來歷,還得從機械英文打字機說起。在機械英文打字機上,有一個部件叫“字車”,每打一個字符(原為單詞,但是個人覺得這里應該是字符),“字車”就前進一格。當打滿一行字符后,打字者就得推動“字車”到起始位置,這時打字機會有兩個動作響應:一是“字車”被歸位,二是滾筒上卷一行,以便開始輸入下一行,這個推動“字車”的動作叫“回車”。后來,在電動英文打字機上,人們增加了一個直接起“回車”作用的鍵。這個新增的鍵就被稱為“回車鍵”。后來電腦的研制時也借用這個“回車”的概念。
2.“換行”是一種操作或者動作。
換行: 在電腦上,編輯軟件中一般用於結束一行文字輸入,並將光標移到下一行的行首的位置。
3. 轉義字符“\r”,“\n”。
在C中定義了一些字母前加"\"來表示常見的那些不能顯示的ASCII字符,如\0,\t,\n等,因為后面的字符,都不是它本來的ASCII字符意思了就稱為轉義字符,。Java是在的底層用c 和c++寫的,Java中也有轉義字符這一說。
看表頭 有控制碼 和打印碼 的區分
4.其他的一些知識
在Unix系統下執行 換行操作 用“\n” 在windows 操作做系統下執行 換行操作 用“\r\n” 在Mac操作系統下執行 換行操作用“\r”
其他人對這些知識點的介紹:
http://blog.csdn.net/xiaoxian8023/article/details/8448160
有了上面的了解 我們可以這樣認為
我們通常說的“回車” 也就是得到 換行的效果 也就是點電腦上的enter鍵
轉義字符 是用在打印數據時 或者 說 在電腦硬盤上輸入數據使用 來控制字符的位置 這些字符不顯示 來控制一些操作
回車得到換行的效果,敲enter鍵,在文本文件中產生我們看不見的轉義字符
下面來測試一下
1.測試控制台輸出(打印)規律
1 public class DemoEscapeCharacter { 2 public 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"); 13 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”
1 import java.io.FileNotFoundException; 2 import java.io.FileReader; 3 import java.io.FileWriter; 4 import java.io.IOException; 5 6 public class DemoReader { 7 public static void main(String[] args) { 8 FileReader fr=null; 9 try { 10 fr=new FileReader("C:/Users/lenovo/Desktop/編譯錯誤單詞.txt"); 11 char []buf=new char[10];//接受讀取的一段 信息 12 int realCount=0; 13 while ((realCount=fr.read(buf))!=-1){ 14 for (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{ 31 if(fr!=null){ 32 try { 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文件的內容
程序如下 結果如下 分析 靠個人眼力 很簡單
1 import java.io.FileWriter; 2 import java.io.IOException; 3 4 public class TestFileWriter { 5 public static void main(String[] args) { 6 String[] text={ 7 "這是第一行\n", 8 "這是一個TestFileWriter示例程序\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 Auto-generated catch block 22 e.printStackTrace(); 23 }finally{ 24 try { 25 fw.close(); 26 } catch (IOException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 } 31 } 32 }
1 import java.io.FileWriter; 2 import java.io.IOException; 3 4 public class TestFileWriter { 5 public 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; 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 Auto-generated catch block 22 e.printStackTrace(); 23 }finally{ 24 try { 25 fw.close(); 26 } catch (IOException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 } 31 } 32 }
還有個比較簡單的方法 但看不出 內容
打開記事本 輸入 兩個漢字 敲enter 保存 ;查看文件大小 6字節[b];
創建新的 一個 記事本 文件 輸入兩個漢字 保存 ;查看文件大小 4字節[b];
一個漢字兩個字節 2[b] 。