數據流支持原始數據類型值(boolean
、char
、byte
、short
、int
、long
、float
和double
)以及String
值的二進制I/O,全部數據流都實現DataInput接口或DataOutput接口,本節重點介紹這些接口最普遍使用的實現,DataInputStream和DataOutputStream。html
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
將使用對象流,這將在下一節中介紹。