回車,換行,轉義字符“\r”,“\n”是什么關系?


1.“回車”這個名詞的來歷。  

   關於“回車鍵”的來歷,還得從機械英文打字機說起。在機械英文打字機上,有一個部件叫“字車”,每打一個字符(原為單詞,但是個人覺得這里應該是字符),“字車”就前進一格。當打滿一行字符后,打字者就得推動“字車”到起始位置,這時打字機會有兩個動作響應:一是“字車”被歸位,二是滾筒上卷一行,以便開始輸入下一行,這個推動“字車”的動作叫“回車”。后來,在電動英文打字機上,人們增加了一個直接起“回車”作用的鍵。這個新增的鍵就被稱為“回車鍵”。后來電腦的研制時也借用這個“回車”的概念。

2.“換行”是一種操作或者動作

  換行: 在電腦上,編輯軟件中一般用於結束一行文字輸入,並將光標移到下一行的行首的位置。

3.   轉義字符“\r”,“\n”。

  

  在C中定義了一些字母前加"\"來表示常見的那些不能顯示的ASCII字符,如\0,\t,\n等,因為后面的字符,都不是它本來的ASCII字符意思了就稱為轉義字符,。Java是在的底層用c 和c++寫的,Java中也有轉義字符這一說。

詳情看ASCII碼表https://baike.baidu.com/pic/ASCII/309296/0/c2fdfc039245d688c56332adacc27d1ed21b2451?fr=lemma&ct=single#aid=0&pic=c2fdfc039245d688c56332adacc27d1ed21b2451

看表頭 有控制碼 和打印碼 的區分

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] 。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM