Java- File、輸入輸出流詳解

一.文件創(chuàng)建

File:文件和目錄路徑名的抽象表示形式,代表文件或者文件夾

   //創(chuàng)建文件 完整路徑
    String path = "E:\\Java89\\app\\src\\main\\java\\java08151";

    //path\\1.txt 文件路徑以及文件名
    File file = new File(path.concat("\\1.txt"));

    //判斷文件是否存在
    if (file.exists() == false){
        //不存在 就創(chuàng)建
        file.createNewFile();
    }

這時候我們會發(fā)現(xiàn)createNewFile報(bào)錯,java.io,IOException

我們用throws關(guān)鍵字聲明拋出異常,調(diào)用者對其進(jìn)行處理

即在main函數(shù)末尾添加throws IOException,如下

public static void main(String[] args) throws IOException{

}

這時候我們運(yùn)行一下就會發(fā)現(xiàn)文件創(chuàng)建完成了

08151.png

二.輸入輸出流詳解

1.Java流的分類

按流向分:
輸入流:程序可以從中讀取數(shù)據(jù)的流。
輸出流:程序能向其中寫入數(shù)據(jù)的流。
按數(shù)據(jù)傳輸單位分:
字節(jié)流:以字節(jié)為單位傳輸數(shù)據(jù)的流。
字符流:以字符為單位傳輸數(shù)據(jù)的流。
按功能分:
節(jié)點(diǎn)流:用于直接操作目標(biāo)設(shè)備的流
過濾流:是對一個已存在的流的鏈接和封裝,通過數(shù)據(jù)進(jìn)行處理為程序提供功能強(qiáng)大/靈活的讀寫功能。

2.Java.io 常用類

JDK所提供的所有流類位于java.io包中,都分別繼承自以下四種抽象流類:
InputStream:繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位都是字節(jié)(8位)。
OutputStream:繼承自O(shè)utputStream的流都是程序用于向外輸出數(shù)據(jù)的,且數(shù)據(jù)單位都是字節(jié)(8位)。
Reader:繼承自Reader的流否是用于向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位都是字符(16位)。
Writer:繼承自Writer的流都是程序用于向外輸出數(shù)據(jù)的,且數(shù)據(jù)單位都是字符(16位)。

是一個很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時候,就會開啟一個通向數(shù)據(jù)源的流,這個數(shù)據(jù)源可以是文件,內(nèi)存,或者是網(wǎng)絡(luò)連接。類似的,當(dāng)程序需要寫入數(shù)據(jù)的時候,就會開啟一個通向目的地的流。這個時候你就可以想象數(shù)據(jù)好像在這其中“流”動一樣。如下圖

08152.jpg

Java中的流分為兩種,一種是字節(jié)流,另一種是字符流,分別由四個抽象類來表示(每種流包括輸入和輸出兩種所以一共個四個):InputStream,OutputStream,Reader,Writer。Java中其他多種多樣變化的流均是由它們派生出來的;

stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或者是任何有能力接收數(shù)據(jù)的接收源。在java的io中,所有的stream都包括兩種類型:
(1)字節(jié)流
表示以字節(jié)為單位從stream中讀取或往stream中寫入信息
(2)字符流

1.流的層次結(jié)構(gòu)

定義:
(1).java將讀取數(shù)據(jù)對象成為輸入流,能向其寫入的對象叫輸出流。結(jié)構(gòu)圖如下:
輸入流


08153.jpg

輸出流


08154.jpg
2.InputStream類

inputstream類和outputstream類都為抽象類,不能創(chuàng)建對象,可以通過子類來實(shí)例化。
IputStream是輸入字節(jié)數(shù)據(jù)用的類,所以InputStream類提供了3種重載read方法。InputStream類中的常用方法:
(1)public abstract int read(); 讀取一個byte的數(shù)據(jù),返回值是高位補(bǔ)0的int類型值。
(2)public int read(byte b[ ] );讀取b.length個字節(jié)的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。該方法實(shí)際上是調(diào)用下一個方法實(shí)現(xiàn)的
(3)public int read(byte b[ ],int off,int len);從輸入流中最多讀取len個字節(jié)的數(shù)據(jù),存放到偏移量位off的b數(shù)組中。
(4)public int availabe();返回輸入流中可以讀取的字節(jié)數(shù)。注意:如果InputStream對象調(diào)用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調(diào)用才有用。
(5)public int close();我們在使用完后,必須對我們打開的流進(jìn)行關(guān)閉。

3.OutputStream類

OutputStream提供了3個write方法來做數(shù)據(jù)的輸出,這個是和InputStream是相對應(yīng)的。
(1).public void write(byte b[ ]);將參數(shù)b中的字節(jié)寫到輸出流。
(2).public void write(byte b[ ],int off,int len);將參數(shù)b的從偏移量off開始的len個字節(jié)寫到輸出流。
(3).public abstract void write(int b);先將Int轉(zhuǎn)換為byte類型,把低字節(jié)寫入到輸出流中。
(4).public void flush();將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū)。
(5).public void close();關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源。

