一、字節輸出流
java.io.OutputStream 抽象類是表示字節輸出流的所有類的超類,將指定的字節信息寫出到目的地。
該類中定義了字節輸出流的基本共性功能方法。
公性方法:
public void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
public void flush() :刷新此輸出流並強制任何緩沖的輸出字節被寫出,調用此方法指示應將這些字節立即寫入它們預期的目標。
public void write(int b):將指定的字節寫入此輸出流。write 的常規協定是:向輸出流寫入一個字節。要寫入的字節是參數 b 的八個低位。b 的 24 個高位將被忽略。 即寫入0~255范圍
public void write(byte[] b) :將 b.length字節從指定的字節數組寫入此輸出流。
public void write(byte[] b, int off, int len) :從指定的字節數組寫入 len字節,從偏移量 off開始輸出到此輸出流。
注意:close 方法,當完成流的操作時,必須調用此方法,釋放系統資源。
擴展:
節點流:節點流可以從一個特定的數據源(節點)讀寫數據(如:文件,內存)
處理流:處理流是“連接在已存在的流(節點流或者處理流)之上,通過對數據的處理為程序提供更為強大的讀寫功能。

java.io.OutputStream 該為作為一個抽象類,下面有很多的子類。

圖中深色的為節點流,淺色的為處理流。
二、FileOutputStream 類
java.io.FileOutputStream 類是文件輸出流,用於將數據寫出到文件,是 OutputStream 最簡單的一個子類。
1、構造方法
FileOutputStream(String name)創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
FileOutputStream(File file) 創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
參數:寫入數據的目的地。
String name:目的地是一個文件的路徑。
File file:目的地是一個文件。
構造方法的作用:
① 創建一個 FileOutputStream 對象
② 會根據構造方法中傳遞的文件/文件路徑,創建一個空的文件
③ 會把 FileOutputStream 對象指向創建好的文件
寫入數據的原理:
java程序-->JVM(java虛擬機)-->OS(操作系統)-->OS調用寫數據的方法-->把數據寫入到文件中
字節輸出流的使用步驟【重要】:
① 創建一個FileOutputStream對象,構造方法中傳遞寫入數據的目的地
② 調用FileOutputStream對象中的方法write,把數據寫入到文件中
③ 釋放資源(流使用會占用一定的內存,使用完畢要把內存清空,提供程序的效率)
2、寫出字節數據
(1)寫出字節:使用write(int b) 方法,每次可以寫出一個字節數據,代碼使用演示:
1 public static void main(String[] args) throws IOException { 2 //1.創建一個FileOutputStream對象,構造方法中傳遞寫入數據的目的地
3 FileOutputStream fos = new FileOutputStream("E:\\a.txt"); 4 //2.調用FileOutputStream對象中的方法write,把數據寫入到文件中 5 //public abstract void write(int b) :將指定的字節輸出流。
6 fos.write(97); 7 //3.釋放資源(流使用會占用一定的內存,使用完畢要把內存清空,提供程序的效率) 8 //fos.close();
9 }
原理:

(2)寫出字節數組:使用write(byte[] b) ,每次可以寫出數組中的數據,代碼使用演示:
1 public static void main(String[] args) throws IOException { 2 //創建FileOutputStream對象,構造方法中綁定要寫入數據的目的地
3 FileOutputStream fos = new FileOutputStream(new File("E:\\b.txt")); 4 //調用FileOutputStream對象中的方法write,把數據寫入到文件
5
6 /*
7 public void write(byte[] b):將 b.length字節從指定的字節數組寫入此輸出流。 8 一次寫多個字節: 9 如果寫的第一個字節是正數(0-127),那么顯示的時候會查詢ASCII表 10 如果寫的第一個字節是負數,那第一個字節會和第二個字節,兩個字節組成一個中文顯示,查詢系統默認碼表(GBK) 11 */
12 byte[] bytes = {65,66,67,68,69};//ABCDE 13 //byte[] bytes = {-65,-66,-67,68,69};//烤紻E
14 fos.write(bytes); 15
16 /*
17 寫入字符的方法:可以使用String類中的方法把字符串,轉換為字節數組 18 byte[] getBytes() 把字符串轉換為字節數組 19 */
20 byte[] bytes2 = "你好".getBytes(); 21 System.out.println(Arrays.toString(bytes2));//[-28, -67, -96, -27, -91, -67]
22 fos.write(bytes2); 23
24 //釋放資源
25 fos.close(); 26 }
(3)寫出指定長度字節數組:write(byte[] b, int off, int len) ,每次寫出從off索引開始,len個字節,代碼使用演示:
1 public static void main(String[] args) throws IOException { 2 //創建FileOutputStream對象,構造方法中綁定要寫入數據的目的地
3 FileOutputStream fos = new FileOutputStream(new File("09_IOAndProperties\\b.txt")); 4
5 /*
6 public void write(byte[] b, int off, int len) :把字節數組的一部分寫入到文件中 7 int off:數組的開始索引 8 int len:寫幾個字節 9 */
10 byte[] bytes = {65,66,67,68,69};//ABCDE
11 fos.write(bytes,1,2); //BC 12
13 //釋放資源
14 fos.close(); 15 }
3、數據追加續寫
追加寫/續寫:使用兩個參數的構造方法
FileOutputStream(String name, boolean append)創建一個向具有指定 name 的文件中寫入數據的輸出文件流。
FileOutputStream(File file, boolean append) 創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
參數:
String name,File file:表示寫入數據的目的地。
boolean append :是否開啟追加
true:創建對象不會覆蓋源文件,繼續在文件的末尾追加寫數據
false:創建一個新文件,覆蓋源文件
Demo:
1 public static void main(String[] args) throws IOException { 2 FileOutputStream fos = new FileOutputStream("E:\\c.txt",true); 3 for (int i = 1; i <=10 ; i++) { 4 fos.write("你好".getBytes()); 5 } 6
7 fos.close(); 8 }
4、寫出換行
可以發現寫出的內容到文件內都是在一行內顯示,沒有換行。
回車符 \r 和換行符 \n
-
-
- 回車符:回到下一行開頭(return)
- 換行符:下一行(newline)
-
寫換行:需要寫換行符號。
系統中的換行:
-
-
- Windows系統里,每行結尾是 回車+換行 ,即 \r\n ;
- Linux / Unix系統里,每行結尾只有 換行 ,即 \n ;
- Mac系統里,每行結尾是 回車 ,即 \r 。從 Mac OS X開始與Linux統一。
- Windows系統里,每行結尾是 回車+換行 ,即 \r\n ;
-
Demo :
1 public static void main(String[] args) throws IOException { 2 FileOutputStream fos = new FileOutputStream("E:\\c.txt",true); 3 for (int i = 1; i <=10 ; i++) { 4 fos.write("你好".getBytes()); 5 fos.write("\r\n".getBytes()); 6 } 7
8 fos.close(); 9 }
