第08章輸入輸出流和文件操作(信息學(xué)院2013級)_第1頁
第08章輸入輸出流和文件操作(信息學(xué)院2013級)_第2頁
第08章輸入輸出流和文件操作(信息學(xué)院2013級)_第3頁
第08章輸入輸出流和文件操作(信息學(xué)院2013級)_第4頁
第08章輸入輸出流和文件操作(信息學(xué)院2013級)_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第8章章 輸入輸入/輸出流和文件操作輸出流和文件操作 8.1 文件和流的概念文件和流的概念 8.2 字節(jié)輸入字節(jié)輸入/輸出流類輸出流類 8.3 字符輸入字符輸入/輸出流類輸出流類 8.4 文件操作文件操作18.1 文件和流的概念文件和流的概念8.1.1 操作系統(tǒng)中的文件和目錄概念操作系統(tǒng)中的文件和目錄概念8.1.2 流的概念流的概念28.1.1 操作系統(tǒng)中的文件和目錄概念操作系統(tǒng)中的文件和目錄概念1/2文件與文件系統(tǒng)文件與文件系統(tǒng)文件文件是信息的一種組織形式,存儲在外部介質(zhì)上的具有標(biāo)識是信息的一種組織形式,存儲在外部介質(zhì)上的具有標(biāo)識名的一組相關(guān)信息集合。具有保存性,其內(nèi)容可以長期保存名的一組

2、相關(guān)信息集合。具有保存性,其內(nèi)容可以長期保存和多次使用。和多次使用。文件系統(tǒng)文件系統(tǒng)負(fù)責(zé)存取和管理文件,是操作系統(tǒng)不可或缺的重要負(fù)責(zé)存取和管理文件,是操作系統(tǒng)不可或缺的重要功能。文件擴(kuò)展名標(biāo)識文件類型,文件名和擴(kuò)展名以功能。文件擴(kuò)展名標(biāo)識文件類型,文件名和擴(kuò)展名以”.”分隔分隔.目錄結(jié)構(gòu)與文件檢索目錄結(jié)構(gòu)與文件檢索 目錄是文件系統(tǒng)組織和管理的基本單位,目錄中保存它所管目錄是文件系統(tǒng)組織和管理的基本單位,目錄中保存它所管理的每個文件的基本屬性信息(稱為文件目錄項或文件控制理的每個文件的基本屬性信息(稱為文件目錄項或文件控制塊)。目錄中可以包含文件和子目錄。塊)。目錄中可以包含文件和子目錄。38.

3、1.1 操作系統(tǒng)中的文件和目錄概念操作系統(tǒng)中的文件和目錄概念2/2文件的邏輯結(jié)構(gòu)文件的邏輯結(jié)構(gòu)流式文件流式文件:由字節(jié)序列或者字符序列組成,例如文本文:由字節(jié)序列或者字符序列組成,例如文本文件和源程序是字符流式文件件和源程序是字符流式文件記錄式文件記錄式文件:是一種有結(jié)構(gòu)的文件,它包括若干記錄。:是一種有結(jié)構(gòu)的文件,它包括若干記錄。記錄是文件內(nèi)獨(dú)立的最小信息單位,操作系統(tǒng)每次操作記錄是文件內(nèi)獨(dú)立的最小信息單位,操作系統(tǒng)每次操作至少存儲、檢索或更新一個記錄。至少存儲、檢索或更新一個記錄。文件的存取方法文件的存取方法順序存?。喊从涗涰樞蜻M(jìn)行讀順序存?。喊从涗涰樞蜻M(jìn)行讀/寫操作的存取方法。寫操作的存

4、取方法。隨機(jī)存取:按記錄位置序號進(jìn)行讀隨機(jī)存?。喊从涗浳恢眯蛱栠M(jìn)行讀/寫操作的存取方法。寫操作的存取方法。文件的使用接口文件的使用接口操作接口:為計算機(jī)用戶提供的文件操作功能。操作接口:為計算機(jī)用戶提供的文件操作功能。應(yīng)用程序接口應(yīng)用程序接口:由一組系統(tǒng)調(diào)用組成,包括建立文件、:由一組系統(tǒng)調(diào)用組成,包括建立文件、打開文件、讀打開文件、讀/寫文件等等操作寫文件等等操作48.1.2 流的概念流的概念1. 流的定義和作用流的定義和作用1)流的定義、方向性和讀)流的定義、方向性和讀/寫操作寫操作流的定義流的定義:流是指一組有順序的、有起點和終點:流是指一組有順序的、有起點和終點的字節(jié)集合,是對數(shù)據(jù)傳輸

5、的總稱和抽象。數(shù)據(jù)在兩的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q和抽象。數(shù)據(jù)在兩個對象之間的傳輸都稱為流。個對象之間的傳輸都稱為流。 方向性方向性:分為輸入和輸出流。:分為輸入和輸出流。 讀寫操作讀寫操作:一個流只能進(jìn)行讀或者寫的一種操作,:一個流只能進(jìn)行讀或者寫的一種操作,不能同時進(jìn)行讀和寫。分為輸入流(讀操作)和輸出不能同時進(jìn)行讀和寫。分為輸入流(讀操作)和輸出流(寫操作)。流(寫操作)。58.1.2 流的概念流的概念1.流的定義和作用流的定義和作用2)流采用緩沖區(qū)技術(shù)流采用緩沖區(qū)技術(shù) 對流進(jìn)行讀對流進(jìn)行讀/寫操作的最小單位是字節(jié),這樣效率寫操作的最小單位是字節(jié),這樣效率很低。通過緩沖區(qū)技術(shù)提供效率。

6、很低。通過緩沖區(qū)技術(shù)提供效率。 緩沖區(qū):緩沖區(qū):通過緩沖區(qū)一次可以讀寫若干個字節(jié),通過緩沖區(qū)一次可以讀寫若干個字節(jié),使數(shù)據(jù)以足夠大的數(shù)據(jù)塊形式傳送,提供數(shù)據(jù)傳輸效使數(shù)據(jù)以足夠大的數(shù)據(jù)塊形式傳送,提供數(shù)據(jù)傳輸效率。率。3)流的作用)流的作用流的目的是獨(dú)立于設(shè)備(驅(qū)動程序),使應(yīng)用程序屏流的目的是獨(dú)立于設(shè)備(驅(qū)動程序),使應(yīng)用程序屏蔽外設(shè)的差異性,以同樣的方法操作各種外設(shè)。蔽外設(shè)的差異性,以同樣的方法操作各種外設(shè)。68.1.2 流的概念流的概念2. 流的存在流的存在 4種場景下的數(shù)據(jù)流動種場景下的數(shù)據(jù)流動 1)標(biāo)準(zhǔn)的輸入)標(biāo)準(zhǔn)的輸入/輸出輸出 2)文件讀寫操作)文件讀寫操作 3)線程通信)線程通信

7、 4)網(wǎng)絡(luò)通信)網(wǎng)絡(luò)通信7這是前面兩種需要使這是前面兩種需要使用流的場景用流的場景8.1.2 流的概念流的概念83. Java的流類和文件類的流類和文件類1)按照流中元素的基本單位,分為字節(jié)流和字符流。每類流又分為輸入和輸出兩個方向。2)字節(jié)流以InputStream/OutputStream為根類;字符流一Reader和Writer為根類。1)流類)流類InputStream抽象字節(jié)輸入流類抽象字節(jié)輸入流類OuputStream抽象字節(jié)輸出流類抽象字節(jié)輸出流類Reader抽象字符輸入流類抽象字符輸入流類Writer抽象字符輸出流類抽象字符輸出流類2)文件操作類)文件操作類File文件類文件類

8、RandomAccessFile 隨機(jī)存取文件類隨機(jī)存取文件類9這是最基礎(chǔ)的流類和文件類,這是最基礎(chǔ)的流類和文件類,P216的的圖圖8.1給出了詳細(xì)的類層次結(jié)構(gòu)。給出了詳細(xì)的類層次結(jié)構(gòu)。Java流和文件的根類流和文件的根類10類類說明說明InputStream抽象抽象字節(jié)輸入流類字節(jié)輸入流類,是所有字節(jié)輸入流類的根類,是所有字節(jié)輸入流類的根類OutputStream抽象抽象字節(jié)輸出流類字節(jié)輸出流類,是所有字節(jié)輸出流類的根類,是所有字節(jié)輸出流類的根類Reader抽象抽象字符輸入流類字符輸入流類,是所有字符輸入流類的根類,是所有字符輸入流類的根類Writer抽象抽象字符輸出流類字符輸出流類,是所有

9、字符輸出流類的根類,是所有字符輸出流類的根類File文件類文件類RandomAccessFile隨機(jī)存取文件類隨機(jī)存取文件類8.2 字節(jié)字節(jié)輸入輸入/輸出流類輸出流類8.2.1 抽象字節(jié)流抽象字節(jié)流8.2.2 文件字節(jié)流文件字節(jié)流8.2.3 數(shù)據(jù)字節(jié)流數(shù)據(jù)字節(jié)流8.2.4 對象字節(jié)流對象字節(jié)流8.2.5 管道字節(jié)流管道字節(jié)流118.2.1 抽象字節(jié)流抽象字節(jié)流1.InputStream類及其子類類及其子類public abstract class InputStream extends Object implements Closeable public abstract int read()

10、 throws IOException; /返回讀取的一個字節(jié),抽象方法返回讀取的一個字節(jié),抽象方法 public int read(byte b) throws IOException /從輸入流中讀取若干字節(jié)到指定緩沖區(qū),返回從輸入流中讀取若干字節(jié)到指定緩沖區(qū),返回實際讀取的字節(jié)數(shù)實際讀取的字節(jié)數(shù) public void close() throws IOException /關(guān)閉輸入流,空方法關(guān)閉輸入流,空方法12read方法()方法():讀取到的字節(jié)數(shù)據(jù)存放在讀取到的字節(jié)數(shù)據(jù)存放在b數(shù)組中,數(shù)組中,返回值為讀取到的字節(jié)數(shù),即返回值為讀取到的字節(jié)數(shù),即b數(shù)組中的元素個數(shù)。數(shù)組中的元素個數(shù)

11、。InputStream類的子類類的子類13對應(yīng)單字節(jié)、基本類型數(shù)據(jù)、對象和管道字節(jié)流對應(yīng)單字節(jié)、基本類型數(shù)據(jù)、對象和管道字節(jié)流2. OutputStream類及其子類類及其子類public abstract class OutputStream extends Object implements Closeable, Flushable public abstract void write(int b) throws IOException; /寫入一個字節(jié),抽象方法寫入一個字節(jié),抽象方法 public void write(byte b) throws IOException /將緩沖區(qū)中

12、的若干字節(jié)寫入輸出流將緩沖區(qū)中的若干字節(jié)寫入輸出流 public void flush() throws IOException /立即傳輸立即傳輸 public void close() throws IOException /關(guān)閉輸出流,空方法關(guān)閉輸出流,空方法14把值為把值為b的整形數(shù),寫入一個字節(jié)。而不是寫入了一個的整形數(shù),寫入一個字節(jié)。而不是寫入了一個整形數(shù),占用整形數(shù),占用4個字節(jié)。個字節(jié)。OutputStream類的子類類的子類15對應(yīng)單字節(jié)、基本類型數(shù)據(jù)、對象和管道字節(jié)流對應(yīng)單字節(jié)、基本類型數(shù)據(jù)、對象和管道字節(jié)流System.out是是PrintStream對象對象圖圖8.2

13、各種字節(jié)輸入各種字節(jié)輸入/輸出流的讀輸出流的讀/寫方法寫方法 16圖圖8.3 使用流類和文件類出現(xiàn)異常類的層次結(jié)構(gòu)使用流類和文件類出現(xiàn)異常類的層次結(jié)構(gòu) 由于輸入輸出需要與外設(shè)交互,讀取或?qū)懭氩僮鲿r需要處理的異常。 Eclipse會自動提示需要處理哪種異常,如讀取文件會提示處理FileNotFoundException,讀寫對象會提示ClassNotFoundException等。Java標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入/輸出處理字節(jié)流輸出處理字節(jié)流1.標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入/輸出常量輸出常量public final class System extends Object public final static In

14、putStream in /標(biāo)準(zhǔn)輸入常量標(biāo)準(zhǔn)輸入常量 public final static PrintStream out /標(biāo)準(zhǔn)輸出常量標(biāo)準(zhǔn)輸出常量 public final static PrintStream err /標(biāo)準(zhǔn)錯誤輸出常量標(biāo)準(zhǔn)錯誤輸出常量182. PrintStream類類public class PrintStream extends FilterOutputStream public void print(boolean b) public void print(char c) public void print(long l) public void print(i

15、nt i) public void print(float f) public void print(double d) public void print(String s) public void print(Object obj) public void println()19標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入/輸出字節(jié)流例子輸出字節(jié)流例子2013和和10分別是分別是 回車回車 和和換行換行標(biāo)準(zhǔn)輸出空格當(dāng)作字符讀入空格當(dāng)作字符讀入8.2.2 文件字節(jié)流文件字節(jié)流1.FileInputSream類類public class FileInputStream extends InputStream public

16、 FileInputStream(String name); public FileInputStream(File file); public int read(); /從此輸入流中讀取一個數(shù)據(jù)字節(jié)。從此輸入流中讀取一個數(shù)據(jù)字節(jié)。 public int read(byte b); /從此輸入流中將最多從此輸入流中將最多 b.length 個字個字節(jié)的數(shù)據(jù)讀入一個節(jié)的數(shù)據(jù)讀入一個 byte 數(shù)組中。數(shù)組中。 public long skip(long n);/從輸入流中跳過并丟棄從輸入流中跳過并丟棄 n 個字節(jié)的數(shù)據(jù)。個字節(jié)的數(shù)據(jù)。21讀文件2. FileOutputStream類類publi

