java I/O———字節流與字符流—字節輸出流(OutputStream)

  • File類不支持文件內容處理,如果要處理文件內容,必須要通過流的操作模式來完成。流分爲輸入流和輸出流。
  • 在java.io包中,流分爲兩種:字節流與字符流
  1. 字節流:InputStream、OutputStream
  2. 字符流:Reader、Writer

在這裏插入圖片描述

在這裏插入圖片描述

字節流與字符流操作的本質區別只有一個:字節流是原生的操作,而字符流是經過處理後的操作

在進行網絡數據傳輸、磁盤數據保存所保存所支持的數據類型只有:字節。
而所有磁盤中的數據必須先讀取到內存後才能進行操作,而內存中會幫助我們把字節變爲字符。字符更加適合處理中文。

不管使用的是字節流還是字符流,其基本的操作流程幾乎是一樣的,以文件操作爲例。

  1. 根據文件路徑創建File類對象 ;
  2. 根據字節流或字符流的子類實例化父類對象 ;
  3. 進行數據的讀取或寫入操作
  4. 關閉流(close())。

對於IO操作屬於資源處理,所有的資源處理操作(IO操作、數據庫操作、網絡)最後必須要進行關閉。

字節輸出流(OutputStream)

如果要想通過程序進行內容輸出,則可以使用java.io.OutputStream。

來觀察OutputStream類的定義結構:

public abstract class OutputStream implements Closeable, Flushable

OutputStream類實現了Closeable,Flushable兩個接口,這兩個接口中的方法:

  1. Closeable: public void close() throws IOException;
  2. Flushable: public void flush() throws IOException;

在OutputStream類中還定義有其他方法:

  1. 將給定的字節數組內容全部輸出:public void write(byte b[]) throws IOException
  2. 將部分字節數組內容輸出:public void write(byte b[], int off, int len) throws IOException
  3. 輸出單個字節:public abstract void write(int b) throws IOException;

由於OutputStream是一個抽象類,所以要想爲父類實例化,就必須要使用子類。由於方法名稱都由父類聲明好了,所以我們在此處只需要關係子類的構造方法。如果要進行文件的操作,可以使FileOutputStream類來處理,這個類的構造方法如下:

  1. 接收File類(覆蓋):public FileOutputStream(File file) throws FileNotFoundException
  2. 接收File類(追加):public FileOutputStream(File file, boolean append)

範例:實現文件的內容輸出

package www.bit.java.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestIO {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
            if (!file.getParentFile().exists()) { // 必須保證父目錄存在
            file.getParentFile().mkdirs() ; // 創建多級父目錄
            }
            // OutputStream是一個抽象類,所以需要通過子類進行實例化,此時只能操    作File類
            OutputStream output = new FileOutputStream(file) ;
            // 要求輸出到文件的內容
            String msg = "I'm bad man" ;
            // 將內容變爲字節數組
            output.write(msg.getBytes());
            // 關閉輸出
            output.close();
    }
}

在進行文件輸出的時候,所有的文件會自動幫助用戶創建,不在需要調用createFile()方法手工創建。
這個時候程序如果重複執行,並不會出現內容追加的情況而是一直在覆蓋。如果需要文件內容追加,則需要調用FileOutputStream提供的另外一種構造方法。

範例:文件內容追加

package www.bit.java.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestIO {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
            if (!file.getParentFile().exists()) { // 必須保證父目錄存在
            file.getParentFile().mkdirs() ; // 創建多級父目錄
            }
            // OutputStream是一個抽象類,所以需要通過子類進行實例化,此時只能操    作File類
            OutputStream output = new FileOutputStream(file,true) ;//**
            // 要求輸出到文件的內容
            String msg = "I'm bad man\n" ;//**
            // 將內容變爲字節數組
            output.write(msg.getBytes());
            // 關閉輸出
            output.close();
    }
}

範例:部分內容輸出

package www.bit.java.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestIO {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
            if (!file.getParentFile().exists()) { // 必須保證父目錄存在
            file.getParentFile().mkdirs() ; // 創建多級父目錄
            }
            // OutputStream是一個抽象類,所以需要通過子類進行實例化,此時只能操    作File類
            OutputStream output = new FileOutputStream(file,true) ;//**
            // 要求輸出到文件的內容
            String msg = "I'm bad man\n" ;//**
            // 將內容變爲字節數組
           output.write(msg.getBytes(),0,5);//*****
            // 關閉輸出
            output.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章