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