17、c class FileOutputStream extends OutputStream public FileOutputStream(String name) ; public FileOutputStream(File file); public FileOutputStream(String name, boolean append); public void write(int b); /將指定字節(jié)寫入此文件輸出流。將指定字節(jié)寫入此文件輸出流。 public void write(byte b) ; /將將 b.length 個字節(jié)從指定個字節(jié)從指定 byte 數(shù)組寫入此文件輸出流

18、中。數(shù)組寫入此文件輸出流中。22寫文件【例例8.1】 理解字節(jié)流。理解字節(jié)流。(1)從文件字節(jié)流中從文件字節(jié)流中讀寫讀寫1個字節(jié)個字節(jié)public class FileStream_byte1 public static void main(String args) throws IOExceptionString filename =filesStream.byte;FileOutputStream fout = new FileOutputStream(filename); /創(chuàng)建文件輸出字節(jié)流對象fout.write(-1);/寫入整數(shù)參數(shù)的最低字節(jié)fout.close();/關(guān)閉文件字

19、節(jié)輸出流FileInputStream fin = new FileInputStream(filename); /創(chuàng)建文件輸入字節(jié)流對象int i;while(i=fin.read()!= -1 ) /每次讀取一個字節(jié),字節(jié)流結(jié)束返回System.out.print( + i);fin.close();程序項程序項fileStream.byte寫入了一個寫入了一個-1,讀取后打印。,讀取后打印??雌饋磔敵龅膽?yīng)該是看起來輸出的應(yīng)該是-1,實際上卻是,實際上卻是255,為什么?,為什么?如果希望輸出是如果希望輸出是 1,如何修改程序如何修改程序System.out.print(“ ” + (by

20、te) i);(2) 從字節(jié)流中讀寫從字節(jié)流中讀寫4個字節(jié)作為個字節(jié)作為1個個int整數(shù)整數(shù)思路:對整形的4個字節(jié)經(jīng)過移位后分4次寫入。讀取時也是分4次讀入,通過移位組合成一個整數(shù)26public static void main(String args) throws IOExceptionString filename =filesS;FileOutputStream fout = new FileOutputStream(filename); /創(chuàng)建文件輸出字節(jié)流對象int value = -128;fout.write(value24); /整數(shù)右移24位,即寫入整數(shù)

21、的最高字節(jié)fout.write(value16);fout.write(value8);fout.write(value);fout.close();/關(guān)閉文件字節(jié)輸出流FileInputStream fin = new FileInputStream(filename); /創(chuàng)建文件輸入字節(jié)流對象while(value=fin.read()!= -1 ) /每次讀取一個字節(jié),字節(jié)流結(jié)束返回int tmp;for(int j=0;j3&(tmp=fin.read()!=-1;j+)value = value8 | tmp;System.out.print(value + );fin.c

22、lose();讀寫一個整數(shù)真的需要這么復(fù)雜嗎【例例8.2】 使用使用字節(jié)流字節(jié)流讀寫文件。讀寫文件。(1)文件輸入操作)文件輸入操作(2)文件輸出操作)文件輸出操作(3)文件復(fù)制操作)文件復(fù)制操作 FileInputStream fin = new FileInputStream(this.filename);int count = fin.read(buffer); FileOutputStream fout = new FileOutputStream(filename2); fout.write(buffer);fin.close(); fout.close();27文件格式:文件格式:

23、按按ASCII碼或者字節(jié)存儲碼或者字節(jié)存儲一次讀寫多個字節(jié)一次讀寫多個字節(jié)按字節(jié)寫成文件,文本編輯器不可讀查看ByteFile.dat,其內(nèi)容不可讀,文件大小10字節(jié)使用文件字節(jié)輸入使用文件字節(jié)輸入/輸出流輸出流FileInputStream和和FileOutputStream類,可以實現(xiàn)記錄式文件的讀類,可以實現(xiàn)記錄式文件的讀/寫操作。但是字節(jié)流的寫操作。但是字節(jié)流的操作基本單位是字節(jié)操作基本單位是字節(jié),如,如果對一個基本數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行讀寫操作,需要果對一個基本數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行讀寫操作,需要進(jìn)行字節(jié)和基本數(shù)據(jù)類型的轉(zhuǎn)換,實現(xiàn)過程麻煩;進(jìn)行字節(jié)和基本數(shù)據(jù)類型的轉(zhuǎn)換,實現(xiàn)過程麻煩;Java