注意:InputStream和OutputStream都是抽象類,不能創(chuàng)建這種類型的對象。

4.FileInputStream類

FileInputStream類是InputStream類的子類,用來處理以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流(從文件中讀取數(shù)據(jù))。使用方法:

File fin = new File("d:/abc.txt");
FileInputStream in = new FileInpuStream(fin);
5.FileOutputStream類

FileOutputStream類用來處理以文件作為數(shù)據(jù)流輸出目的的數(shù)據(jù)流(向文件中寫入數(shù)據(jù));一個表示文件名的字符串,也可以是File對象。
創(chuàng)建一個文件流對象的方法:

File f = new File("d:/abc.txt");
FileOutpuStream out = new FileOutpuStream(f);

例子1:向文件寫入數(shù)據(jù)-字節(jié)

 FileOutputStream fos = new FileOutputStream(file);


    // 2.調(diào)用write方法寫入
    byte[] text = {'1','2','3','4'};
    fos.write(text);


    // 3.操作完畢需要關(guān)閉stream
    fos.close();

運(yùn)行后,會看到創(chuàng)建的文件里由1234四個數(shù)字

例子2:向文件寫入數(shù)據(jù) - 字符流

   FileWriter fw = new FileWriter(file);


    char[] name = {'安','卓','開','發(fā)'};
    fw.write(name);

    fw.close();

運(yùn)行后發(fā)現(xiàn)創(chuàng)建的文件里1234已經(jīng)不見了 變成安卓開發(fā)四個字

注意:
(1)文件中寫數(shù)據(jù)時,若文件已經(jīng)存在,則覆蓋存在的文件;
(2)讀/寫操作結(jié)束時,應(yīng)調(diào)用close方法關(guān)閉流。

5.BufferedInputStream和BufferedOutputStream

BufferedInputStream和BufferedOutputStream為InputStream和OutputStream增加了內(nèi)存緩沖區(qū),根本目的是允許java的IO流一次操作多個字節(jié),從而提高系統(tǒng)的性能。

BufferedInputStream
功能:用這個類來解決“每次都要用數(shù)據(jù)的時候都要進(jìn)行物理讀取”的問題,也就是說用“緩沖區(qū)”
用法:它本身并不提供接口,只是提供一個緩沖區(qū)。需要連到一個“有接口的對象(interfaceobject)”

BufferedOutputStream
功能:用這個類解決“每次往流里寫數(shù)據(jù),都要進(jìn)行物理操作”的問題。也就是說“用緩沖區(qū)”。用flush()清空緩沖區(qū)。
用法:本身并不提供接口,只是加了一個緩沖區(qū)。需要連接一個有接口的對象。

BufferedInputStream定義了兩種構(gòu)造函數(shù)
(1)BufferedInputStream b = new BufferedInputStream(in);
(2)BufferedInputStream b = new BufferedInputStream(in,size);//指定大小

BufferedOutputStream中的flush方法可以強(qiáng)制輸出緩沖區(qū)的數(shù)據(jù)

6.對象序列化和反序列化

把java對象轉(zhuǎn)換成字節(jié)序列的過程成為對象序列化
把字節(jié)序列恢復(fù)到j(luò)ava對象的過程叫做對象的反序列化

序列化類的對象要求實(shí)現(xiàn)java.io.Serializable;

public ObjectInputStream (inputStream in)構(gòu)造方法 構(gòu)造輸入對象
final object readObject ()方法 從指定位置讀取對象

public ObjectOutputStream(inputStream in)構(gòu)造方法 構(gòu)造輸出對象
final void writeObejct() 方法 輸出對象的指定位置

對象序列化:對象轉(zhuǎn)換成字節(jié)

定義一個Person類

public class Person implements Serializable {
    String name;
    int age;
}

在MyClass類里向文件存一個對象

    Person xw = new Person();
    xw.name = "小王";
    xw.age = 20;

    OutputStream os = new FileOutputStream(file);
    ObjectOutputStream oos = new ObjectOutputStream(os);

    oos.writeObject(xw);
    oos.close();

對象反序列化:自己轉(zhuǎn)換成對象(從文件讀取一個對象)

    InputStream is = new FileInputStream(file);
    ObjectInputStream ois = new ObjectInputStream(is);
    Person xw = (Person)ois.readObject();

    System.out.println(xw.name+" "+xw.age);

    ois.close();

輸出結(jié)果

小王 20
7.將一個文件copy到另外一個位置
    //1.源文件的路徑
    String sourcePath = "C:\\Users\\hp\\Desktop\\1.jpg";
    //2.目標(biāo)文件的路徑
    String desPath = "E:\\Java89\\app\\src\\main\\java\\java08151\\2.jpg";
    //3.圖片 字節(jié)
    FileInputStream fis = new FileInputStream(sourcePath);
    FileOutputStream fos = new FileOutputStream(desPath);

    byte[] in = new byte[1024];

    int count = 0;
    while ((count = fis.read(in)) != -1){
        fos.write(in,0,count);
    }

運(yùn)行后會發(fā)現(xiàn)


08155.png

圖片成功復(fù)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容