版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、6.1 I/O流 一個好的程序語言,完善的輸入輸出功能是必不可少的。 在Java中將不同來源和目標(biāo)的數(shù)據(jù)統(tǒng)一抽象為流,通過對流對象的操作來完成I/O功能。 Java中的流很靈活,可以連接到各種不同的源或目標(biāo),如磁盤文件(wnjin)、鍵盤(輸入設(shè)備)、顯示器(輸出設(shè)備)、網(wǎng)絡(luò)等。第1頁/共33頁第一頁,共34頁。6.1.1 流的層次(cngc) Java中所有的I/O都是通過流來實現(xiàn)的,可以將流理解為連接到數(shù)據(jù)目標(biāo)或源的管道,可以通過連接到源的流從源當(dāng)中讀取數(shù)據(jù),或通過連接到目標(biāo)的流向目標(biāo)中寫入數(shù)據(jù)。 根據(jù)流的方向(fngxing)可以將其分為兩類:輸入流和輸出流。用戶可以從輸入流中讀取信息,
2、向輸出流中寫信息。 根據(jù)流處理數(shù)據(jù)類型的不同也可以將其分為兩類:字節(jié)流與字符流。第2頁/共33頁第二頁,共34頁。 Java中I/O流是由包來實現(xiàn)(shxin)的,其中的類大致分為輸入和輸出兩大部分。 在包最頂層包含子類較多的兩個類是InputStream和OutputStream。這兩個類均為抽象類。包中的很多類都是從這兩個類繼承而來的.第3頁/共33頁第三頁,共34頁。6.1.2 輸入(shr)流和輸出流 前面介紹過,Java的I/O類庫分成輸入和輸出(shch)兩大部分。 所有InputStream和Reader的派生類都有一個繼承下來的,能讀取單個或byte數(shù)組的read()方法。 所
3、有OutputStream和Writer的派生類都有一個write()方法。第4頁/共33頁第四頁,共34頁。6.1.3 字節(jié)(z ji)流和字符流 根據(jù)流處理數(shù)據(jù)類型的不同也可以將其分為兩類:字節(jié)(z ji)流與字符流,下面列出了這兩種流的不同之處。字節(jié)(z ji)流:字節(jié)(z ji)流以字節(jié)(z ji)為基本單位來處理數(shù)據(jù)的輸入/輸出,一般都用于對二進(jìn)制數(shù)據(jù)的讀寫,如聲音、圖像等。 字符流:字符流以字符為基本單位來處理數(shù)據(jù)的輸入和輸出,一般都用于對文本類型數(shù)據(jù)的讀寫,如文本文件、網(wǎng)絡(luò)中發(fā)送的文本信息等。 雖然文本數(shù)據(jù)也可以看作二進(jìn)制數(shù)據(jù),但一般采用字符流處理文本數(shù)據(jù)比采用字節(jié)(z ji)流
4、效率更高,也更方便。第5頁/共33頁第五頁,共34頁。6.1.4 隨機(jī)存取文件(wnjin)流 前面介紹的都是順序訪問的流,在Java還有一種支持隨機(jī)訪問的流RandomAccessFile。這個類的實例支持同時進(jìn)行的讀/寫操作。一個隨機(jī)存取文件好比存儲在文件系統(tǒng)中的一個大“數(shù)組”。該“數(shù)組”有一個文件指針(zhzhn),輸入操作從該指針(zhzhn)所指示的地方開始讀取數(shù)據(jù),每讀一個字節(jié),指針(zhzhn)后移一個字節(jié)。如果一個隨機(jī)存取文件以讀/寫方式創(chuàng)建,也可對其進(jìn)行輸出(寫)操作。輸出操作也從文件指針(zhzhn)所指的地方寫字節(jié),并將指針(zhzhn)置于所寫字節(jié)之后。當(dāng)輸出操作超過了
5、“數(shù)組”的末尾,將導(dǎo)致文件的擴(kuò)大。文件指針(zhzhn)可用getFilePointer()方法讀取,用seek()方法設(shè)置。第6頁/共33頁第六頁,共34頁。6.2 I/O流的使用(shyng) 本節(jié)將具體介紹如何使用這些流類,包括標(biāo)準(zhǔn)的I/O輸出、基本的I/O流、過濾流、文件(wnjin)的隨機(jī)讀寫和流的分割。第7頁/共33頁第七頁,共34頁。6.2.1 標(biāo)準(zhǔn)(biozhn)的I/O流 下面首先介紹標(biāo)準(zhǔn)的I/O流的使用方法。在Java語言中,鍵盤用stdin表示,監(jiān)視器用stdout表示。它們均被封裝在System類的類變量in和out中,分別對應(yīng)(duyng)于和。事實上,類變量in和o
6、ut分別屬于類InputStream和PrintStream,只是由于InputStream和PrintStream不能用new()方法直接創(chuàng)建,所以才在System類中聲明為如下的3個類變量。 public static InputStream in public static PrintStream out public static PrintStream err第8頁/共33頁第八頁,共34頁。6.2.2 基本(jbn)的I/O流 1InputStream類 InputStream類是以字節(jié)為單位的輸入流。數(shù)據(jù)來源可以是鍵盤,也可以是諸如Internet這樣的網(wǎng)絡(luò)環(huán)境。這個類可作為許多
7、輸入類的基類。InputStream是一個抽象類,因此不能建立它的實例,用戶只能使用它的子類。注意,大多數(shù)輸入方法都拋出了IOException異常,因此如果程序(chngx)中調(diào)用了這些輸入方法,就必須捕獲和處理IOException異常。第9頁/共33頁第九頁,共34頁。6.2.2 基本(jbn)的I/O流 2OutputStream類 OutputStream是與InputStream相對應(yīng)的輸出流類,它具有輸出流的所有基本功能。由于OutputStream實現(xiàn)輸出流的許多方法與InputStream流的方法相對應(yīng),下面(xi mian)僅簡單列出與輸入流類相對應(yīng)的方法。 public
8、abstract void write(int b ) throws IOException:向流中寫入一個字節(jié)。 public void write(byte b) throws IOException:向流中寫入一個字節(jié)數(shù)組。 public void write(byte b,int off,int len) throws IOException:在從數(shù)組中的第off個位置開始的len個位置上寫入數(shù)據(jù)。 public void flush ( ) throws IOException:清空流并強(qiáng)制將緩沖區(qū)中所有數(shù)據(jù)寫入到流中。 public void close ( ) throws IO
9、Exception:關(guān)閉流對象。 第10頁/共33頁第十頁,共34頁。6.2.2 基本(jbn)的I/O流 3PipedInputStream和PipedOutputStream類 管道流用于線程之間的通信(tng xn)。一個PipedInputStream必須連接一個PipedOutputStream,而且一個PipedOutputStream也必須連接一個PipedInputStream。這兩個類用于實現(xiàn)與Unix中的管道相似的管道流。PipedInputStream實現(xiàn)管道的輸入端,而PipedOutputStream用于實現(xiàn)管道的輸出端。 PipedInputStream類從管道中讀
10、取數(shù)據(jù)時,這個管道數(shù)據(jù)是由PipedOutputStream類寫入的。因此,在使用PipedInputStream類之前,必須將它連接到PipedOutputStream類??梢栽趯嵗疨ipedInputStream類時建立這個連接,或者調(diào)用Connect()方法建立連接。PipedInputStream中包含用于讀數(shù)據(jù)的底層方法,同時也提供了讀數(shù)據(jù)的高層接口。第11頁/共33頁第十一頁,共34頁。6.2.2 基本(jbn)的I/O流4SequenceInputStream類SequenceInputStream類是InputStream類的一個子類。使用這個類可以將兩個獨立的流合并為一個邏
11、輯流。合并后的流中的數(shù)據(jù)按照在各個流中指定的順序讀出。第一個流結(jié)束時,使用無縫連接的方式開始從第二個流中讀取數(shù)據(jù)。下面(xi mian)是一個使用SequenceInputStream類的例子,代碼片段如下。 1InputStream is1 = new FileInputStream(file1.dat);2InputStream is2 = new FileInputStream(file2.dat);3SequenceInputStream sis = new SequenceInputStream(is1,is2);4 / 合并兩個流5for(;) 6 int data = ( );7
12、 if (data = = -1) break;8 第12頁/共33頁第十二頁,共34頁。6.2.3 過濾(gul)流 從前面的介紹可以知道,過濾(gul)流FilterInputStream和FilterOutputStream分別是InputStream和OutputStream的子類,而且它們也都是抽象類。FilterInputStream類和FilterOutputStream類都重寫了超類InputStream和OutputStream的方法。 FilterInputStream和FilterOutputStream為讀寫處理數(shù)據(jù)的過濾(gul)流定義接口。其子類則進(jìn)一步實現(xiàn)接口和方
13、法。這些子類有以下幾種。 DataInputStream類和DataOutputStream類 BufferedInputStream和BufferedOutputStream類 LineNumberInputStream類 PushbackInputStream類第13頁/共33頁第十三頁,共34頁。6.2.4 文件(wnjin)隨機(jī)讀寫 當(dāng)程序把一個RandomAccessFile對象與一個文件關(guān)聯(lián)時,程序從文件定位指針指定的位置開始讀寫數(shù)據(jù)(shj),并且把所有數(shù)據(jù)(shj)當(dāng)成基本數(shù)據(jù)(shj)類型來操作。 使用RandomAccessFile除了可以讀寫文件中任意位置的字節(jié)外,還可以
14、讀寫文本和Java的基本數(shù)據(jù)(shj)類型。第14頁/共33頁第十四頁,共34頁。6.2.5 流的分割(fng) 流的分割(fng)是由StreamTokenizer類實現(xiàn)的。該類把一個流的內(nèi)容劃分成若干個token單位,一次可以讀寫一個token。 StreamTokenizer類用于將任何InputStream分割(fng)為一系列“記號(Token)”。第15頁/共33頁第十五頁,共34頁。6.3 對象(duxing)的序列化 Java的對象序列化用于將一個實現(xiàn)了Serializable接口的對象轉(zhuǎn)換成一組byte,這樣以后要用這個對象時候,就能把這些byte數(shù)據(jù)恢復(fù)出來,并據(jù)此重新構(gòu)建
15、那個對象了。 這一點甚至在跨網(wǎng)絡(luò)的環(huán)境下也是如此,這就意味著序列化機(jī)制( jzh)能自動補償操作系統(tǒng)方面的差異。也就是說,可以在Windows機(jī)器上創(chuàng)建一個對象,序列化之后,再通過網(wǎng)絡(luò)傳到Unix機(jī)器上,然后在那里進(jìn)行重建,而不用擔(dān)心在不同的平臺上數(shù)據(jù)是怎樣表示的,byte順序怎樣,或者別的什么細(xì)節(jié)。第16頁/共33頁第十六頁,共34頁。6.3.1 存儲(cn ch)對象 Java序列化技術(shù)可以將一個對象的狀態(tài)寫入一個byte流里,并且可以從其他地方把該byte流里的數(shù)據(jù)讀出來,重新構(gòu)造一個相同的對象。這種機(jī)制允許將對象通過網(wǎng)絡(luò)進(jìn)行傳播,并可以隨時把對象存儲到數(shù)據(jù)庫、文件等系統(tǒng)里。Java的序
16、列化機(jī)制是RMI、EJB、JNNI等技術(shù)的技術(shù)基礎(chǔ)。 并非所有的Java類都可以序列化,為了使指定的類可以實現(xiàn)序列化,必須使該類實現(xiàn)接口。需要注意的是,該接口什么方法(fngf)也沒有。實現(xiàn)該類只是簡單的標(biāo)記該類準(zhǔn)備支持序列化功能。第17頁/共33頁第十七頁,共34頁。6.3.2 對象(duxing)的序列化 以后添加了對象序列化機(jī)制,可以把實現(xiàn)了Serializable接口的對象序列化。 Serializable接口中沒有定義任何方法,只是一個特殊的標(biāo)記,用來告訴Java 編譯器,這個對象參加了序列化的協(xié)議,可以把它序列化。 因此(ync)一個類實現(xiàn)Serializable接口時,并不需要實
17、現(xiàn)任何針對該接口的方法,第18頁/共33頁第十八頁,共34頁。6.3.3 對象序列化中的一些(yxi)問題 (1)性能問題 為了序列化類A的一個實例對象,所需保存的全部信息如下。 與此實例對象相關(guān)的全部類的元數(shù)據(jù)(metadata)信息;因為繼承關(guān)系,類A的實例對象也是其任一父類的對象。因而,需要(xyo)將整個繼承鏈上的每一個類的元數(shù)據(jù)信息,按照從父到子的順序依次保存起來。 (2)版本信息 當(dāng)用readObject()方法讀取一個序列化對象的byte流信息時,會從中得到所有相關(guān)類的描述信息以及示例對象的狀態(tài)數(shù)據(jù);然后將此描述信息與其本地要構(gòu)造的類的描述信息進(jìn)行比較,如果相同則會創(chuàng)建一個新的實
18、例并恢復(fù)其狀態(tài),否則會拋出異常。這就是序列化對象的版本檢測。第19頁/共33頁第十九頁,共34頁。6.4 文 件 管 理 前面的章節(jié)介紹了Java中的各種I/O流,在使用I/O流的過程中很多情況下源與目標(biāo)都是文件。因此,本節(jié)將介紹在Java中如何獲取目錄、文件的信息以及對目錄、文件進(jìn)行( jnxng)管理。第20頁/共33頁第二十頁,共34頁。6.4.1 File類簡介(jin ji) Java中專門提供了一個表示目錄與文件的類,通過其可以獲取(huq)文件、目錄的信息,對文件、目錄進(jìn)行管理。File類一共提供了4個構(gòu)造器,第21頁/共33頁第二十一頁,共34頁。6.4.2 使用(shyng)
19、File類 下面的例子創(chuàng)建(chungjin)MyFile文件夾,接著在MyFile文件夾下創(chuàng)建(chungjin)文件,并向文件中寫入字符串。 從本例中可以看出,通過使用包中提供的File類可以方便地對文件、目錄進(jìn)行管理。第22頁/共33頁第二十二頁,共34頁。6.5 異 常 處 理 開發(fā)核心業(yè)務(wù)代碼只占了20%30%的時間,而用于開發(fā)容錯代碼的時間卻高達(dá)70%80%,這大大降低了開發(fā)效率。Java中提供的異常處理機(jī)制,可以在一定程度上解決這個(zh ge)問題。第23頁/共33頁第二十三頁,共34頁。6.5.1 異常處理(chl)概述 Java中定義了很多異常類。每個異常類都代表了一種或多
20、種運行錯誤,異常類中包含(bohn)了該運行的錯誤信息和處理錯誤的方法等內(nèi)容。 每當(dāng)Java程序運行過程中發(fā)生一個可識別的運行錯誤時,即產(chǎn)生一個異常。 Java采取“拋出-捕獲”的方式第24頁/共33頁第二十四頁,共34頁。1、try和catch捕獲異常 try 可能出現(xiàn)異常的代碼 catch(異常類型1 引用(ynyng)) 異常類型1的處理代碼 catch(異常類型n 引用(ynyng)) 異常類型n的處理代碼 見例題6-8第25頁/共33頁第二十五頁,共34頁。2、finall語句(yj)塊 在任何情況下都將保證執(zhí)行。 finall finall塊的代碼 見例題6-9第26頁/共33頁第
21、二十六頁,共34頁。6.5.2 異常(ychng)的層次結(jié)構(gòu) 當(dāng)異常發(fā)生時,Java會將該異常包裝成一個異常類的對象,并將其引用作為參數(shù)傳遞給相應(yīng)的catch語句,這樣在catch語句中就可以對這個異常對象進(jìn)行操作。 1捕獲異常:是由外界因素產(chǎn)生的,并且是可以恢復(fù)的。 說明: 在調(diào)用可能拋出捕獲異常的方法(或構(gòu)造器)時,必須編寫處理異常的代碼,否則編譯(biny)不通過。第27頁/共33頁第二十七頁,共34頁。 Java類庫中有一個(y )類,繼承自類,是所有異常類的超類。第28頁/共33頁第二十八頁,共34頁。見 例題(lt)6-13 例題(lt)6-14第29頁/共33頁第二十九頁,共34頁。 2未捕獲異常: Error類及子類以及RuntimeException類及其子類。 (1)繼承自Error的類一般代表由硬件運行失敗導(dǎo)致的嚴(yán)重錯誤。如內(nèi)存耗盡。程序不能從Error中恢復(fù)。 (
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版辦公樓宇全面清潔與消毒服務(wù)合同4篇
- 2025年版中學(xué)校園物業(yè)租賃合同范本及租賃管理要求3篇
- 二零二五版酒水品牌跨界合作與銷售拓展合同3篇
- 二零二五年度采摘園特色農(nóng)產(chǎn)品品牌授權(quán)合同2篇
- 二零二五年度港口碼頭船舶燃油供應(yīng)租賃合同4篇
- 2025年度臨時施工圍擋租賃及城市景觀維護(hù)合同4篇
- 二零二五年度高性能鋁模施工分包合作協(xié)議4篇
- 二零二五年文化產(chǎn)業(yè)投資與版權(quán)合作合同協(xié)議書
- 二零二五年鍋爐安裝與節(jié)能政策支持合同
- 2025年洗車行員工培訓(xùn)及招聘服務(wù)合同3篇
- 銀行會計主管年度工作總結(jié)2024(30篇)
- 教師招聘(教育理論基礎(chǔ))考試題庫(含答案)
- 2024年秋季學(xué)期學(xué)校辦公室工作總結(jié)
- 上海市12校2025屆高三第一次模擬考試英語試卷含解析
- 三年級數(shù)學(xué)(上)計算題專項練習(xí)附答案集錦
- 長亭送別完整版本
- 《鐵路軌道維護(hù)》課件-更換道岔尖軌作業(yè)
- 股份代持協(xié)議書簡版wps
- 職業(yè)學(xué)校視頻監(jiān)控存儲系統(tǒng)解決方案
- 《銷售心理學(xué)培訓(xùn)》課件
- 2024年安徽省公務(wù)員錄用考試《行測》真題及解析
評論
0/150
提交評論