24、已經(jīng)將基本數(shù)據(jù)類型的讀寫操作封裝成數(shù)據(jù)已經(jīng)將基本數(shù)據(jù)類型的讀寫操作封裝成數(shù)據(jù)字節(jié)流。數(shù)據(jù)字節(jié)輸入流字節(jié)流。數(shù)據(jù)字節(jié)輸入流DataInputStream和輸和輸出流出流DataOutputStream類提供類提供直接讀寫直接讀寫8種基本種基本數(shù)據(jù)類型數(shù)據(jù)類型數(shù)據(jù)的方法。數(shù)據(jù)的方法。288.2.3 數(shù)據(jù)字節(jié)流數(shù)據(jù)字節(jié)流public class DataInputStream extends FilterInputStream implements DataInput public DataInputStream(InputStream in) /構(gòu)造方法構(gòu)造方法 public final shor

25、t readShort() throws IOException public final byte readByte() throws IOException public final int readInt() throws IOException /讀取整型讀取整型 public final long readLong() throws IOException public final float readFloat() throws IOException public final double readDouble() throws IOException public final

26、char readChar() throws IOException /讀取字符讀取字符 public final boolean readBoolean() throws IOException 291. DateInputStream類類構(gòu)造方法的參數(shù)類型是流類構(gòu)造方法的參數(shù)類型是流類2. DataOutputStream類類public class DataOutputStream extends FilterOutputStream implements DataOutput public DataOutputStream(OutputStream out) /構(gòu)造方法構(gòu)造方法 pub

27、lic final void writeByte(int v) throws IOException public final void writeShort(int v) throws IOException public final void writeInt(int v) throws IOException /寫入一個整型寫入一個整型 public final void writeLong(long v) throws IOException public final void writeFloat(float v) throws IOException public final vo

28、id writeDouble(double v) throws IOException public final void writeChar(int v) throws IOException /寫入一個字符寫入一個字符 public final void writeBoolean(boolean v) throws IOException public final void writeChars(String s) throws IOException /寫入一個字符串寫入一個字符串 public final int size() /返回實際寫入的字節(jié)數(shù)返回實際寫入的字節(jié)數(shù)30構(gòu)造方法的參

29、數(shù)類型是流類構(gòu)造方法的參數(shù)類型是流類【例例8.3】 使用數(shù)據(jù)流讀寫整數(shù)文件。使用數(shù)據(jù)流讀寫整數(shù)文件。 1.數(shù)據(jù)寫入文件的思路同標(biāo)準(zhǔn)輸出數(shù)據(jù)寫入文件的思路同標(biāo)準(zhǔn)輸出2.捕獲異??刂戚斎虢Y(jié)束捕獲異??刂戚斎虢Y(jié)束 31讀取文件過程需要與讀取文件過程需要與外設(shè)交互,容易出現(xiàn)外設(shè)交互,容易出現(xiàn)異常,所以需要進(jìn)行異常,所以需要進(jìn)行異常處理異常處理 正確讀取文件內(nèi)容的前提是:事先知道文件存儲的格式和正確讀取文件內(nèi)容的前提是:事先知道文件存儲的格式和順序,如順序,如IntFile例子中都是整形數(shù)據(jù);例子中都是整形數(shù)據(jù); 如果讀寫的文件里面有多種數(shù)據(jù)類型,如何讀寫,如把如果讀寫的文件里面有多種數(shù)據(jù)類型,如何讀寫

30、,如把IntFile修改為整形和修改為整形和double依次存取方式。依次存取方式。文件讀取的順序一定要和寫入順序完文件讀取的順序一定要和寫入順序完全一致,否則讀到的結(jié)果就不正確。全一致,否則讀到的結(jié)果就不正確。8.2.4 對象字節(jié)流對象字節(jié)流1.ObjectInputStream類類public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants public ObjectInputStream(InputStream in) /構(gòu)造方法構(gòu)造方法 public fi

31、nal Object readObject(); /讀取一個對象讀取一個對象 public int readInt(); 322. ObjectOutputStream類類public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants public ObjectOutputStream(OutputStream out) /構(gòu)造方法構(gòu)造方法 public final void writeObject(Object obj) ;/寫入一個對象寫入一個對象【例例8

32、.4】 使用對象流讀寫記錄式文件。使用對象流讀寫記錄式文件。33 為了把對象寫入文件,所有的對象為了把對象寫入文件,所有的對象(包括包括MyDate/Person/Student)都需要實現(xiàn)都需要實現(xiàn)Serializable接口接口; 如何從對象文件讀取出對象出來?如何從對象文件讀取出對象出來? Student stud = (Student)objin.readObject(); 同樣也需要保證按照對象讀取順序和寫入順序完全一致;同樣也需要保證按照對象讀取順序和寫入順序完全一致;各種輸入各種輸入/輸出流及其讀輸出流及其讀/寫方法寫方法 34 System.in.read只能按字節(jié)讀取,為了從

