《輸入輸出流》PPT課件.ppt_第1頁(yè)
《輸入輸出流》PPT課件.ppt_第2頁(yè)
《輸入輸出流》PPT課件.ppt_第3頁(yè)
《輸入輸出流》PPT課件.ppt_第4頁(yè)
《輸入輸出流》PPT課件.ppt_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 輸入/輸出流,主講教師:丁天翔,本章知識(shí)點(diǎn),流的概念 InputStream和OutputStream的繼承結(jié)構(gòu) Reader和Writer的繼承結(jié)構(gòu) 原始流處理器和鏈接流(裝飾流)處理器 常用流的使用 文件類,流(Stream)的概念,Java語(yǔ)言采用流的機(jī)制來(lái)實(shí)現(xiàn)輸入/輸出。所謂流,就是數(shù)據(jù)的有序排列,而流可以是從某個(gè)源(稱為流源,Source of Stream)出來(lái),到某個(gè)目的地(稱為流匯 ,Sink of Stream)去的。 根據(jù)流的方向可以將流分成輸入流和輸出流。一個(gè)程序總是從輸入流讀取數(shù)據(jù),而向輸出流寫出數(shù)據(jù) Java中負(fù)責(zé)I/O的類(稱為流類)統(tǒng)一存放在java.io

2、包中。該包又叫做I/O庫(kù),流的處理過(guò)程(輸入),用來(lái)處理流的流類又稱為流處理器 例如,一個(gè)java程序可以使用FileInputStream類直接從一個(gè)文件中讀取數(shù)據(jù),如下圖所示:,像FileInputStream這樣的流類叫做流處理器。一個(gè)流處理器就像一個(gè)流的管道一樣,從一個(gè)流源吸入某種類型的數(shù)據(jù),并輸出某種類型的數(shù)據(jù)。,類似地,也可以用FileOutputStream類直接向一個(gè)文件中寫出數(shù)據(jù),如下圖所示:,在實(shí)際應(yīng)用當(dāng)中,這種簡(jiǎn)單的機(jī)制并沒(méi)有太大的用處。因?yàn)槌绦蛐枰獙懗龅耐欠浅=Y(jié)構(gòu)化的信息,比如數(shù)值、文字、源代碼等。這樣一來(lái),數(shù)據(jù)的轉(zhuǎn)換工作將十分復(fù)雜。,流的處理過(guò)程(輸出),流的處理

3、過(guò)程(鏈接機(jī)制),Java的I/O庫(kù)提供了一個(gè)稱作鏈接(Chaining)的機(jī)制,可以將一個(gè)流處理器與另一個(gè)流處理器首尾相接,以其中之一的輸出為輸入,形成一個(gè)流管道的鏈接 例如:DataInputStream流處理器可以把FileInputStream流對(duì)象的輸出當(dāng)作輸入,將byte類型的數(shù)據(jù)轉(zhuǎn)換成java的基本數(shù)據(jù)類型和String類型的數(shù)據(jù),如下圖所示:,節(jié)點(diǎn)流(原始流處理器),過(guò)濾流(鏈接流處理器),類似地,向一個(gè)文件寫入byte類型的數(shù)據(jù)不是一個(gè)簡(jiǎn)單的過(guò)程:一個(gè)程序需要向一個(gè)文件里面寫入的數(shù)據(jù)往往是結(jié)構(gòu)化的,而不是byte類型的,因此在利用FileOutputStream寫的時(shí)候必須首

4、先經(jīng)過(guò)轉(zhuǎn)換。 DataOutputStream流處理器提供了直接接收基本數(shù)據(jù)類型和String類型的方法,而這個(gè)流處理器的輸出數(shù)據(jù)則是byte類型。這樣一來(lái),可以將DataOutputStream和FileOutputStream鏈接起來(lái),達(dá)到直接將結(jié)構(gòu)化的數(shù)據(jù)寫入到文件中的目的。,int類型的數(shù)據(jù) float類型的數(shù)據(jù) String類型的數(shù)據(jù),流的處理過(guò)程(鏈接機(jī)制),Java I/O庫(kù),流處理器所處理的流必定都有流源(匯),流源(匯)分成兩大類: 數(shù)組、String、File等,叫原始流源。 用于鏈接流類的流源,叫鏈接流源。 Java 語(yǔ)言的I/O庫(kù)是對(duì)各種常見的流源、流匯、以及處理過(guò)程的

5、抽象化,Java 語(yǔ)言的I/O庫(kù)是由一些基本的原始流處理器和圍繞它們的鏈接流處理器所組成的,按處理數(shù)據(jù)的單位劃分,Java支持兩種基本的流類型: 字符流和字節(jié)流,Java I/O庫(kù)的設(shè)計(jì)原則,兩個(gè)對(duì)稱性: 輸入輸出對(duì)稱:InputStream和OutputStream各自占據(jù)byte流的輸入與輸出的兩個(gè)平行的類等級(jí)結(jié)構(gòu)的根部;而Reader和Writer各自占據(jù)char流的輸入與輸出的兩個(gè)平行的類等級(jí)結(jié)構(gòu)的根部 bytechar對(duì)稱: InputStream與Reader的子類分別負(fù)責(zé)byte和char流的輸入; OutputStream和Writer的子類分別負(fù)責(zé)byte和char流的輸出,

6、輸入字節(jié)流InputStream,InputStream有7個(gè)直接子類,有4個(gè)屬于FilterInputStream的子類 注:圖中深色的類是節(jié)點(diǎn)流處理器,其他是過(guò)濾流處理器。,原始流處理器:接收一個(gè)byte數(shù)組對(duì)象、String對(duì)象、File對(duì)象等原始流源對(duì)象,并生成一個(gè)InputStream類型的流對(duì)象。共有4個(gè): ByteArrayInputStream:接收一個(gè)byte數(shù)組作為流源。 FileInputStream:建立一個(gè)與文件有關(guān)的輸入流,接收一個(gè)File對(duì)象作為流源。 PipedInputStream:與PipedOutputStream配合使用,接收一個(gè)PipedOutputS

7、tream對(duì)象作為流源,可實(shí)現(xiàn)程序間或線程間通訊。 StringBufferInputStream:(已過(guò)時(shí))此類未能正確地將字符轉(zhuǎn)換為字節(jié)。從 JDK 1.1 開始,從字符串創(chuàng)建流的首選方法是通過(guò) StringReader 類進(jìn)行創(chuàng)建。,原始流處理器,鏈接流處理器:就是可以接收另一個(gè)流對(duì)象作為流源,并對(duì)之進(jìn)行功能擴(kuò)展的流類 InputStream類型的鏈接流處理器包括以下7個(gè),都接收另一個(gè)InputStream對(duì)象作為流源。 FilterInputStream:過(guò)濾輸入流,它將另一個(gè)輸入流作為流源。它有4個(gè)子類: BufferedInputStream:用來(lái)從硬盤將數(shù)據(jù)讀入到一個(gè)內(nèi)存緩沖區(qū)中

8、,并從該緩沖區(qū)提供數(shù)據(jù)。 DataInputStream:提供基于多字節(jié)的讀取方法,可以讀取基本數(shù)據(jù)類型的數(shù)據(jù)。 LineNumberInputStream:提供帶有行計(jì)數(shù)功能的過(guò)濾輸入流。 PushbackInputStream:提供特殊功能,可以將已經(jīng)讀取的字節(jié)“推回”到輸入流中。,鏈接流處理器(裝飾流處理器),讀方法 int read();/從字節(jié)流對(duì)象中讀入一個(gè)字節(jié)作為返回值,返回值為-1時(shí),表示讀到流的結(jié)尾。 int read(byte b);/將讀入的數(shù)據(jù)放在一個(gè)字節(jié)數(shù)組b中,返回所讀的字節(jié)數(shù)。 int read(byte b,int off,int len);/將讀入的數(shù)據(jù)放在一

9、個(gè)字節(jié)數(shù)組b中,返回所讀的字節(jié)數(shù)。兩個(gè)參數(shù)是讀入數(shù)據(jù)后存放在b中的位置。 流的關(guān)閉方法 void close();/用于關(guān)閉流。 其他方法 int available();/返回輸入流中還有多少可讀字節(jié)。 int skip(long n);/跳過(guò)流中指定字節(jié)數(shù)量的數(shù)據(jù)。,流處理器的基本方法,輸出字節(jié)流OutputStream,OutputStream有5個(gè)直接子類,有3個(gè)屬于FilterOutputStream的子類,原始流處理器 ByteArrayOutputStream:輸出流的匯集是一個(gè)byte數(shù)組 FileOutputStream:輸出流的匯集是一個(gè)文件對(duì)象 PipedOutputSt

10、ream:用于向一個(gè)數(shù)據(jù)管道輸出數(shù)據(jù),原始輸出流處理器,鏈接流處理器: FilterOutputStream:過(guò)濾輸出流,它將另一個(gè)輸出流作為流匯。其子類有: BufferedOutputStream:向一個(gè)內(nèi)存緩沖區(qū)中寫出數(shù)據(jù),并將此中的數(shù)據(jù)輸出到硬盤中 DataOutputStream:可以寫出基本數(shù)據(jù)類型的數(shù)據(jù) PrintStream:用于產(chǎn)生格式化輸出 ObjectOutputStream:將基本數(shù)據(jù)類型和對(duì)象串行化,鏈接輸出流處理器,讀方法 void write(int b);/將指定的字節(jié)寫入此輸出流。write 的常規(guī)協(xié)定是:向輸出流寫入一個(gè)字節(jié)。要寫入的字節(jié)是參數(shù) b 的八個(gè)低

11、位。b 的 24 個(gè)高位將被忽略。 OutputStream 的子類必須提供此方法的實(shí)現(xiàn)。 void write(byte b);/向輸出流中寫一個(gè)字節(jié)數(shù)組。 Void write(byte b,int off,int len);/將讀入的數(shù)據(jù)放在一個(gè)字節(jié)數(shù)組b中,返回所讀的字節(jié)數(shù)。兩個(gè)參數(shù)是讀入數(shù)據(jù)后存放在b中的位置。 流的關(guān)閉方法 void close();/當(dāng)完成輸入流的寫操作后關(guān)閉流。 其他方法 Void flush();/強(qiáng)制將緩存的輸出數(shù)據(jù)寫出到流匯。,流處理器的基本方法,如果需要對(duì)數(shù)據(jù)做真正的格式化,以便輸出到像控制臺(tái)顯示那樣,就要用PrintStream。 PrintStrea

12、m可以對(duì)基本數(shù)據(jù)類型和String對(duì)象組成的數(shù)據(jù)進(jìn)行格式化,以形成可閱讀的格式。System.out就是一個(gè)靜態(tài)的PrintStream對(duì)象。 PrintStream對(duì)象最重要的兩個(gè)方法是print()和println() BufferedOutputStream:對(duì)一個(gè)輸出流進(jìn)行裝飾,使得流的寫出操作使用緩沖操作,提高程序效率。在涉及到物理流的地方,比如控制臺(tái)I/O、文件I/O等,都應(yīng)當(dāng)使用這個(gè)裝飾流處理器,兩點(diǎn)說(shuō)明,示例程序,從字節(jié)數(shù)組中讀取數(shù)據(jù),并在屏幕上顯示讀取的內(nèi)容,同時(shí)將該內(nèi)容寫入指定的文件IODemo.txt中。 讀入字符串中的字符將奇數(shù)位的字母轉(zhuǎn)換為大寫并輸出,java.lan

13、g.System public final class System extends Object static PrintStream err;/標(biāo)準(zhǔn)錯(cuò)誤流(輸出) static InputStream in;/標(biāo)準(zhǔn)輸入(鍵盤輸入流) static PrintStream out;/標(biāo)準(zhǔn)輸出流(顯示器輸出流) ,Java的標(biāo)準(zhǔn)的數(shù)據(jù)流,注意: (1)System類不能創(chuàng)建對(duì)象,只能直接使用它的三個(gè)靜態(tài)成員。 (2)每當(dāng)main方法被執(zhí)行時(shí),就自動(dòng)生成上述三個(gè)對(duì)象。,System.err 把錯(cuò)誤信息送到缺省的顯示(通常是顯示器),System.out 把輸出送到缺省的顯示(通常是顯示器), V

