一.FileOutputStream寫出數據的兩個小問題:
問題一:換行
假設在本地文件中要輸出數據aweihaoshuai 666,在輸出這個數據時要換行寫出,如下圖:
問題二:續寫
假設在一個文本文件中已經存在數據aweihaoshuai,如果此時再次寫入數據如diyishuai,若不想把原來的數據清空,而是想接著寫即續寫,如下圖:(按照之前的寫法使用write方法寫出數據會把原有的數據清空再寫出數據)
二.換行:
1.換行符:
將數據寫入文本文件的過程中,要想實現換行,只需要寫出一個換行符即可(注意:不同的操作系統中換行符是不同的)。
操作系統 | 換行符 |
---|---|
Windows操作系統 | \r\n,叫做"回車換行"(\r為回車,\n為換行) |
Linux操作系統 | \n,叫做"換行"(\n為換行) |
Mac操作系統(蘋果操作系統) | \r,叫做"回車"(\r為回車) |
對于Windows操作系統,以下圖為例:
Windows操作系統的換行符是\r\n,叫做"回車換行"(\r為回車,\n為換行),下面介紹該換行符的來源:在早期的cmd中存在一個規則,比如在上述圖片的第25行打字,如果要在第26行開始打字,就需要兩步操作,第一步首先要在當前行即第25行回車,以前的回車與現有的回車不一樣,回車在早期的系統中是把光標放到這一行的開頭即放到第25行的第一個字符o前,換行才是真正的把光標移動到下一行即第26行,所以要想實現把光標從第25行的最后一個字符w的后面移動到第27行,就需要先回車到第25行的第一個字符o前,再換行到第26行,Windows操作系統延續了這個操作。
細節:Windows操作系統中完整的換行符是\r\n,但Java對Windows操作系統的換行符\r\n進行了優化,就是寫其中一個\r或者\n,Java也可以實現換行,因為Java在底層會進行補全->建議:不要省略,還是寫全了比較好。
2.代碼演示:
a.創建ByteStreamDemo4類與a.txt文本文件,如下圖:
b.把kankelaoyezuishuai寫出到文本文件a.txt,代碼如下:
package com.itheima.mybytestream;
?
import java.io.FileOutputStream;
import java.io.IOException;
?
public class ByteStreamDemo4 {public static void main(String[] args) throws IOException {//1.創建對象FileOutputStream fos=new FileOutputStream("a.txt");
?//2.寫出數據/*需求:現在要把kankelaoyezuishuai寫出到文本文件a.txt,其中需要用到write方法,* 但是在寫的過程中該如何寫呢?難道要一次一次地調用write方法傳入要寫出的字符的ASCII碼嗎,* 顯然比較繁瑣,因為要寫入的數據可能會很長,因此要使用其他方法,解決方案如下: *///2.1.創建一個字符串->字符串就是要寫出的內容String str="kankelaoyezuishuai";//2.2.str調用空參的getBytes方法:getBytes方法可以把str變成字節數組(字節數組存放的就是對應字符的ASCII碼),有了字節數組就可以用write方法一起寫到文件中byte[] arr = str.getBytes(); //getBytes方法的返回值是byte[]//2.3.寫出數據fos.write(arr);
?//3.釋放資源fos.close();}
}
?
運行結果:
c.在a.txt文件原有數據的基礎上,換行寫出數據666
package com.itheima.mybytestream;
?
import java.io.FileOutputStream;
import java.io.IOException;
?
public class ByteStreamDemo4 {public static void main(String[] args) throws IOException {//1.創建對象FileOutputStream fos=new FileOutputStream("a.txt");
?//2.寫出數據String str1="kankelaoyezuishuai";byte[] bytes1 = str1.getBytes();fos.write(bytes1);String str2="666";byte[] bytes2 = str2.getBytes();fos.write(bytes2);
?//3.釋放資源fos.close();}
}
?
運行結果:
666并沒有被換行處理,正確的寫法需要在寫出666之前寫出一個換行符,修改方案如下:
package com.itheima.mybytestream;
?
import java.io.FileOutputStream;
import java.io.IOException;
?
public class ByteStreamDemo4 {public static void main(String[] args) throws IOException {//1.創建對象FileOutputStream fos=new FileOutputStream("a.txt");
?//2.寫出數據String str1="kankelaoyezuishuai";byte[] bytes1 = str1.getBytes();fos.write(bytes1);
?/*再次寫出一個換行符即可,注意:不同的操作系統中換行符是不同的*/String wrap="\r\n"; //定義一個字符串記錄換行符(此時是Windows操作系統,換行符是\r\n)byte[] bytes2 = wrap.getBytes(); //獲取wrap即換行符的ASCII碼并放到數組中fos.write(bytes2); //此時就相當于做了一個換行操作
?String str2="666";byte[] bytes3 = str2.getBytes();fos.write(bytes3);
?//3.釋放資源fos.close();}
}
?
運行結果:
三.續寫:
1.續寫開關:
在創建FileOutputStream對象時,FileOutputStream方法有一個包含兩個形參的構造方法->第一個形參是文件,第二個形參是續寫開關,如下圖:
如下圖,首先看FileOutputStream類里最簡單的FileOutputStream構造方法:
如上圖,該構造方法的形參是字符串name,這個構造方法的底層會把字符串name(name不為空時)表示的路徑先變成File對象,第二個參數的默認值是false->所以就是把路徑還有false傳遞給另外一個FileOutputStream構造方法,如下圖:
上述圖片的FileOutputStream構造方法才是真正的核心代碼,該構造方法有兩個形參,第一個形參是文件路徑,第二個形參是續寫開關,
對于第二個形參,如果傳遞false(默認傳遞false),意味著關閉續寫,所以在創建對象時會把文件進行清空,清空了才保證不是續寫的,
如果手動傳遞true,就表示打開續寫,續寫功能一旦打開,文件內容就不會被清空了,就會接著原來的數據寫入數據。
總結:如果想要續寫,打開續寫開關即可,開關位置即創建FileOutputStream對象的第二個形參,第二個形參默認是false,表示關閉續寫,此時創建對象會清空文件,第二個形參如果手動傳遞true,表示打開續寫,此時創建對象不會清空文件。
2.代碼演示:
未續寫前:
如上圖,此時第9行的FileOutputStream方法只傳遞了一個參數,意味著默認關閉續寫,在a.txt文件中此時已經有兩行數據了,現在要在這兩行數據不被清空的基礎上續寫數據,解決方案如下:只需要打開續寫即可->FileOutputStream方法的第二個形參手動傳入true
package com.itheima.mybytestream;
?
import java.io.FileOutputStream;
import java.io.IOException;
?
public class ByteStreamDemo4 {public static void main(String[] args) throws IOException {//1.創建對象FileOutputStream fos=new FileOutputStream("a.txt",true); //第二個參數傳入true,表示打開續寫
?//2.寫出數據String str1="kankelaoyezuishuai";byte[] bytes1 = str1.getBytes();fos.write(bytes1);
?/*再次寫出一個換行符即可,注意:不同的操作系統中換行符是不同的*/String wrap="\r\n"; //定義一個字符串記錄換行符(此時是Windows操作系統,換行符是\r\n)byte[] bytes2 = wrap.getBytes(); //獲取wrap即換行符的ASCII碼并放到數組中fos.write(bytes2); //此時就相當于做了一個換行操作
?String str2="666";byte[] bytes3 = str2.getBytes();fos.write(bytes3);
?//3.釋放資源fos.close();}
}
?
運行結果: