天天看點

java 輸出語句與“\r”那些事兒

private static final String fileName = "D:/測試/1.txt";
    public static void main(String[] args){
        File file = new File(fileName);
        try {
            InputStream inputStream = new FileInputStream(file);
            int count = inputStream.available();
            byte[] b = new byte[count];
            inputStream.read(b);
            String a = new String(b);
            int n = a.length();
            System.out.println(n);
            for (int i =0;i<n;i++){
                if (a.charAt(i)=='\r'){
                    System.out.print("\\r");
                    continue;
                }
                if (a.charAt(i)=='\n'){
                    System.out.print("\\n");
                    continue;
                }
                System.out.print(a.charAt(i));
            }
            System.out.println();
            System.out.println(a.replaceAll("\r\n",""));
            System.out.println(a.replaceAll("\n",""));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }      

這段代碼實作的是從檔案中讀取資料,然後去掉中間的空。

java 輸出語句與“\r”那些事兒

執行的結果為:

java 輸出語句與“\r”那些事兒

問題:為啥替換了’\n’,結果隻有一個666。下面我來分析一下:

123\r\n456\r\n789\r\n111\r\n222\r\n333\r\n444\r\n555\r\n666  
# '\n'->''
# 按道理結果應該是這樣的,但是,如果是在列印的情況下,這些特殊字元是會起作用的,
# 而\r的作用就是到目前行的行首,會把這一行以前的輸出 覆寫掉 ,也就是說\r前面的
# 都會被覆寫掉。是以最後的結果隻有 666.
# 而 BufferedReader不存在這個問題,是因為其在實作的時候已經過濾了\r。,
123\r456\r789\r111\r222\r333\r444\r555\r666      

那我們把被"“替換”\n"替換掉的字元串循環列印出來:

java 輸出語句與“\r”那些事兒

可以發現跟我們預想的結果是一樣的。是以,可以知道,這就是列印的鍋了。在知道這樣的結論之後,我們可以做出以下實驗:

public static void main(String[] args) {
        String a = "12345678912345678912345678912345789";
        String b = a.replaceAll("5","\r");
        System.out.println(b);
    }      
java 輸出語句與“\r”那些事兒