Java™ 教程(數據流)

數據流

數據流支持原始數據類型值(booleancharbyteshortintlongfloatdouble)以及String值的二進制I/O,全部數據流都實現DataInput接口或DataOutput接口,本節重點介紹這些接口最普遍使用的實現,DataInputStreamDataOutputStreamhtml

DataStreams示例經過寫出一組數據記錄,而後再次讀取它們來演示數據流,每條記錄包含三個與發票上的條目相關的值,以下表所示:java

訂單記錄 數據類型 數據描述 輸出方法 輸入方法 樣例值
1 double 條目價格 DataOutputStream.writeDouble DataInputStream.readDouble 19.99
2 int 單位數 DataOutputStream.writeInt DataInputStream.readInt 12
3 String 條目描述 DataOutputStream.writeUTF DataInputStream.readUTF "Java T-Shirt"

咱們來看看DataStreams中的關鍵代碼,首先,程序定義了一些常量,包含數據文件的名稱和將寫入的數據:git

static final String dataFile = "invoicedata";

static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
static final int[] units = { 12, 8, 13, 29, 50 };
static final String[] descs = {
    "Java T-shirt",
    "Java Mug",
    "Duke Juggling Dolls",
    "Java Pin",
    "Java Key Chain"
};

而後DataStreams打開輸出流,因爲DataOutputStream只能做爲現有字節流對象的包裝器建立,所以DataStreams提供緩衝文件輸出字節流。程序員

out = new DataOutputStream(new BufferedOutputStream(
              new FileOutputStream(dataFile)));

DataStreams寫出記錄並關閉輸出流。github

for (int i = 0; i < prices.length; i ++) {
    out.writeDouble(prices[i]);
    out.writeInt(units[i]);
    out.writeUTF(descs[i]);
}

writeUTF方法以UTF-8的修改形式寫出String值,這是一種可變寬度的字符編碼,普通的西方字符只須要一個字節。編程

如今DataStreams再次讀回數據,首先,它必須提供輸入流和變量來保存輸入數據,與DataOutputStream同樣,DataInputStream必須構造爲字節流的包裝器。segmentfault

in = new DataInputStream(new
            BufferedInputStream(new FileInputStream(dataFile)));

double price;
int unit;
String desc;
double total = 0.0;

如今,DataStreams能夠讀取流中的每條記錄,報告它遇到的數據。api

try {
    while (true) {
        price = in.readDouble();
        unit = in.readInt();
        desc = in.readUTF();
        System.out.format("You ordered %d" + " units of %s at $%.2f%n",
            unit, desc, price);
        total += unit * price;
    }
} catch (EOFException e) {
}

請注意,DataStreams經過捕獲EOFException來檢測文件結束條件,而不是測試無效的返回值,DataInput方法的全部實現都使用EOFException而不是返回值。oracle

另請注意,DataStream中的每一個專用write都與相應的專用read徹底匹配,程序員應該確保以這種方式匹配輸出類型和輸入類型:輸入流由簡單的二進制數據組成,沒有指示單個值的類型或它們在流中開始的位置。測試

DataStreams使用一種很是糟糕的編程技術:它使用浮點數來表示貨幣值,一般,浮點對於精確值是不利的,對於小數部分尤爲很差,由於常見值(例如0.1)沒有二進制表示。

用於貨幣值的正確類型是java.math.BigDecimal,不幸的是,BigDecimal是一種對象類型,所以它不適用於數據流,可是,BigDecimal將使用對象流,這將在下一節中介紹。


上一篇:命令行I/O

下一篇:對象流

相關文章
相關標籤/搜索