第10章Java數(shù)據(jù)流_第1頁
第10章Java數(shù)據(jù)流_第2頁
第10章Java數(shù)據(jù)流_第3頁
第10章Java數(shù)據(jù)流_第4頁
第10章Java數(shù)據(jù)流_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第10章章 Java數(shù)據(jù)流數(shù)據(jù)流 Java數(shù)據(jù)流數(shù)據(jù)流本章主要介紹Java語言如何利用數(shù)據(jù)流的思想處理字節(jié)和字符的輸入輸出(包括stdin、stdout和stderr)。本章后面的幾個小節(jié)還將介紹一些對文件和文件中的數(shù)據(jù)進(jìn)行處理的具體方法。 數(shù)據(jù)流的基本概念數(shù)據(jù)流的基本概念數(shù)據(jù)流是指一組有順序的、有起點(diǎn)和終點(diǎn)的字節(jié)集合 文件文件程序程序網(wǎng)絡(luò)端點(diǎn)網(wǎng)絡(luò)端點(diǎn)數(shù)據(jù)流數(shù)據(jù)流文件文件程序程序終端終端網(wǎng)絡(luò)端點(diǎn)網(wǎng)絡(luò)端點(diǎn)文件、字符串文件、字符串存儲區(qū)存儲區(qū)終點(diǎn)終點(diǎn)起點(diǎn)起點(diǎn)流的不同層次流的不同層次 流被組織成不同的層次。最粗略的,數(shù)據(jù)流可以分為輸入數(shù)據(jù)流(input stream)和輸出數(shù)據(jù)流(output s

2、tream)。輸入數(shù)據(jù)流只能讀不能寫,而輸出數(shù)據(jù)流只能寫不能讀 Java開發(fā)環(huán)境數(shù)據(jù)流開發(fā)環(huán)境數(shù)據(jù)流 java.io包提供數(shù)據(jù)流在JDK1.1之前,java.io包中的流只有以byte為單位的流 對于以16位的Unicode碼表示的字符流處理很不方便 JDK1.1開始,java.io包中加入了專門用于字符流處理的類,這是以Reader和Writer為基礎(chǔ)派生的一系列的類 ,還有用于對象的永久化保存狀態(tài)的機(jī)制,它們通過實現(xiàn)ObjectInput和ObjectOutput接口來達(dá)到要求 import java.io.* 輸入數(shù)據(jù)流輸入數(shù)據(jù)流 輸入數(shù)據(jù)流(Input Stream)是指只能讀不能寫的

3、數(shù)據(jù)流,用于向計算機(jī)內(nèi)輸入信息而用java.io包中所有輸入數(shù)據(jù)流都是由抽象類InputStream繼承而來從數(shù)據(jù)流中讀取數(shù)據(jù)時,必須有一個數(shù)據(jù)源與該數(shù)據(jù)流相連主要數(shù)據(jù)操作方法主要數(shù)據(jù)操作方法int read() 從輸入流中讀一個字節(jié)的二進(jìn)制數(shù)據(jù),然后以此數(shù)據(jù)為低位字節(jié),配上一個全零字節(jié),形成一個0255之間的整數(shù)返回。它是一個抽象方法,需要在子類中具體實現(xiàn)。讀取結(jié)束時,它會得到-1 int read(byte b) 將多個字節(jié)讀到數(shù)組中,填滿整個數(shù)組 int read(byte b, int off , int len) 從輸入流中讀取長度為len的數(shù)據(jù),從數(shù)組b中索引為off的位置開始放置

4、讀入的數(shù)據(jù),讀畢返回讀取的字節(jié)數(shù) 主要數(shù)據(jù)操作方法主要數(shù)據(jù)操作方法void close() 數(shù)據(jù)流關(guān)閉,同時釋放與該數(shù)據(jù)流相關(guān)的資源 也可以由運(yùn)行時系統(tǒng)自動關(guān)閉int available() 返回目前可以從數(shù)據(jù)流中讀取的字節(jié)數(shù)(實際的讀操作所讀得的字節(jié)數(shù)可能大于該返回值)long skip(long l) 跳過數(shù)據(jù)流中指定數(shù)量的字節(jié)不讀,返回值表示實際跳過的字節(jié)數(shù) 主要數(shù)據(jù)操作方法主要數(shù)據(jù)操作方法boolean markSupported() 用于指示數(shù)據(jù)流是否支持回推操作,當(dāng)數(shù)據(jù)流支持mark()和reset()方法時返回true,反之返回false void mark(int markar

5、ea) 標(biāo)記數(shù)據(jù)流的當(dāng)前位置,并劃出一個緩沖區(qū),其大小至少為指定參數(shù)的大小 void reset() 執(zhí)行完read()操作后,調(diào)用方法reset()將回到輸入數(shù)據(jù)流中被標(biāo)記的位置 輸出數(shù)據(jù)流輸出數(shù)據(jù)流 輸出數(shù)據(jù)流(Output Stream)是指只能寫不能讀的流,用于從計算機(jī)中輸出數(shù)據(jù) java.io包中所有輸出數(shù)據(jù)流大多是從抽象類OutputStream繼承而來 主要數(shù)據(jù)操作方法主要數(shù)據(jù)操作方法 void write(int i) 將字節(jié)i寫入到數(shù)據(jù)流中,它只輸出低位字節(jié)。該方法是抽象方法,需要在其輸出流子類中加以實現(xiàn),然后才能使用 void write(byte b) 將數(shù)組b中的全部b

6、.length個字節(jié)寫入數(shù)據(jù)流 void write(byte b, int off, int len) 將數(shù)組b中從第off個字節(jié)開始的len個字節(jié)寫入數(shù)據(jù)流 主要數(shù)據(jù)操作方法主要數(shù)據(jù)操作方法void close() 當(dāng)結(jié)束對輸出數(shù)據(jù)流的操作時將其關(guān)閉 void flush() 輸出數(shù)據(jù)流會在提交數(shù)據(jù)之前把所要輸出的數(shù)據(jù)先鎖定在內(nèi)存緩沖區(qū)中,然后成批地進(jìn)行輸出,每次傳輸過程都以某特定數(shù)據(jù)長度為單位進(jìn)行傳輸。這種方式下,在數(shù)據(jù)的末尾一般都會有一部分?jǐn)?shù)據(jù)由于數(shù)量不夠一個批次,而存留在緩沖區(qū)里, flush()可以將留在緩沖區(qū)里的數(shù)據(jù)強(qiáng)制提交 緩沖存儲緩沖存儲緩沖區(qū)單位的容量緩沖區(qū)單位的容量末尾剩

7、余末尾剩余部分部分基本字節(jié)數(shù)據(jù)流類基本字節(jié)數(shù)據(jù)流類文件數(shù)據(jù)流 包括FileImputStream和FileOutputStream, 用來進(jìn)行文件的I/O處理,其數(shù)據(jù)源都應(yīng)當(dāng)是文件 對本機(jī)上的文件進(jìn)行操作,但是它們不支持方法mark()和reset() 在構(gòu)造文件數(shù)據(jù)流時,可以直接給出文件名 FileInputStream fis = new FileInputStream(myFile); 例例10-2 在“myFile.dat”文件中會保存字符串HELLO! FileOutputStream out = new FileOutputStream(myFile.dat);out.write(

8、H);out.write(69);out.write(76);out.write(L);out.write(O);out.write(!);out.close(); 文件文件I/O操作異常操作異常 類FileInputStream的實例對象,如果所指定的文件不存在,產(chǎn)生FileNotFoundException異常類FileOutputStream的實例對象,如果所指定的文件不存在,則創(chuàng)建一個新文件;如果存在,那么新寫入的內(nèi)容將會覆蓋原有數(shù)據(jù)如果在讀、寫或生成新文件時發(fā)生錯誤,則會產(chǎn)生IOException異常文件數(shù)據(jù)流文件數(shù)據(jù)流I/O操作操作程序10-1異常捕獲并處理FileInputStr

9、eam來讀取FileOutputStream輸出的數(shù)據(jù) 程序10-2 過濾流過濾流 過濾器數(shù)據(jù)流在創(chuàng)建時與一個已經(jīng)存在的數(shù)據(jù)流相連,這樣在從這樣的數(shù)據(jù)流中讀取數(shù)據(jù)時,它提供的是對一個原始輸入數(shù)據(jù)流的內(nèi)容進(jìn)行了特定處理的數(shù)據(jù)。 緩沖區(qū)數(shù)據(jù)流緩沖區(qū)數(shù)據(jù)流 BufferedInputStream和BufferedOutputStream 都屬于過濾器數(shù)據(jù)流,都是在數(shù)據(jù)流上增加了一個緩沖區(qū) 讀寫數(shù)據(jù)時,數(shù)據(jù)以塊為單位先進(jìn)入緩沖區(qū)(塊的大小可以進(jìn)行設(shè)置),其后的讀寫操作則作用于緩沖區(qū) 降低了不同硬件設(shè)備之間速度的差異,提高了I/O操作的效率 提供了對mark()、reset()、skip()等方法的支持

10、 創(chuàng)建該類的實例對象創(chuàng)建該類的實例對象 取缺省緩沖區(qū)的大小 自行設(shè)置緩沖區(qū)的大小 關(guān)閉一個緩沖區(qū)輸出流之前,使用flush()方法 FileInputStream fis = new FileInputStream(myFile);InputStream is = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream(myFile); OutputStream os = new BufferedOutputStream(fos); FileInputStream fis = new FileInputS

11、tream(myFile);InputStream is = new BufferedInputStream(fis,1024);FileOutputStream fos = new FileOutputStream(myFile); OutputStream os = new BufferedOutputStream(fos,1024); 數(shù)據(jù)數(shù)據(jù)流數(shù)據(jù)數(shù)據(jù)流 DataInputStream和DataOutputStream允許通過數(shù)據(jù)流來讀寫Java原始類型 布爾型(Boolean)、浮點(diǎn)型(float)等等 創(chuàng)建方式:DataInputStream dis = new DataInput

12、Stream(is);DataOutputStream dos = new DataOutputStream(os); DataInputStream類方法類方法 byte readByte()long readLong()double readDouble()boolean readBoolean()String readUTF()int readInt()float readFloat()short readShort() char readChar() DataOutputStream類方法類方法 void writeByte(int aByte)void writeLong(long

13、aLong)void writeDouble(double aDouble)void writeBoolean(boolean aBool)void writeUTF(String aString)void writeInt(int anInt)void writeFloat(float aFloat)void writeShort(short aShort) void writeChar(char aChar) DataInputStream的方法與DataOutputStream的方法都是成對出現(xiàn)的 管道數(shù)據(jù)流管道數(shù)據(jù)流 管道數(shù)據(jù)流主要用于線程間的通信 一個線程中的PipedInputSt

14、ream對象從另一個線程中互補(bǔ)的PipedOutputStream對象中接收輸入 類PipedInputStream必須和類PipedOutputStream一起使用,來建立一個通信通道 管道數(shù)據(jù)流必須同時具備可用的輸入端和輸出端 創(chuàng)建一個通信通道創(chuàng)建一個通信通道 建立輸入數(shù)據(jù)流:PipedInputStream pis = new PipedInputStream() 建立輸出數(shù)據(jù)流:PipedInputStream pis = new PipedInputStream() 輸入數(shù)據(jù)流和輸出數(shù)據(jù)流連起來pis.connect(pos)或者pos.connect(pis) 創(chuàng)建一個通信通道創(chuàng)建

15、一個通信通道直接將輸入流與輸出流連接起來 PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis); PipedOutputStream pos = new PipedOutputStream(); PipedInputStream pis = new PipedInputStream(pos); 管道通信程序管道通信程序管道的兩端建立連接以后就可以進(jìn)行數(shù)據(jù)的通信了,見程序10-3 對象流對象流能夠輸入輸出對象的流稱為對象流 通過java.io包中Objec

16、tInputStream和ObjectOutputStream兩個類實現(xiàn)的 寫對象數(shù)據(jù)流寫對象數(shù)據(jù)流 將一個java.util.Date對象實例送入文件 Date d = new Date();FileOutputStream f = new FileOutputStream(date.ser);ObjectOutputStream s = new ObjectOutputStream(f);trys.writeObject(d);s.close();catch(IOException e)e.printStackTrace(); 讀對象數(shù)據(jù)流讀對象數(shù)據(jù)流 readObject()把數(shù)據(jù)流以O(shè)

17、bject類型返回,應(yīng)該在轉(zhuǎn)換為正確的類名之后再執(zhí)行Date d = null;FileInputStream f = new FileInputStream(date.ser);ObjectInputStream s = new ObjectInputStream(f);tryd = (Date)s.readObject(d);s.close();catch(IOException e)e.printStackTrace(); System.out.println(Date serialized at +d); 可持續(xù)性概念可持續(xù)性概念能夠記錄自己的狀態(tài)以便將來再生的能力,叫對象的持續(xù)性(P

18、ersistence) 一個對象是可持續(xù)的,意味著可以把這個對象存入磁盤、磁帶,或傳入另一臺機(jī)器保存在它的內(nèi)存或磁盤中。也就是說把對象存為某種永久存儲類型。 對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己的過程叫持續(xù)化(或串行化,Serialization) 持續(xù)化的主要任務(wù)是寫出對象實例變量的數(shù)值,如果變量是另一個對象的引用,則引用的對象也要串行化。這個過程是遞歸的。 JavaJava的可持續(xù)性的可持續(xù)性一個類聲明實現(xiàn)Serializable接口時,表明該類加入了對象串行化協(xié)議 Serializable接口中沒有定義任何方法,只是作為一個標(biāo)記來指示實現(xiàn)該接口的類可以被持續(xù)化 Java中,允許可串行

19、化的對象通過對象流進(jìn)行傳輸 例10-5 串行化對象串行化對象 要串行化一個對象,必須與一定的對象輸出/輸入流聯(lián)系起來 通過對象輸出流將對象狀態(tài)保存下來 通過對象輸入流將對象狀態(tài)恢復(fù)。通過java.io包中的ObjectOutputStream和ObjectInputStream兩個類實現(xiàn) 前者用writeObject()方法可以直接將對象保存到輸出流中,而后者用readObject()方法可以直接從輸入流中讀取一個對象 串行化對象例串行化對象例對象的存儲 程序10-4 對象的恢復(fù) 程序10-5 對象結(jié)構(gòu)表對象結(jié)構(gòu)表串行化只能保存對象的非靜態(tài)成員變量,而不能保存任何成員方法和靜態(tài)成員變量,并且保

20、存的只是變量的值,對于變量的任何修飾符都不能保存,訪問權(quán)限(public,protected,private)對于數(shù)據(jù)域的持續(xù)化沒有影響 數(shù)據(jù)會經(jīng)常變化,狀態(tài)只是瞬時的對象無法保存其狀態(tài),不具有可持續(xù)性。如Thread對象或流對象。對于這樣的成員變量,必須用transient關(guān)鍵字標(biāo)明,否則編譯器將報錯。任何用transient關(guān)鍵字標(biāo)明的成員變量,都不會被保存對象結(jié)構(gòu)表對象結(jié)構(gòu)表串行化可能涉及將對象存放到磁盤上或在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù),這時會產(chǎn)生安全問題。對于一些需要保密的數(shù)據(jù),不應(yīng)保存在永久介質(zhì)中(或者不應(yīng)簡單地不加處理地保存下來),為了保證安全,應(yīng)在這些變量前加上transient關(guān)鍵字?jǐn)?shù)據(jù)變

21、量是一個對象時,該對象的數(shù)據(jù)成員也可以被持續(xù)化。對象的數(shù)據(jù)結(jié)構(gòu)或結(jié)構(gòu)樹,包括其子對象樹在內(nèi),構(gòu)成了這個對象的結(jié)構(gòu)表 如果一個對象圖表中包含了一個對不可持續(xù)化對象的引用,而這個引用已用關(guān)鍵字transient加以標(biāo)記,則這個對象仍可以被持續(xù)化 例例10-6 于myThread域有transient修飾,所以盡管它為不可持續(xù)化元素,但其整個對象仍可持續(xù)化 public class MyClass implements Serializablepublic transient Thread myThread;private String customerID;private int total; t

22、ransient例例 盡管變量customerID是可持續(xù)化元素,但由于有transient修飾,所以,整個對象在持續(xù)化時不會對它進(jìn)行持續(xù)化 public class MyClass implements Serializeblepublic transient Thread myThread;private transient String customerID;private int total; 基本字符流基本字符流從JDK1.1開始,java.io包中加入了專門用于字符流處理的類 以Reader和Writer為基礎(chǔ)派生的一系列類 Reader和Writer也是抽象類,只提供了一系列用于

23、字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組字節(jié)流中類DataInputStream的readLine方法,可以以字節(jié)形式讀入,以Unicode形式輸出(String readLine()) 讀者和寫者讀者和寫者讀者(Readers)和寫者(Writers)提供對不同平臺之間數(shù)據(jù)流數(shù)據(jù)進(jìn)行轉(zhuǎn)換的功能同其他程序設(shè)計語言使用ASCII字符集不同,Java使用Unicode來表示字符串和字符 ASCII字符集是以一個字節(jié)(8bit)來表示一個字符,所以可以認(rèn)為一個字符就是一個字節(jié)(byte).Unicode是一種大字符集,要

24、用兩個字節(jié)(16bit)來表示一個字符 InputStreamReaderOutputStreamWriter 這兩個類是字節(jié)流和讀者、寫者的接口,用來在字節(jié)流和字符流之間作為中介 構(gòu)造方法 InputStreamReader(InputStream in); /缺省規(guī)范InputStreamReader(InputStream in, String enc);/指定規(guī)范encOutputStreamWriter(OutputStream out);/缺省規(guī)范OutputStreamWriter(OutputStream out, String enc);/指定規(guī)范enc構(gòu)造映射到ASCII碼

25、的標(biāo)準(zhǔn)的InputStreamReader的方法如下 ir = new InputStreamReader(System.in,8859_1); 讀者提供的方法讀者提供的方法 void close()void mark(int readAheadLimit)boolean markSupported() :int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n) 寫者提供的方法寫者提供的方法 void close() vo

26、id flush() void write(char cbuf) void write(char cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int len) 緩沖區(qū)讀者和寫者緩沖區(qū)讀者和寫者 BufferedReader和BufferedWriter, 構(gòu)造方法與BufferedInputStream,BufferedOutputStream相類似 整行字符處理方法 public String readLine():BufferedReader

27、的方法,從輸入流中讀取一行字符,行結(jié)束標(biāo)志為n、r或兩者一起 public void newLine():BufferedWriter的方法,向輸出流中寫入一個行結(jié)束標(biāo)志程序程序10-6 程序10-6 每從文件“file1.txt”中讀出一行,就將其顯示出來,并在行首加上字符串“read:” 程序程序10-7 程序10-7 實現(xiàn)的是從標(biāo)準(zhǔn)輸入通道讀取字符串信息然后進(jìn)行輸出。程序?qū)?biāo)準(zhǔn)輸入流(System.in)串接到一個InputStreamReader上,而后又將其串接到一個BufferedReader上,把鍵盤輸入的內(nèi)容經(jīng)過處理顯示在屏幕上 程序程序10-8 程序10-8中使用PrintW

28、riter類中的print()或println()方法,輸出文本格式的內(nèi)容程序10-9使用readLine()方法從文本文件中緩沖讀取內(nèi)容 文件的處理文件的處理 File類提供了獲得文件基本信息及操作文件的一些工具創(chuàng)建一個新的File對象 File myFile; myFile = new File(mymotd); myFile = new File(/,mymotd); File myDir = new File(/);myFile = new Fle(myDir,mymotd); 與文件名相關(guān)的方法與文件名相關(guān)的方法 String getName() 獲取文件名 String getPath() 獲取文件路徑 String getAbsolutePath() 獲取文件絕對路徑 String getParent() 獲取文件父目錄名稱 boolean renameTo(File newName) 更改文件名,成功則返回true,否則返回false 文件測定方法文件測定方法 boolean exists() 文件對象是否存在 boolean canW

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論