33、鍵盤讀取各種基本只能按字節(jié)讀取,為了從鍵盤讀取各種基本數(shù)據(jù)類型,需要使用數(shù)據(jù)類型,需要使用Scanner8.2.6 管道字節(jié)流管道字節(jié)流PipedInputStream類類PipedOutputStream類類建立管道流的方法建立管道流的方法 PipedInputStream in = new PipedInputStream();try PipedOutputStream out= new PipedOutputStream(in);catch(IOException ioe) 35 標(biāo)準(zhǔn)的輸入/輸出 文件讀寫操作 線程通信 網(wǎng)絡(luò)通信 這是第這是第1種創(chuàng)建管道并建立連接的方式;種創(chuàng)建管道并建

34、立連接的方式; 第第2種是先分別創(chuàng)建輸入、輸出管道流,再種是先分別創(chuàng)建輸入、輸出管道流,再使用使用connect方法將它們連接方法將它們連接【例例】 點對點的線程間管道通信。點對點的線程間管道通信。36 代碼中有一個發(fā)送線程,一個接收線程代碼中有一個發(fā)送線程,一個接收線程 發(fā)送線程和接收線程使用管道通信發(fā)送線程和接收線程使用管道通信 發(fā)送線程優(yōu)先級高于接收線程發(fā)送線程優(yōu)先級高于接收線程 發(fā)送線程向發(fā)送線程向PipedOutputStream依次寫入數(shù)據(jù)依次寫入數(shù)據(jù) 接收線程從接收線程從PipedInputStream依次讀取數(shù)據(jù)依次讀取數(shù)據(jù)【例例8.4】 使用管道流實現(xiàn)的發(fā)牌程序。使用管道流實

35、現(xiàn)的發(fā)牌程序。圖圖8.9 發(fā)牌程序中多個線程對象間的管道流發(fā)牌程序中多個線程對象間的管道流 37 在在7. 多線程部分,采用共享內(nèi)容和多線程協(xié)作方式完成此任務(wù)。多線程部分,采用共享內(nèi)容和多線程協(xié)作方式完成此任務(wù)。 本章的思路是:建立好本章的思路是:建立好4對管道輸入輸出流,對管道輸入輸出流,sender線程依次向線程依次向4個輸出個輸出管道寫數(shù)據(jù),管道寫數(shù)據(jù),4個個Receiver線程分別從自己的輸入管道流讀取數(shù)據(jù)。線程分別從自己的輸入管道流讀取數(shù)據(jù)。8.3 字符輸入字符輸入/輸出流類輸出流類8.3.1 抽象字符流抽象字符流8.3.2 字節(jié)字節(jié)/字符轉(zhuǎn)換流字符轉(zhuǎn)換流 8.3.3 文件字符流文件

36、字符流8.3.4 緩沖字符流緩沖字符流8.3.5 格式化字符輸出流格式化字符輸出流 8.3.6 Java標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入/輸出輸出388.3.1 抽象字符流抽象字符流1.Reader類類public abstract class Reader extends Object implements Readable, Closeable public int read(); /讀取單個字符。讀取單個字符。 public int read(char cbuf); / 將字符讀入數(shù)組。將字符讀入數(shù)組。 abstract public int read(char cbuf, int off, int l

37、en) ; / 將字符讀入數(shù)組的某一部分。將字符讀入數(shù)組的某一部分。 abstract public void close();392. Writer類類public abstract class Writer implements Appendable, Closeable, Flushable public void write(int c); /寫入單個字符。寫入單個字符。 public void write(char cbuf); /寫入字符數(shù)組。寫入字符數(shù)組。 public void write(String str); /將字符串寫入輸出流將字符串寫入輸出流 public Writ

38、er append(char c); /將指定字符添加到此將指定字符添加到此 writer。 public abstract void flush(); /將緩沖區(qū)內(nèi)容寫入輸出流將緩沖區(qū)內(nèi)容寫入輸出流 public abstract void close();40圖圖8.10 各種字符輸入各種字符輸入/輸出流的讀輸出流的讀/寫方法寫方法 8.3.2 字節(jié)字節(jié)/字符轉(zhuǎn)換流字符轉(zhuǎn)換流 1.InputStreamReader字節(jié)輸入流轉(zhuǎn)換成字符輸入流類字節(jié)輸入流轉(zhuǎn)換成字符輸入流類public class InputStreamReader extends Reader public InputStr

39、eamReader(InputStream in) /in指定字節(jié)輸入流作為數(shù)據(jù)源,采用默認(rèn)字符集指定字節(jié)輸入流作為數(shù)據(jù)源,采用默認(rèn)字符集 public InputStreamReader(InputStream in, String charsetName) /指定字符集名稱指定字符集名稱 throws UnsupportedEncodingException /不支持不支持charsetName字符集,拋出異常字符集,拋出異常 public String getEncoding() /返回字符集名稱字符串返回字符集名稱字符串2.字節(jié)輸出流轉(zhuǎn)換成字符輸出流字節(jié)輸出流轉(zhuǎn)換成字符輸出流Outpu