14、oid print(參數(shù)) Void println(參數(shù)),System.in 從標(biāo)準(zhǔn)輸入獲取輸入(通常是鍵盤) int read() /返回ASCII碼。若返回值= -1 ,說(shuō)明沒(méi)有讀取到任何字節(jié)讀取工作結(jié)束。 int read(byte b) /讀入多個(gè)字節(jié)到緩沖區(qū)b中返回值是讀入的字節(jié)數(shù),import java.io.*; class TestKeyRead public static void main(String args) int b; try while(b=System.in.read()!=-1) System.out.print(char)b); catch(IOExc

15、eption e ) System.out.println(e.toString(); ,標(biāo)準(zhǔn)輸入流System.in.read(),byte buffer=new byte512; System.out.println(please Input:); int count=System.in.read(buffer); System.out.println(Output:); for(int i=0;icount;i+) System.out.print( “ + bufferi ); System.out.println(); for(int i=0;icount;i+) System.ou

16、t.print( (char) bufferi ); String s=new String(buffer); System.out.println(s); System.out.println(count);,標(biāo)準(zhǔn)輸入流System.in.read(byte b),程序輸出:,標(biāo)準(zhǔn)輸入流實(shí)現(xiàn)中文處理,BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in); /將System.in封裝到一個(gè)BufferedReader中 Echo.java,字符流Reader,Reader有6個(gè)直接子類:,原始流處

17、理器: CharArrayReader:為多線程通信提供緩沖區(qū)操作功能 InputStreamReader:有一個(gè)子類FileReader,將字節(jié)流轉(zhuǎn)換為字符流 PipedReader:與PipedInputStream配合使用,用于讀入一個(gè)數(shù)據(jù)管道里的數(shù)據(jù) StringReader:建立一個(gè)與文件有關(guān)的輸入流 鏈接流處理器: BufferedReader:從硬盤將數(shù)據(jù)讀入到一個(gè)內(nèi)存緩沖區(qū),并從該緩沖區(qū)提供數(shù)據(jù) FilterReader:它將另一個(gè)輸入流作為流源,字符流Reader,有7個(gè)直接子類:,字符輸出流Writer,原始流處理器: CharArrayWriter:為多線程通信提供緩沖區(qū)

18、操作功能 OutputStreamWriter:建立一個(gè)與文件有關(guān)的輸出流 PipedWriter:與PipedOutputStream配合使用 StringWriter:向一個(gè)StringBuffer寫出數(shù)據(jù) 鏈接流處理器: BufferedWriter:為Writer類型的流處理器提供緩沖區(qū)功能 FilterWriter:沒(méi)有子類的抽象類,將另一個(gè)輸出流作為流源 PrintWriter:支持格式化的文字輸出,字符輸出流Writer,從byte流到char流的適配,InputStreamReader是從byte流到char流的一個(gè)橋梁,它讀入byte數(shù)據(jù)并根據(jù)指定的編碼將之翻譯成為char數(shù)

19、據(jù) 當(dāng)把InputStreamReader與任何InputStream的具體子類鏈接時(shí),可以從InputStream的輸出讀入byte類型的數(shù)據(jù),將之轉(zhuǎn)換成char類型的數(shù)據(jù),InputStream,byte類型的數(shù)據(jù),byte類型的數(shù)據(jù),源,InputStreamReader,char類型的數(shù)據(jù),匯,類似地,當(dāng)與任何一個(gè)OutputStream的具體子類鏈接時(shí), OutputStreamWriter可以將char類型的數(shù)據(jù)轉(zhuǎn)換成為byte類型的數(shù)據(jù),再交給輸出流,OutputStreamWriter,char類型的數(shù)據(jù),byte類型的數(shù)據(jù),源,OutputStream,byte類型的數(shù)據(jù),匯

20、,從byte流到char流的適配,如何使用I/O流?,流處理器分為原始流處理器和鏈接流處理器。根據(jù)不同的流源,先選定合適的原始流處理器,然后用適當(dāng)?shù)逆溄恿魈幚砥鱽?lái)裝飾它,最后用我們最終得到的鏈接流處理器對(duì)象來(lái)完成I/O操作 以打開一個(gè)文件進(jìn)行輸入為例:為了對(duì)文件進(jìn)行操作,需要使用一個(gè)FileInputStream(原始流);為了提高速度,最好先對(duì)文件進(jìn)行緩沖處理,可以用一個(gè)BufferedInputStream(鏈接流)來(lái)裝飾它;為了以格式化的形式讀取輸入數(shù)據(jù),再用一個(gè)DataInputStream (鏈接流)來(lái)裝飾它。這樣,最終我們得到了一個(gè)DataInputStream對(duì)象,使用該對(duì)象來(lái)執(zhí)

