數據流
數據流支持原始數據類型值(boolean、char、byte、short、int、long、float和double)以及String值的二進制I/O,所有數據流都實現DataInput接口或DataOutput接口,本節重點介紹這些接口最廣泛使用的實現,DataInputStream和DataOutputStream。
DataStreams示例通過寫出一組數據記錄,然后再次讀取它們來演示數據流,每條記錄包含三個與發票上的條目相關的值,如下表所示:
訂單記錄 | 數據類型 | 數據描述 | 輸出方法 | 輸入方法 | 樣例值 |
---|---|---|---|---|---|
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中的關鍵代碼,首先,程序定義了一些常量,包含數據文件的名稱和將寫入的數據:
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寫出記錄并關閉輸出流。
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必須構造為字節流的包裝器。
in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile))); double price; int unit; String desc; double total = 0.0;
現在,DataStreams可以讀取流中的每條記錄,報告它遇到的數據。
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而不是返回值。
另請注意,DataStream中的每個專用write都與相應的專用read完全匹配,程序員應該確保以這種方式匹配輸出類型和輸入類型:輸入流由簡單的二進制數據組成,沒有指示單個值的類型或它們在流中開始的位置。
DataStreams使用一種非常糟糕的編程技術:它使用浮點數來表示貨幣值,通常,浮點對于精確值是不利的,對于小數部分尤其不好,因為常見值(例如0.1)沒有二進制表示。
用于貨幣值的正確類型是java.math.BigDecimal,不幸的是,BigDecimal是一種對象類型,因此它不適用于數據流,但是,BigDecimal將使用對象流,這將在下一節中介紹。
上一篇:命令行I/O 下一篇:對象流文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72961.html
摘要:資源獲取方式根據下面的索引,大家可以選擇自己需要的資源,然后在松哥公眾號牧碼小子后臺回復對應的口令,就可以獲取到資源的百度云盤下載地址。公眾號二維碼如下另外本文會定期更新,松哥有新資源的時候會及時分享給大家,歡迎各位小伙伴保持關注。 沒有一條路是容易的,特別是轉行計算機這條路。 松哥接觸過很多轉行做開發的小伙伴,我了解到很多轉行人的不容易,記得松哥大二時剛剛決定轉行計算機,完全不知道這...
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續版本中引入的改進。 Java教程是希望使用Java編程語言創建應用程序的程序員的實用指南,其中包括數百個完整的工作示例和數十個課程,相關課程組被組織成教程。 覆蓋基礎知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術和安裝Java開發軟件并使用...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
閱讀 1140·2023-04-26 02:46
閱讀 636·2023-04-25 19:38
閱讀 651·2021-10-14 09:42
閱讀 1249·2021-09-08 09:36
閱讀 1367·2019-08-30 15:44
閱讀 1332·2019-08-29 17:23
閱讀 2252·2019-08-29 15:27
閱讀 815·2019-08-29 14:15