40、tStreamWriterpublic class OutputStreamWriter extends Writer public OutputStreamWriter(OutputStream out) /指定字節(jié)輸出流作為數(shù)據(jù)源,默認(rèn)字符集指定字節(jié)輸出流作為數(shù)據(jù)源,默認(rèn)字符集 public OutputStreamWriter(OutputStream out, Charset charset) /charset指定字符集指定字符集 public String getEncoding() /返回字符集名返回字符集名 實現(xiàn)數(shù)據(jù)在字節(jié)和不同編碼集中進(jìn)行轉(zhuǎn)換。實現(xiàn)數(shù)據(jù)在字節(jié)和不同編碼集中進(jìn)行轉(zhuǎn)

41、換。8.3.3 文件字符流文件字符流1.FileReader類類public class FileReader extends InputStreamReader public FileReader(String fileName) /構(gòu)造方法構(gòu)造方法 public FileReader(File file);讀文件的方法在讀文件的方法在InputStreamReader中實現(xiàn)中實現(xiàn)442. FileWriter類類public class FileWriter extends OutputStreamWriter public FileWriter(String fileName) /構(gòu)造方

42、法構(gòu)造方法 public FileWriter(String fileName, boolean append) ; public FileWriter(File file) ; public FileWriter(File file, boolean append) ;寫文件的方法在寫文件的方法在OutputStreamWriter中實現(xiàn)中實現(xiàn)45 FileWrite寫的文件是寫的文件是ASCII可讀的??勺x的。8.3.4 緩沖字符流緩沖字符流1.BufferedReader類類public class BufferedReader extends Reader public Buffere

43、dReader(Reader in) /構(gòu)造方法構(gòu)造方法 public String readLine() throws IOException /讀取一行字符串,輸入流結(jié)束時返回讀取一行字符串,輸入流結(jié)束時返回null2.BufferedWriter類類public class BufferedWriter extends Writer public BufferedWriter(Writer out) /構(gòu)造方法構(gòu)造方法 public BufferedWriter(Writer out, int sz) /sz指定字符緩沖區(qū)長度指定字符緩沖區(qū)長度 public void newLine()

44、 throws IOException /寫入一個換行符寫入一個換行符46FileReader按字符操作,效率低【例8.6】 將Fibonacci序列值寫入文本文件。8.3.5 格式化字符格式化字符輸出流輸出流 public class PrintWriter extends Writer public PrintWriter(OutputStream out, boolean autoFlush) /autoFlush指定是否立即傳輸,默認(rèn)指定是否立即傳輸,默認(rèn)false public void print(boolean bool) /輸出輸出boolean取值取值true或或false

45、public void print(char ch) public void print(int i) /將整數(shù)將整數(shù)i的取值轉(zhuǎn)換成字符串輸出的取值轉(zhuǎn)換成字符串輸出 public void print(long l) public void print(float f) public void print(double d) public void print(char s) public void print(String s) public void print(Object obj) /默認(rèn)調(diào)用默認(rèn)調(diào)用obj.toString()方法方法 public void println() /自

46、動追加回車換行符,其他重載方法參數(shù)同上自動追加回車換行符,其他重載方法參數(shù)同上 public PrintWriter format(String format, Object. args) . PrintWriter支持格式化的輸出,從支持格式化的輸出,從API幫助可以看出比幫助可以看出比BufferWriter功能更多。功能更多。8.4 文件操作文件操作8.4.1 文件操作類文件操作類8.4.2 文件過濾器接口文件過濾器接口8.4.3 文件對話框組件文件對話框組件8.4.4 隨機(jī)存取文件類隨機(jī)存取文件類488.4.1 文件操作類文件操作類1.File類的構(gòu)造方法類的構(gòu)造方法public cl

47、ass File extends Object implements Serializable, Comparable public File(String pathname) public File(String parent, String child) public File(File parent, String child)例如,例如,F(xiàn)ile file = new File(myfile.txt); File dir = new File(.,); /創(chuàng)建一個目錄文件對象,表示當(dāng)前目錄創(chuàng)建一個目錄文件對象,表示當(dāng)前目錄 File dir = new File(C:,); 492.

48、File類提供的方法類提供的方法1. 訪問文件對象方法訪問文件對象方法public String getName() /返回文件名,不包含路徑名返回文件名,不包含路徑名public String getPath() /返回相對路徑名,包含文件名返回相對路徑名,包含文件名public String getAbsolutePath() /返回絕對路徑名,包含文件名返回絕對路徑名,包含文件名public String getParent() /返回父文件對象的路徑名返回父文件對象的路徑名public File getParentFile() /返回父文件對象返回父文件對象2. 獲得或設(shè)置文件屬性獲得

