29. Java IO: DataInputStream

想要查看此教程的目錄請點(diǎn)擊:Java IO教程目錄貼地址


DataInputStream可以讓你從InputStream讀取Java基本類型來代替原始的字節(jié)。用DataInputStream來包裝InputStream,你就可以從DataInputStream直接以Java基本類型來讀取數(shù)據(jù)。這就是為什么叫做DataInputStream。

如果你需要讀取的數(shù)據(jù)是由大于一個字節(jié)的java基礎(chǔ)類型構(gòu)成,比如int, long, float, double等,那么用DataInputStream是很方便的。DataInputStream希望的數(shù)據(jù)是寫入到網(wǎng)絡(luò)的有序多字節(jié)數(shù)據(jù)。
你經(jīng)常會使用一個DataInputStream去讀DataOutputStream寫好的數(shù)據(jù)。

DataInputStream例子

下面是一個DataInputStream的例子:

DataInputStream dataInputStream = new DataInputStream(
                            new FileInputStream("binary.data"));

int    aByte   = input.read();
int    anInt   = input.readInt();
float  aFloat  = input.readFloat();
double aDouble = input.readDouble();
//etc.

input.close();

例子中首先創(chuàng)建了一個DataInputStream實(shí)例并發(fā)數(shù)據(jù)源FileInputStream實(shí)例傳進(jìn)去。然后Java基本類型就可以讀出來了。

使用DataInputStream時同時使用DataOutputStream

就像上面提及的,DataInputStream和DataOutputStream經(jīng)常同時被使用。因此我只是想給你展示一個例子,先用DataOutputStream來寫數(shù)據(jù)然后再用DataInputStream來讀數(shù)據(jù)。下面是相關(guān)的Java代碼:

import java.io.*;


public class DataInputStreamExample {

    public static void main(String[] args) throws IOException {
        DataOutputStream dataOutputStream =
                new DataOutputStream(
                        new FileOutputStream("data/data.bin"));

        dataOutputStream.writeInt(123);
        dataOutputStream.writeFloat(123.45F);
        dataOutputStream.writeLong(789);

        dataOutputStream.close();

        DataInputStream dataInputStream =
                new DataInputStream(
                        new FileInputStream("data/data.bin"));

        int   int123     = dataInputStream.readInt();
        float float12345 = dataInputStream.readFloat();
        long  long789    = dataInputStream.readLong();

        dataInputStream.close();

        System.out.println("int123     = " + int123);
        System.out.println("float12345 = " + float12345);
        System.out.println("long789    = " + long789);
    }
}

這個例子首先創(chuàng)建了一個DataOutputStream,寫int,float和long值。然后創(chuàng)建DataInputStream實(shí)例去同一個文件讀int, float和long值。
reads the int, float and long value in from the same file.

關(guān)閉DataInputStream

讀取完數(shù)據(jù)的時候,你要記住去關(guān)閉它。關(guān)閉DataInputStream也會關(guān)閉它讀的InputStream。這些需要調(diào)用close()方法:

dataInputStream.close();

你也可以在Java7中使用try-with-resources結(jié)構(gòu)。下面是介紹如何使用try-with-resources結(jié)構(gòu)來關(guān)閉流:

InputStream input = new FileInputStream("data/data.bin");

try(DataInputStream dataInputStream =
    new DataInputStream(input)){

    int data = dataInputStream.readInt();

    int   int123     = dataInputStream.readInt();
    float float12345 = dataInputStream.readFloat();
    long  long789    = dataInputStream.readLong();
}

注意這并沒有任何顯式的調(diào)用close()方法。
也要注意創(chuàng)建FileInputStream示例并沒有放在try-with-resources代碼塊里。這意味著try-with-resources并不會自動關(guān)閉FileInputStream。然而,當(dāng)DataInputStream被關(guān)閉后它也會關(guān)閉它讀的InputStream,所以FileInputStream也會在DataInputStream關(guān)閉后被關(guān)閉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容