天天看點

java中FileInputStream和OutputStream解析

FileInputStream和FileOutputStream分别表示讀寫檔案資料流,前者是将檔案資料讀取到記憶體中,後者表示将記憶體中的資料寫入到檔案中。

1.FileInputStream

FileInputStream從檔案系統中的檔案中獲得輸入的位元組資料。主要的構造方法有以下三種:

FileInputStream(File file)

用File對象來構造

FileInputStream(String pathName)

用檔案路徑名來構造

FileInputStream(FileDescriptor fdObj)

以檔案描述符類對象來構造

主要的方法和InputStream類似,點選這裡檢視。其他方法如下所示:

FileChannel getChannel()

獲得該檔案輸入流唯一的檔案通道對象

FileDescriptor getFD()

獲得被檔案輸入流使用的檔案的檔案描述符對象

2.FileOutputStream

FileOutputStream是一個向檔案(File)中或者檔案描述符(FileDescriptor)中寫入資料的輸出流。檔案是否可用或者可建立取決于底層平台。在某些平台中,允許檔案在某一個時刻僅僅被一個檔案輸出流進行寫操作。在這種情況下,用已經被使用的檔案來構造檔案輸出流将會發生錯誤。檔案輸出流是用來寫原始位元組資料的,例如圖檔資料;如果要寫入字元資料,可以考慮使用FileWriter類。如果該檔案找不到,則會自動建立該檔案,前提是允許建立,否則将會出現檔案找不到錯誤。如果該檔案找到,但是是檔案夾而不是正常檔案,則也會發生檔案找不到錯誤,如果該檔案不允許打開,也會發生錯誤。

主要的構造方法有以下幾種:

FileOutputStream(File file)

用File對象來構造,寫檔案時,從頭開始寫

FileOutputStream(File file,boolean append)

用File對象來構造,如果第二個參數為true,則表示以追加的方式寫檔案,從尾部開始寫操作。第二個參數預設為false。

FileOutputStream(FileDescriptor fdObj)

用檔案描述符來構造

FileOutputStream(String path)

用檔案路徑名來構造,寫檔案時,從頭開始寫

FileOutputStream(String path,boolean append)

用檔案路徑名來構造,如果第二個參數為true,寫檔案時,從尾部開始寫,以追加的形式寫檔案。第二個參數預設為false。

常用的方法和OutputStream類似,請點選這裡檢視。其他方法如下所示:

FileChannel getChannel()

獲得該檔案輸入流唯一的檔案通道對象

FileDescriptor getFD()

獲得被檔案輸入流使用的檔案的檔案描述符對象

下面是某圖像讀寫操作的java代碼:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileTest {
    /*
     * 先讀取圖檔資料,然後将該圖檔寫到其他路徑中
     */
    public static void main(String[] args) throws IOException{
        String image = "G:\\test.jpg";                           //源檔案路徑
        String goalPath = "E:\\follow.jpg";                      //目标檔案路徑

        FileInputStream fis = new FileInputStream(image);        //初始化輸入流
        FileOutputStream fos = new FileOutputStream(goalPath);

        int len=fis.available();                                 //流中位元組數
        System.out.println("圖檔大小為:"+len+"個位元組");

        int ch=0;                                                //一個位元組一個位元組讀
        while((ch = fis.read()) != -1){
            fos.write(ch);                                       //一個位元組一個位元組寫
        }
    }
}           

原始檔案截圖:

java中FileInputStream和OutputStream解析

程式運作結果截圖:

java中FileInputStream和OutputStream解析

可以看出,讀取的檔案的大小和檔案屬性中檢視的是一緻的,都是9811位元組

寫入的圖檔檔案截圖:

java中FileInputStream和OutputStream解析