49、或設(shè)置文件屬性 public long lastModified() /文件最后一次被修改的時間文件最后一次被修改的時間 public boolean setReadOnly() /設(shè)置文件只讀設(shè)置文件只讀3. 文件操作文件操作方法方法 public boolean createNewFile() /創(chuàng)建新文件創(chuàng)建新文件4. 目錄操作方法目錄操作方法 public boolean mkdir() /創(chuàng)建目錄創(chuàng)建目錄【例例】當(dāng)前目錄及子目錄的文件列表當(dāng)前目錄及子目錄的文件列表 。508.4.2 文件過濾器接口文件過濾器接口1.FileFilter和和FilenameFilter接口接口publi

50、c interface FileFilter public boolean accept(File pathname)public interface FilenameFilter public boolean accept(File dir, String name)2.獲得文件列表時使用過濾器獲得文件列表時使用過濾器public String list(FilenameFilter filter) /過濾顯示文件清單過濾顯示文件清單public File listFiles(FilenameFilter filter)public File listFiles(FileFilter fil

51、ter)【例例8.8】 帶過濾器的文件名列表。帶過濾器的文件名列表。51文件過濾器接口文件過濾器接口這些實例過濾這些實例過濾 File 類的類的 list 方法中的目錄清單。方法中的目錄清單。即即FilenameFilter的的accept方法會在調(diào)用方法會在調(diào)用File類類的的list方法時自動被調(diào)用。方法時自動被調(diào)用。 FilenameFilter過濾文件名,過濾文件名,F(xiàn)ileFilter過過濾文件路徑。濾文件路徑。528.4.3 文件對話框組件文件對話框組件public class JFileChooser extends JComponent implements Accessibl

52、e public static final int APPROVE_OPTION = 0; /單擊單擊“打開打開”或或“保存保存”按鈕按鈕 public static final int CANCEL_OPTION = 1; /單擊單擊“撤消撤消”按鈕按鈕 public static final int ERROR_OPTION = -1; /出錯出錯 public JFileChooser() public JFileChooser(String currentDirectoryPath) /初始路徑初始路徑 public JFileChooser(File currentDirectory

53、) public void setFileFilter(FileFilter filter) /設(shè)置文件過濾器設(shè)置文件過濾器 public int showOpenDialog(Component parent) throws HeadlessException /顯示打開文件對話框顯示打開文件對話框 public int showSaveDialog(Component parent) throws HeadlessException /顯示保存文件對話框顯示保存文件對話框 public File getSelectedFile() /返回選中文件返回選中文件532. JFileChoose

54、r的文件過濾器的文件過濾器public abstract class FileFilter extends Object public abstract boolean accept(File f) /過濾操作,過濾操作,f指定待過濾文件指定待過濾文件 public abstract String getDescription() /文件類型描述字符串文件類型描述字符串【例例8.9】 文本文件編輯器。文本文件編輯器。548.4.4 隨機(jī)存取文件類隨機(jī)存取文件類public class RandomAccessFile extends Object implements DataOutput,

55、DataInput, Closeable public RandomAccessFile(String name, String mode) throws FileNotFoundException public RandomAccessFile(File file, String mode) throws FileNotFoundException public final int readInt() throws IOException /讀一個整數(shù)類型值,當(dāng)讀到文件尾時,拋出讀一個整數(shù)類型值,當(dāng)讀到文件尾時,拋出EOFException異常異常 public final void wri

56、teInt(int v) throws IOException /寫入一個整型值寫入一個整型值 public long length() throws IOException /返回文件長度返回文件長度 public long getFilePointer() throws IOException /獲取文件指針位置獲取文件指針位置 public void seek(long pos) throws IOException /設(shè)置文件指針位置設(shè)置文件指針位置 public void close() throws IOException /關(guān)閉文件關(guān)閉文件 【例例8.11】 在文件中添加不重復(fù)數(shù)據(jù)。在文件中添加不重復(fù)數(shù)據(jù)。55總結(jié)總結(jié)目的:目的:使用流和文件操作。使用流和文件操作。要求:要求:(1)掌握字節(jié)流和字符流的功能和使用方法;)掌握字節(jié)流和字符流的功能和使用方法;(2)掌握文件操作的基本方法。)掌握文件操作的基本方法。重點:重點:(1)熟悉流在文件操作中的作用;)熟悉流在文件操作中的作用;(2)掌握對文件操作的)掌握對文件操作的File類;類;(3)理解文件過濾器、文件對話框和隨機(jī)存?。├斫馕募^濾器、文件對話框和隨機(jī)存取文件

溫馨提示

  • 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

提交評論