Java程序設(shè)計教學(xué)做一體化教程第7章輸入、輸出流.ppt_第1頁
Java程序設(shè)計教學(xué)做一體化教程第7章輸入、輸出流.ppt_第2頁
Java程序設(shè)計教學(xué)做一體化教程第7章輸入、輸出流.ppt_第3頁
Java程序設(shè)計教學(xué)做一體化教程第7章輸入、輸出流.ppt_第4頁
Java程序設(shè)計教學(xué)做一體化教程第7章輸入、輸出流.ppt_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2019/7/11,第 1 頁,注意:開始用功了!,2019/7/11,第 2 頁,配合例子源代碼一起使用,Power point 制作:耿祥義 張躍平,輸入、輸出流,Java程序設(shè)計教學(xué)做一體化教程 第7章,2019/7/11,第 3 頁,主要內(nèi)容,2019/7/11,第 4 頁,7.1 File類 7.1.1核心知識 _1,1構(gòu)造方法 File類在java.io包中,程序使用File的對象來獲取文件本身的一些信息,例如文件所在的目錄、文件的長度、文件讀寫權(quán)限等。File類的構(gòu)造方法有三個: File(String filename); File(String directoryPath,String filename); File(File dir, String filename); 其中,filename是文件名字,directoryPath是文件的路徑,dir為一個目錄。使用File(String filename)創(chuàng)建文件時,該文件被認(rèn)為與當(dāng)前應(yīng)用程序在同一目錄中。,2019/7/11,第 5 頁,7.1.1 核心知識 _2,2File類的常用方法 public String getName() 獲取文件的名字。 public boolean canRead() 判斷文件是否是可讀的。 public boolean canWrite() 判斷文件是否可被寫入。 public boolean exits() 判斷文件是否存在。 public long length() 獲取文件的長度(單位是字節(jié))。 public String getAbsolutePath() 獲取文件的絕對路徑。 public String getParent() 獲取文件的父目錄。 public boolean isFile() 判斷文件是否是一個普通文件,而不是目錄。 public boolean isDirectroy() 判斷文件是否是一個目錄。 public boolean isHidden() 判斷文件是否是隱藏文件。 public long lastModified() 獲取文件最后修改的時間(時間是從1970年午夜至文件最后修改時刻的毫秒數(shù))。 更多方法見page 140.,2019/7/11,第 6 頁,7.1.2 能力目標(biāo),掌握File類的常用方法 。,2019/7/11,第 7 頁,7.1.3 任務(wù)驅(qū)動,將下列Application7_1.java中的【代碼】替換為程序代碼。 程序運(yùn)行效果如圖7.1。,2019/7/11,第 8 頁,任務(wù)小結(jié),(1) 使用File類創(chuàng)建一個文件對象后,例如 File file = new File(“c:myletter“,“l(fā)etter.txt“); 如果c:myletter目錄中沒有名字為letter.txt文件,文件對象file調(diào)用方法: public boolean createNewFile(); 可以在c:myletter目錄中建立一個名字為letter.txt的文件。 (2) 文件對象調(diào)用方法 public boolean delete() 可以刪除當(dāng)前文件,例如: file.delete();,2019/7/11,第 9 頁,7.1.4 實踐環(huán)節(jié),上機(jī)調(diào)試下列程序,并注意Runtime對象是怎樣運(yùn)行windows平臺上的記事本程序和瀏覽器程序的。 Appilcation7_2.java,2019/7/11,第 10 頁,7.2 文件字節(jié)輸入流 7.2.1 核心知識_1,FileInputStream類的對象稱為文件字節(jié)輸入流,文件字節(jié)輸入流以字節(jié)為單位讀取文件中的內(nèi)容。 1創(chuàng)建指向文件的字節(jié)輸入流 使用FileInputStream類的下列構(gòu)造方法創(chuàng)建指向文件的輸入流。 FileInputStream(String name); FileInputStream(File file); 程序必須在try-catch語句中的try塊部分創(chuàng)建輸入流、在catch(捕獲)塊部分檢測并處理這個異常。例如,為了讀取一個名為hello.txt的文件,建立一個文件字節(jié)輸入流in:,或 File f = new File(“hello.txt“); try FileInputStream in = new FileInputStream(f); catch (IOException e) System.out.println(“File read error:“+e ); ,try FileInputStream in = new FileInputStream(“hello.txt“); catch (IOException e) System.out.println(“File read error:“+e ); ,2019/7/11,第 11 頁,7.2.1 核心知識 _2,2以字節(jié)為單位讀文件 文件字節(jié)流可以調(diào)用從父類(InputStream)繼承的read方法順序地、以字節(jié)為單位讀取文件,只要不關(guān)閉流,每次調(diào)用read方法就順序地讀取文件中的其余內(nèi)容,直到文件的末尾或文件字節(jié)輸入流被關(guān)閉。 int read() 輸入流調(diào)用該方法從源中讀取單個字節(jié)的數(shù)據(jù),該方法返回字節(jié)值(0255之間的一個整數(shù)),如果未讀出字節(jié)就返回-1。 int read(byte b) 輸入流調(diào)用該方法從源中試圖讀取b.length個字節(jié)到字節(jié)數(shù)組b中,返回實際讀取的字節(jié)數(shù)目。如果到達(dá)文件的末尾,則返回-1。 int read(byte b, int off, int len) 輸入流調(diào)用該方法從源中試圖讀取len個字節(jié)到字節(jié)數(shù)組b中,并返回實際讀取的字節(jié)數(shù)目。如果到達(dá)文件的末尾,則返回-1,參數(shù)off指定從字節(jié)數(shù)組的某個位置開始存放讀取的數(shù)據(jù)。 例如,如果文件字節(jié)輸入流in指向的文件的內(nèi)容是“apple is very good“,那么in首次調(diào)用read()方法: int m=in.read(); 將讀取文件中的第一個字節(jié),即讀取到字母a,并返回字母a的字節(jié)值(97),即m的值是97。,2019/7/11,第 12 頁,7.2.1 核心知識 _3,3關(guān)閉流 輸入流都提供了關(guān)閉方法close(),盡管程序結(jié)束時會自動關(guān)閉所有打開的流,但是當(dāng)程序使用完流后,顯式地關(guān)閉任何打開的流仍是一個良好的習(xí)慣。如果沒有關(guān)閉那些被打開的流,那么就可能不允許另一個程序操作這些流所用的資源。,2019/7/11,第 13 頁,7.2.2 能力目標(biāo),使用文件字節(jié)輸入流讀取文件 。,2019/7/11,第 14 頁,7.2.3 任務(wù)驅(qū)動,將下列Application7_3.java中的【代碼】替換為程序代碼。 程序運(yùn)行效果如圖7.2。,2019/7/11,第 15 頁,任務(wù) 小結(jié),程序在運(yùn)行期間,可能需要從外部的存儲媒介或其他程序中讀入所需要的數(shù)據(jù),這就需要使用輸入流。輸入流的指向稱為它的源,程序通過輸入流讀取源中的數(shù)據(jù)。比如,程序需要讀取文件,那么就可以使用FileInputStream建立一個和文件相連接的文件字節(jié)輸入流,如圖7.3所示。,使用輸入流通常包括4個基本步驟: (1)設(shè)定輸入流的源,比如磁盤上的文件。 (2)創(chuàng)建指向源的輸入流 (3)讓輸入流讀取源中的數(shù)據(jù) (4)關(guān)閉輸入流。,2019/7/11,第 16 頁,7.3 文件字節(jié)輸出流 7.3.1 核心知識_1,FileOutputStream類的對象稱為文件字節(jié)輸出流,文件字節(jié)輸出流以字節(jié)為單位向文件寫入數(shù)據(jù),即以字節(jié)為單位寫文件。 1創(chuàng)建指向文件的文件字節(jié)輸出流 可以使用FileOutputStream類的下列具有刷新功能的構(gòu)造方法創(chuàng)建指向文件的輸出流。 FileOutputStream(String name); FileOutputStream(File file); 需要特別注意的是,如果輸出流指向的文件不存在,Java就會創(chuàng)建該文件,如果執(zhí)向的文件是已存在的文件,輸出流將刷新該文件。 可以使用FileOutputStream類的下列能選擇是否具有刷新功能的構(gòu)造方法創(chuàng)建指向文件的輸出流。 FileOutputStream(String name, boolean append); FileOutputStream(File file, boolean append);,2019/7/11,第 17 頁,7.3.1 核心知識 _2,2以字節(jié)為單位寫文件 文件字節(jié)流可以調(diào)用從父類繼承的write方法順序地寫文件。FileOutStream流順序地向文件寫入內(nèi)容,即只要不關(guān)閉流,每次調(diào)用write方法就順序地向文件寫入內(nèi)容,直到流被關(guān)閉。 void write(int n) 輸出流調(diào)用該方法向文件寫入單個字節(jié)。 void write(byte b) 輸出流調(diào)用該方法向文件寫入一個字節(jié)數(shù)組。 void write(byte b,int off,int len) 給定字節(jié)數(shù)組中起始于偏移量off處取len個字節(jié)寫到文件。 void close() 關(guān)閉輸出流。,2019/7/11,第 18 頁,7.3.2 能力目標(biāo),能使用文件字節(jié)輸出流寫文件 。,2019/7/11,第 19 頁,7.3.3 任務(wù)驅(qū)動,將下列Application7_4.java中的【代碼】替換為程序代碼。 程序運(yùn)行效果如圖7.4 。,2019/7/11,第 20 頁,任務(wù) 小結(jié),程序在處理數(shù)據(jù)后,要將處理的結(jié)果寫入到永久的存儲媒介中或傳送給其他的應(yīng)用程序,就需要使用輸出流。輸出流的指向稱為它的目的地,程序通過輸出流把數(shù)據(jù)傳送到目的地。比如,程序需要將數(shù)據(jù)寫入到文件,那么就可以使用FileOutputStream建立一個和文件相連接的文件字節(jié)輸出流,如圖7.5所示。,使用輸出流通常包括4個基本步驟: (1)給出輸出流的目的地,比磁盤上的文件 (2)創(chuàng)建指向目的地的輸出流 (3)讓輸出流把數(shù)據(jù)寫入到目的地 (4)關(guān)閉輸出流。,2019/7/11,第 21 頁,7.3.4 實踐環(huán)節(jié),上機(jī)調(diào)試程序,觀察程序的運(yùn)行結(jié)果。 Application7_5.java,2019/7/11,第 22 頁,7.4 文件字符輸入、輸出流 7.4.1 核心知識,文件字節(jié)輸入、輸出流以字節(jié)為單位處理數(shù)據(jù)。因此,字節(jié)流不能很好地操作Unicode字符,比如,一個漢字在文件中占用2個字節(jié),如果使用字節(jié)流,讀取不當(dāng)會出現(xiàn)“亂碼”現(xiàn)象。 與FileInputStream、FileOutputStream字節(jié)流相對應(yīng)的是FileReader、FileWriter字符流,F(xiàn)ileReader和FileWriter分別是Reader和Writer的子類,其構(gòu)造方法分別是: FileReader(String filename); FileReader(File filename); FileWriter (String filename); FileWriter (File filename); FileWriter (String filename,boolean append); FileWriter (File filename,boolean append); 字符輸入流和輸出流的read和write方法使用字符數(shù)組讀寫數(shù)據(jù),即以字符為基本單位處理數(shù)據(jù)。,2019/7/11,第 23 頁,7.4.2 能力目標(biāo),使用文件字符輸入、輸出流讀寫文件 。,2019/7/11,第 24 頁,7.4.3 任務(wù)驅(qū)動,將Application7_6.java中的【代碼】替換為程序代碼。 程序運(yùn)行效果如圖7.6。,2019/7/11,第 25 頁,任務(wù) 小結(jié),Writer字符流的write方法將數(shù)據(jù)首先寫入到緩沖區(qū),每當(dāng)緩沖區(qū)溢出時,緩沖區(qū)的內(nèi)容被自動寫入到目的地,如果關(guān)閉流,緩沖區(qū)的內(nèi)容會立刻被寫入到目的地。 流調(diào)用flush()方法可以立刻沖洗當(dāng)前緩沖區(qū),即將當(dāng)前緩沖區(qū)的內(nèi)容寫入到目的地。因此,當(dāng)使用字符輸出流完成數(shù)據(jù)寫入之后,一定要關(guān)閉輸出流。,2019/7/11,第 26 頁,7.5 緩沖流 7.5.1 核心知識_1,如果按行讀取文件的內(nèi)容,那么在不清楚一行有多少個字符的情況下,F(xiàn)ileReader流的read方法很難完成這樣的任務(wù)。 1BufferReader流 BufferedReader流稱為緩沖輸入流,相對于FileReader流,緩沖輸入流增強(qiáng)了讀文件的能力。 通過向BufferedReader傳遞一個Reader子類的對象(如FileReader的實例),來創(chuàng)建一個BufferedReader對象,如: FileReader inOne = new FileReader(“Student.txt“) BufferedReader inTwo = BufferedReader(inOne); 上述代碼可以通俗地理解成inTwo流和inOne流連接在了一起,那么inTwo流也就可以讀取inOne流指向的文件了,比如inTwo流就具有readLine()方法(按行讀取文件),例如: String strLine = inTwo.readLine();,2019/7/11,第 27 頁,7.5.1 核心知識 _2,2BufferWriter流 BufferedWriter流稱為緩沖輸入流,相對于FileWriter流,緩沖輸出流增強(qiáng)了寫文件的能力。可以將BufferedWriter流和FileWriter流連接在一起,然后使用BufferedWriter流將數(shù)據(jù)寫到目的地,例如: FileWriter tofile = new FileWriter(“hello.txt“); BufferedWriter out = BufferedWriter(tofile); 然后out使用BufferedReader類的方法 write(String s,int off,int len) 把字符串s寫到hello.txt中,參數(shù)off是s開始處的偏移量,len是寫入的字符數(shù)量。 另外,BufferedWriter流有一個獨(dú)特的向文件寫入一個回行符的方法:newLine();,2019/7/11,第 28 頁,7.5.2 能力目標(biāo),使用緩沖流讀寫文件 。,2019/7/11,第 29 頁,7.5.3 任務(wù)驅(qū)動,將下列Application7_7.java中的【代碼】替換為程序代碼 。 english.txt 程序運(yùn)行效果如圖7.7。,2019/7/11,第 30 頁,任務(wù) 小結(jié),可以把BufferedReader和BufferedWriter稱為上層流,把它們指向的字符流稱為底層流。 底層字符輸入流首先將數(shù)據(jù)讀入緩存,BufferedReader流再從緩存讀取數(shù)據(jù);BufferedWriter流將數(shù)據(jù)寫入緩存,底層字符輸出流會不斷地將緩存中的數(shù)據(jù)寫入到目的地。 當(dāng)BufferedWriter流調(diào)用flush()刷新緩存或調(diào)用close()方法關(guān)閉時,即使緩存沒有溢滿,底層流也會立刻將緩存的內(nèi)容寫入目的地。 關(guān)閉輸出流時要首先關(guān)閉緩沖輸出流,然后關(guān)閉緩沖輸出流指向的流。在編寫代碼時只需關(guān)閉上層流,那么上層流的底層流將自動關(guān)閉。,2019/7/11,第 31 頁,7.5.4 實踐環(huán)節(jié),test.txt是一套標(biāo)準(zhǔn)化考試的試題文件。 下面的代碼每次讀取試題文件中的一道題目,并等待用戶回答,用戶做完全部題目后,程序給出用戶的得分。 調(diào)試下列代碼,并注意程序是怎樣使用輸入流讀取試題文件的,程序效果如圖7.8。 Application7_8.java StandardExam.java,2019/7/11,第 32 頁,7.6 隨機(jī)流 7.6.1 核心知識_1,1RandomAccessFile類 RandomAccessFile類創(chuàng)建的流稱作隨機(jī)流,RandomAccessFile流的指向既可以作為源、也可以作為目的地。簡單地說,使用RandomAccessFile流不僅能讀文件,也可以寫文件。以下是RandomAccessFile類的兩個構(gòu)造方法。 RandomAccessFile(String name,String mode) 參數(shù)name 用來確定一個文件名,給出創(chuàng)建的流的源,也是流目的地。參數(shù)mode取r(只讀)或rw(可讀寫),決定創(chuàng)建的流對文件的訪問權(quán)利。 RandomAccessFile(File file,String mode) 參數(shù)file 是一個File對象,給出創(chuàng)建的流的源,也是流目的地。參數(shù)mode取r(只讀)或rw(可讀寫),決定創(chuàng)建的流對文件的訪問權(quán)利。,2019/7/11,第 33 頁,7.6.1 核心知識 _2,2常用方法 RandomAccessFile類中有一個方法seek(long a),用來定位RandomAccessFile流的讀寫位置,其中參數(shù)a確定讀寫位置距離文件開頭的字節(jié)個數(shù)。調(diào)用getFilePointer()方法獲取流的當(dāng)前讀寫位置。 RondomAccessFile流的readLine()方法按行讀取文件,但在讀取含有非ASCII字符的文件時會出現(xiàn)“亂碼”現(xiàn)象,因此,需要把readLine()讀取的字符串用“iso-8859-1”編碼重新編碼存放到byte數(shù)組中,然后再用當(dāng)前機(jī)器的默認(rèn)編碼將該數(shù)組轉(zhuǎn)化為字符串,操作如下: (1) 讀取 String str = in.readLine(); (2) 用“iso-8859-1”重新編碼 byte b = str.getBytes(“iso-8859-1“); (3) 使用當(dāng)前機(jī)器的默認(rèn)編碼將字節(jié)數(shù)組轉(zhuǎn)化為字符串 String content = new String(b);,2019/7/11,第 34 頁,7.6.2 能力目標(biāo),能使用RondomAccessFile流讀取文件 。,2019/7/11,第 35 頁,7.6.3 任務(wù)驅(qū)動,將下列Application7_9.java中的【代碼】替換為程序代碼 。 程序運(yùn)行效果如圖7.9。,2019/7/11,第 36 頁,任務(wù) 小結(jié),與前面的輸入、輸出流不同的是,RandomAccessFile類既不是InputStream類的子類,也不是OutputStram類的子類。 當(dāng)準(zhǔn)備對一個文件進(jìn)行讀寫操作時,可以創(chuàng)建一個指向該文件的隨機(jī)流,可以從這個隨機(jī)流讀取文件的數(shù)據(jù),也可以通過這個隨機(jī)流寫數(shù)據(jù)到文件。 另外,隨機(jī)流指向文件時,不刷新文件。,2019/7/11,第 37 頁,表7.1 RandomAccessFile類的常用方法,2019/7/11,第 38 頁,7.6.4 實踐環(huán)節(jié),表7.1是RandomAccessFile流的常用方法。 下列代碼將幾個整數(shù)寫入文件,然后按寫入的順序倒序讀出所寫入的整數(shù)。上機(jī)調(diào)試下列代碼,熟悉RandomAccessFile流的常用方法。 Application7_10.java,2019/7/11,第 39 頁,7.7 數(shù)據(jù)流 7.7.1 核心知識_1,DataInputStream和DataOutputStream類創(chuàng)建的對象稱為數(shù)據(jù)輸入流和數(shù)據(jù)輸出流。 它們允許程序按著機(jī)器無關(guān)的風(fēng)格讀取Java原始數(shù)據(jù)。 以下是DataInputStream和DataOutputStream的構(gòu)造方法。 DataInputStream(InputStream in)創(chuàng)建的數(shù)據(jù)輸入流指向一個由參數(shù)in指定的底層輸入流。 DataOutputStream(OutnputStream out)創(chuàng)建的數(shù)據(jù)輸出流指向一個由參數(shù)out指定的底層輸出流。 表7.2是DataInputStream和DataOutputStream類的常用方法。,2019/7/11,第 40 頁,表7.2 DataInputStream及DataOutputSteam類的部分方法,2019/7/11,第 41 頁,7.7.2 能力目標(biāo),使用數(shù)據(jù)流讀、寫文件 。,2019/7/11,第 42 頁,7.7.3 任務(wù)驅(qū)動,將下列Application7_11.java中的【代碼】替換為程序代碼. 程序運(yùn)行效果如圖7.10,2019/7/11,第 43 頁,任務(wù) 小結(jié),數(shù)據(jù)流輸入流不能直接指向文件,必須指向一個InputStream子類創(chuàng)建的流,這個流稱為數(shù)據(jù)輸入流的底層流,底層流負(fù)責(zé)指向文件。 同樣,數(shù)據(jù)流輸出流不能直接指向文件,必須指向一個OutputStream子類創(chuàng)建的流,這個流稱為數(shù)據(jù)輸出流的底層流,底層流負(fù)責(zé)指向文件。,2019/7/11,第 44 頁,7.7.4 實踐環(huán)節(jié),請上機(jī)調(diào)試下列代碼,并注意程序的運(yùn)行效果。 Application7_12.java EncryptAndDecrypt.java,2019/7/11,第 45 頁,7.8 解析文件 7.8.1 核心知識,1使用默認(rèn)分隔標(biāo)記解析文件 創(chuàng)建Scanner對象,并指向要解析的文件,例如: File file = new File(“hello.java“); Scanner sc = new Scanner(file); 那么sc將空格作為分隔標(biāo)記、調(diào)用next()方法依次返回file中的單詞,如果file最后一個單詞已被next()方法返回,sc調(diào)用hasNext()將返回false,否則返回true。 2使用正則表達(dá)式作為分隔標(biāo)記解析文件 創(chuàng)建Scanner對象,指向要解析的文件,并使用useDelimiter方法指定正則表達(dá)式作為分隔標(biāo)記,例如: File file = new File(“hello.java“); Scan

溫馨提示

  • 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

提交評論