21、行文件操作: DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream(“Test.java”); in.readLine();,文件處理,在java.io包中,有File類提供了描述文件和目錄的操作與管理方法。 File不是輸入/輸出流類的子類,不負(fù)責(zé)數(shù)據(jù)的輸入/輸出,專門用來(lái)管理磁盤文件與目錄。 File類定義了一些與平臺(tái)無(wú)關(guān)的方法進(jìn)行文件操作,如建立、刪除、查詢、重命名等??梢杂盟鼇?lái)表示某個(gè)文件的名字,也可以用它來(lái)表示目錄里一組文件的名字。 創(chuàng)建File類文件對(duì)象 File(Str

22、ing path);/如:File(“F:/java/temp.dat”) File(String path,String name); File(File dir,String name);,文件處理,文件名的處理 String getName( ); /得到一個(gè)文件的名稱(不包括路徑) String getPath( ); /得到一個(gè)文件的路徑名 String getAbsolutePath( );/得到一個(gè)文件的絕對(duì)路徑名 String getParent( ); /得到一個(gè)文件的上一級(jí)目錄名 文件屬性測(cè)試 boolean exists( ); /測(cè)試當(dāng)前File對(duì)象所指示的文件是否存在

23、 boolean canWrite( );/測(cè)試當(dāng)前文件是否可寫 boolean canRead( );/測(cè)試當(dāng)前文件是否可讀 boolean isFile( ); /測(cè)試當(dāng)前文件是否是文件(不是目錄) boolean isDirectory( ); /測(cè)試當(dāng)前文件是否是目錄,文件處理,普通文件信息和工具 long lastModified( ); /得到文件最近一次修改的時(shí)間,用與時(shí)間點(diǎn)(1970 年 1 月 1 日,00:00:00 GMT)之間的毫秒數(shù)表示; long length( ); /得到文件的長(zhǎng)度,以字節(jié)為單位 boolean delete( ); /刪除當(dāng)前文件 目錄操作 b

24、oolean mkdir( ); /根據(jù)當(dāng)前對(duì)象生成一個(gè)由該對(duì)象指定的路徑 String list( ); /列出當(dāng)前目錄下的文件 示例程序:FileDemo.java,對(duì)象流,Java 可以將對(duì)象作為一個(gè)整體通過(guò)對(duì)象流進(jìn)行傳輸和存儲(chǔ)。 ObjectInputStream和ObjectOutputStream分別是對(duì)象流的輸入和輸出流處理器。 構(gòu)造方法:ObjectInputStream(InputStream in); ObjectOutputStream(OutputStream out); 當(dāng)使用對(duì)象流寫入或讀出一個(gè)對(duì)象時(shí),其前提是這個(gè)對(duì)象必須是序列化的。,對(duì)象序列化,Java 1.1增

25、添了一種有趣的特性,名為“對(duì)象序列化”(Object Serialization)。它面向那些實(shí)現(xiàn)了Serializable接口(該接口僅是一個(gè)標(biāo)識(shí)接口,沒(méi)有方法)的對(duì)象,可將它們轉(zhuǎn)換成一系列字節(jié),并可在以后完全恢復(fù)回原來(lái)的樣子。這一過(guò)程亦可通過(guò)網(wǎng)絡(luò)進(jìn)行。 利用它可以實(shí)現(xiàn)“持久化(persistent) ”。通過(guò)序列化一個(gè)對(duì)象,將其寫入磁盤,以后在程序重新調(diào)用時(shí)重新恢復(fù)那個(gè)對(duì)象,就能圓滿實(shí)現(xiàn)一種“持久”效果。,對(duì)象序列化,為序列化一個(gè)對(duì)象,首先要?jiǎng)?chuàng)建某些OutputStream對(duì)象,然后將其封裝到ObjectOutputStream對(duì)象內(nèi)。此時(shí),只需調(diào)用writeObject()即可完成對(duì)象的序列化,并將其發(fā)送給OutputStream 相反的過(guò)程是:將一個(gè)InputStream封裝到ObjectInputStream內(nèi),然后調(diào)用readObject()。我們最后獲得的是一個(gè)Object對(duì)象,必須做向下類型轉(zhuǎn)換 示例:Exa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論