




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java語(yǔ)言程序設(shè)計(jì)(第2版)第 6 章 輸入/輸出流和文件2目錄 6.1 輸入/輸出流 6.2 文件讀寫 6.3 本章小結(jié)36.1 輸入/輸出流 通常程序需要從外部獲取/輸出信息 這個(gè)“外部”范圍很廣,包括諸如鍵盤、顯示器、文件、磁盤、網(wǎng)絡(luò)、另外一個(gè)程序等 “信息”也可以是任何類型的,例如一個(gè)對(duì)象、串字符、圖像、聲音等 通過使用java.io包中的輸入/輸出流類就可以達(dá)到輸入輸出信息的目的46.1.1 I/O流的概念 I/O流(Input/Output) 在Java中將信息的輸入與輸出過程抽象為I/O流 輸入是指數(shù)據(jù)流入程序 輸出是指數(shù)據(jù)從程序流出 一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列 I
2、O流類一旦被創(chuàng)建就會(huì)自動(dòng)打開 通過調(diào)用close方法,可以顯式關(guān)閉任何一個(gè)流,如果流對(duì)象不再被引用,Java的垃圾回收機(jī)制也會(huì)隱式地關(guān)閉它6.1 輸入/輸出流5 輸入流 為了從信息源獲取信息,程序打開一個(gè)輸入流,程序可從輸入流讀取信息 輸出流 當(dāng)程序需要向目標(biāo)位置寫信息時(shí),便需要打開一個(gè)輸出流,程序通過輸出流向這個(gè)目標(biāo)位置寫信息6.1.1 I/O流的概念(續(xù)) 6.1 輸入/輸出流6對(duì)象對(duì)象源源? 目標(biāo)目標(biāo)? 或兩者或兩者?disk file running program monitor keyboard Internet connection image scanner mouse Bot
3、hBothDestinationSourceBothSourceSource6.1.1 I/O流的概念(續(xù))源和目標(biāo)的類型6.1 輸入/輸出流7 不論數(shù)據(jù)從哪來(lái),到哪去,也不論數(shù)據(jù)本身是何類型,讀寫數(shù)據(jù)的方法大體上都是一樣的:6.1.1 I/O流的概念(續(xù))讀寫數(shù)據(jù)的方法讀寫打開一個(gè)流讀信息關(guān)閉流打開一個(gè)流寫信息關(guān)閉流6.1 輸入/輸出流86.1.2 預(yù)定義的I/O流類概述 輸入/輸出流可以從以下幾個(gè)方面進(jìn)行分類 從流的方向劃分 輸入流 輸出流 從流的分工劃分 節(jié)點(diǎn)流 處理流 從流的內(nèi)容劃分 面向字符的流 面向字節(jié)的流6.1 輸入/輸出流9 面向字符的流:專門用于字符數(shù)據(jù) 面向字節(jié)的流:用于一
4、般目的6.1.2 預(yù)定義的I/O流類概述(續(xù))java.io包的頂級(jí)層次結(jié)構(gòu)6.1 輸入/輸出流106.1.2 預(yù)定義的I/O流類概述(續(xù))面向字符的流 面向字符的流 針對(duì)字符數(shù)據(jù)的特點(diǎn)進(jìn)行過優(yōu)化,提供一些面向字符的有用特性 源或目標(biāo)通常是文本文件6.1 輸入/輸出流11 實(shí)現(xiàn)內(nèi)部格式和文本文件中的外部格式之間轉(zhuǎn)換 內(nèi)部格式:16-bit char 數(shù)據(jù)類型 外部格式: UTF(Universal character set Transformation Format):很多人稱之為Universal Text Format 包括ASCII 碼及非ASCII 碼字符,比如: 斯拉夫(Cyril
5、lic)字符, 希臘字符,亞洲字符等6.1.2 預(yù)定義的I/O流類概述(續(xù))面向字符的流6.1 輸入/輸出流12 面向字符的抽象類Reader和Writer java.io包中所有字符流的抽象基類 Reader提供了輸入字符的API Writer提供了輸出字符的API 它們的子類又可分為兩大類 節(jié)點(diǎn)流:從數(shù)據(jù)源讀入數(shù)據(jù)或往目的地寫出數(shù)據(jù) 處理流:對(duì)數(shù)據(jù)執(zhí)行某種處理 多數(shù)程序使用這兩個(gè)抽象類的一系列子類來(lái)讀入/寫出文本信息 例如FileReader/FileWriter用來(lái)讀/寫文本文件6.1.2 預(yù)定義的I/O流類概述(續(xù))面向字符的流6.1 輸入/輸出流136.1.2 預(yù)定義的I/O流類概述
6、(續(xù))面向字符的流陰影部分為節(jié)點(diǎn)流6.1 輸入/輸出流14 數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來(lái)輸入/輸出 通常被用來(lái)讀寫諸如圖片、聲音之類的二進(jìn)制數(shù)據(jù) 絕大多數(shù)數(shù)據(jù)是被存儲(chǔ)為二進(jìn)制文件的,世界上的文本文件大約只能占到2,通常二進(jìn)制文件要比含有相同數(shù)據(jù)量的文本文件小得多6.1.2 預(yù)定義的I/O流類概述(續(xù))面向字節(jié)的流6.1 輸入/輸出流15 InputStream和OutputStream 是用來(lái)處理8位字節(jié)流的抽象基類,程序使用這兩個(gè)類的子類來(lái)讀寫8位的字節(jié)信息 分為兩部分 節(jié)點(diǎn)流 處理流6.1.2 預(yù)定義的I/O流類概述(續(xù))面向字節(jié)的流6.1 輸入/輸出流166.1.2 預(yù)定
7、義的I/O流類概述(續(xù))面向字節(jié)的流陰影部分為節(jié)點(diǎn)流6.1 輸入/輸出流17 標(biāo)準(zhǔn)輸入輸出流對(duì)象 System類的靜態(tài)成員變量 包括 System.in: InputStream類型的,代表標(biāo)準(zhǔn)輸入流,這個(gè)流是已經(jīng)打開了的,默認(rèn)狀態(tài)對(duì)應(yīng)于鍵盤輸入。 System.out:PrintStream類型的,代表標(biāo)準(zhǔn)輸出流,默認(rèn)狀態(tài)對(duì)應(yīng)于屏幕輸出 System.err:PrintStream類型的,代表標(biāo)準(zhǔn)錯(cuò)誤信息輸出流,默認(rèn)狀態(tài)對(duì)應(yīng)于屏幕輸出6.1.2 預(yù)定義的I/O流類概述(續(xù))標(biāo)準(zhǔn)輸入輸出6.1 輸入/輸出流186.1.2 預(yù)定義的I/O流類概述(續(xù))標(biāo)準(zhǔn)輸入輸出 標(biāo)準(zhǔn)I/O重新導(dǎo)向 setIn
8、(InputStream): 設(shè)置標(biāo)準(zhǔn)輸入流 setOut(PrintStream):設(shè)置標(biāo)準(zhǔn)輸出流 setErr(PrintStream):設(shè)置標(biāo)準(zhǔn)錯(cuò)誤輸出流6.1 輸入/輸出流19 從鍵盤讀入信息并在顯示器上顯示import java.io.*;public class Echo public static void main(String args) throws IOException BufferedReader in = new BufferedReader( new InputStreamReader(System.in); String s; while(s = in.read
9、Line().length() != 0) System.out.println(s); 6.1.2 預(yù)定義的I/O流類概述(續(xù))例6-1運(yùn)行結(jié)果運(yùn)行結(jié)果Hello!Hello!6.1 輸入/輸出流20 System.in 程序啟動(dòng)時(shí)由Java系統(tǒng)自動(dòng)創(chuàng)建的流對(duì)象,它是原始的字節(jié)流,不能直接從中讀取字符,需要對(duì)其進(jìn)行進(jìn)一步的處理 InputStreamReader(System.in) 以System.in為參數(shù)創(chuàng)建一個(gè)InputStreamReader流對(duì)象,相當(dāng)于字節(jié)流和字符流之間的一座橋梁,讀取字節(jié)并將其轉(zhuǎn)換為字符 BufferedReader in 對(duì)InputStreamReader
10、處理后的信息進(jìn)行緩沖,以提高效率6.1.2 預(yù)定義的I/O流類概述(續(xù))例6-1說明6.1 輸入/輸出流21 處理流 不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)流來(lái)構(gòu)造 從流讀寫數(shù)據(jù)的同時(shí)對(duì)數(shù)據(jù)進(jìn)行處理 例6-1中的InputStreamReader和BufferedReader都屬于處理流 InputStreamReader讀取字節(jié)并轉(zhuǎn)換為字符 BufferedReader對(duì)另一個(gè)流產(chǎn)生的數(shù)據(jù)進(jìn)行緩沖6.1.2 預(yù)定義的I/O流類概述(續(xù))處理流6.1 輸入/輸出流22用一行表達(dá)式實(shí)現(xiàn):BufferedReader stdin = new BufferedReader ( new InputS
11、treamReader(System.in) ); 6.1.2 預(yù)定義的I/O流類概述(續(xù))處理流6.1 輸入/輸出流23 IO異常 多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào)用這些方法時(shí)必須 在方法頭聲明拋出IOException異常 或者在try塊中執(zhí)行IO,然后捕獲IOException6.1.2 預(yù)定義的I/O流類概述(續(xù))I/O異常6.1 輸入/輸出流246.2 文件讀寫 寫文本文件 讀文本文件 寫二進(jìn)制文件 讀二進(jìn)制文件 File類 處理壓縮文件 對(duì)象序列化 隨機(jī)文件讀寫256.2.1 寫文本文件 本節(jié)知識(shí)點(diǎn) FileWriter類 創(chuàng)建一個(gè)磁盤文件 關(guān)閉一個(gè)磁盤文件 write(
12、) 方法 捕獲I/O異常 BufferedWriter 類6.2 文件讀寫26 在C盤根目錄創(chuàng)建文本文件Hello.txt,并往里寫入若干行文本import java.io.*; class FileWriterTester public static void main ( String args ) throws IOException /main方法中聲明拋出IO異常 String fileName = C:Hello.txt; FileWriter writer = new FileWriter( fileName ); writer.write( Hello!n); writer.w
13、rite( This is my first text file,n ); writer.write( You can see how this is done.n ); writer.write(輸入一行中文也可以n); writer.close(); 6.2.1 寫文本文件(續(xù))例6-26.2 文件讀寫27 打開C盤根目錄下的Hello.txt文件換行有些問題,例6-4中將解決這個(gè)問題6.2.1 寫文本文件(續(xù))例6-2運(yùn)行結(jié)果6.2 文件讀寫28 每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的”Hello.txt”文件,創(chuàng)建一個(gè)新的同名文件 FileWriter的構(gòu)造方法有五個(gè),本例是通過一個(gè)字符
14、串指定文件名來(lái)創(chuàng)建 FileWriter類的write方法向文件中寫入字符6.2 文件讀寫6.2.1 寫文本文件(續(xù))例6-2說明29 Writer類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式的轉(zhuǎn)換 “Hello.txt”是一個(gè)普通的ASCII碼文本文件,每個(gè)英文字符占一個(gè)字節(jié),中文字符占兩個(gè)字節(jié) Java程序中的字符串則是每個(gè)字符占兩個(gè)字節(jié)的,采用Unicode編碼 close方法清空流里的內(nèi)容并關(guān)閉它。如果不調(diào)用該方法,可能系統(tǒng)還沒有完成所有數(shù)據(jù)的寫操作,程序就結(jié)束了6.2.1 寫文本文件(續(xù))例6-2說明(續(xù))6.2 文件讀寫30 處理IO異常import java.io.*; class F
15、ileWriterTester public static void main ( String args ) String fileName = c:Hello.txt ; try /將所有IO操作放入try塊中 FileWriter writer = new FileWriter( fileName ,true ); writer.write( Hello!n); writer.write( This is my first text file,n ); writer.write( You can see how this is done. n ); writer.write(輸入一行中文
16、也可以n); writer.close(); catch ( IOException iox) System.out.println(Problem writing + fileName ); 6.2.1 寫文本文件(續(xù))例6-36.2 文件讀寫31 運(yùn)行此程序,會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又追加了重復(fù)的內(nèi)容,這就是將構(gòu)造方法的第二個(gè)參數(shù)設(shè)為true的效果 如果將文件屬性改為只讀屬性,再運(yùn)行本程序,就會(huì)出現(xiàn)IO錯(cuò)誤,程序?qū)⑥D(zhuǎn)入catch塊中,給出出錯(cuò)信息6.2.1 寫文本文件(續(xù))例6-3說明6.2 文件讀寫32 BufferedWriter類 如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的緩沖器流類
17、BufferedWriter FileWriter和BufferedWriter類都用于輸出字符流,包含的方法幾乎完全一樣,但BufferedWriter多提供了一個(gè)newLine()方法用于換行 不同廠家生產(chǎn)的計(jì)算機(jī) (IBM, Apple, VAX, Sun) 對(duì)文字的換行方法不同。newLine()方法可以輸出在當(dāng)前計(jì)算機(jī)上正確的換行符6.2.1 寫文本文件(續(xù))BufferedWriter類6.2 文件讀寫33 使用BufferedWriter完成例6-2實(shí)現(xiàn)的功能import java.io.*; class BufferedWriterTester public static vo
18、id main ( String args ) throws IOExceptionString fileName = C:/newHello.txt ;BufferedWriter out = new BufferedWriter( new FileWriter( fileName ) ); out.write( Hello! ); out.newLine() ; out.write( This is another text file using BufferedWriter, ); out.newLine(); ; out.write( So I can use a common way
19、 to start a newline ); out.close(); 6.2.1 寫文本文件(續(xù))例6-46.2 文件讀寫34 用任何文本編輯器打開newHello.txt都會(huì)出現(xiàn)正確的換行效果6.2.1 寫文本文件(續(xù))例6-4運(yùn)行結(jié)果6.2 文件讀寫356.2.2 讀文本文件 本節(jié)知識(shí)點(diǎn) Reader FileReader BufferedReader和readLine() 文本文件復(fù)制 6.2 文件讀寫36 FileReader類 從文本文件中讀取字符 繼承自Reader抽象類的子類InputStreamReader BufferedReader 讀文本文件的緩沖器類 具有readLi
20、ne()方法,可以對(duì)換行符進(jìn)行鑒別,一行一行地讀取輸入流中的內(nèi)容 繼承自Reader6.2.2 讀文本文件(續(xù)) 6.2 文件讀寫376.2.2 讀文本文件(續(xù)) 文件輸入方法:BufferedReader in = new BufferedReader(new FileReader( fileName) ); 6.2 文件讀寫38 從Hello.txt中讀取文本并顯示在屏幕上import java.io.*;class BufferedReaderTester public static void main ( String args ) String fileName = C:/Hello
21、.txt , line; try BufferedReader in = new BufferedReader( new FileReader( fileName ) ); line = in.readLine(); /讀取一行內(nèi)容 while ( line != null ) System.out.println( line ); line = in.readLine(); in.close(); catch ( IOException iox ) System.out.println(Problem reading + fileName ); 6.2.2 讀文本文件(續(xù))例6-56.2 文
22、件讀寫39 運(yùn)行該程序,屏幕上將逐行顯示出Hello.txt文件中的內(nèi)容 FileReader對(duì)象:創(chuàng)建后將打開文件,如果文件不存在,會(huì)拋出一個(gè)IOException BufferedReader類的readLine()方法:從一個(gè)面向字符的輸入流中讀取一行文本。如果其中不再有數(shù)據(jù),返回null Reader類的read()方法:也可用來(lái)判別文件結(jié)束。該方法返回的一個(gè)表示某個(gè)字符的int型整數(shù),如果讀到文件末尾,返回 -1。據(jù)此,可修改本例中的讀文件部分:int c;while(c=in.read()!= -1) System.out.print(char)c); close()方法:為了操作
23、系統(tǒng)可以更為有效地利用有限的資源,應(yīng)該在讀取完畢后,調(diào)用該方法6.2.2 讀文本文件(續(xù))例6-5說明6.2 文件讀寫40 指定源文件和目標(biāo)文件名,將源文件的內(nèi)容拷貝至目標(biāo)文件。調(diào)用方式為:java copy sourceFile destinationFile6.2.2 讀文本文件(續(xù))例6-66.2 文件讀寫41 共包括兩個(gè)類共包括兩個(gè)類 CopyMaker private boolean openFiles() private boolean copyFiles() private boolean closeFiles() public boolean copy(String src,
24、String dst ) FileCopy main() 6.2.2 讀文本文件(續(xù))例6-66.2 文件讀寫42import java.io.*; class CopyMaker String sourceName, destName; BufferedReader source; BufferedWriter dest; String line;6.2 文件讀寫6.2.2 讀文本文件(續(xù))例6-643private boolean openFiles() try source = new BufferedReader(new FileReader( sourceName ); catch
25、( IOException iox ) System.out.println(Problem opening + sourceName ); return false; try dest = new BufferedWriter(new FileWriter( destName ); catch ( IOException iox ) System.out.println(Problem opening + destName ); return false; return true; 6.2.2 讀文本文件(續(xù))例6-66.2 文件讀寫44private boolean copyFiles()
26、 try line = source.readLine(); while ( line != null ) dest.write(line); dest.newLine(); line = source.readLine(); catch ( IOException iox ) System.out.println(Problem reading or writing ); return false; return true; 6.2.2 讀文本文件(續(xù))例6-66.2 文件讀寫45private boolean closeFiles() boolean retVal=true; try so
27、urce.close(); catch ( IOException iox ) System.out.println(Problem closing + sourceName ); retVal = false; try dest.close(); catch ( IOException iox ) System.out.println(Problem closing + destName ); retVal = false; return retVal; 6.2.2 讀文本文件(續(xù))例6-66.2 文件讀寫46 public boolean copy(String src, String d
28、st ) sourceName = src ; destName = dst ; return openFiles() & copyFiles() & closeFiles(); public class FileCopy /一個(gè)文件中只能有一個(gè)公有類public static void main ( String args ) if ( args.length = 2 ) new CopyMaker().copy(args0, args1); else System.out.println(Please Enter File names); 6.2.2 讀文本文件(續(xù))例6-
29、66.2 文件讀寫47 此文件FileCopy.java編譯后生成FileCopy.class和CopyMaker.class兩個(gè)字節(jié)碼文件 運(yùn)行結(jié)果 在命令行方式下執(zhí)行如下命令java FileCopy c:/Hello.txt c:/CopyHello.txt 則在C盤根目錄下會(huì)出現(xiàn)CopyHello.txt文件,內(nèi)容與Hello.txt完全相同6.2.2 讀文本文件(續(xù))例6-6運(yùn)行結(jié)果6.2 文件讀寫486.2.3 寫二進(jìn)制文件 本節(jié)知識(shí)點(diǎn) 二進(jìn)制文件 OutputStream FileOutputStream BufferedOutputStream DataOutputStream
30、 writeInt() writeDouble() writeBytes() 6.2 文件讀寫49 二進(jìn)制文件 原則上講,所有文件都是由8位的字節(jié)組成的 如果文件字節(jié)中的內(nèi)容應(yīng)被解釋為字符,則文件被稱為文本文件;如果被解釋為其它含義,則文件被稱為二進(jìn)制文件 例如文字處理程序,例如字處理軟件Word產(chǎn)生的doc文件中,數(shù)據(jù)要被解釋為字體、格式、圖形和其他非字符信息。因此,這樣的文件是二進(jìn)制文件,不能用Reader流正確讀取6.2.3 寫二進(jìn)制文件(續(xù))二進(jìn)制文件6.2 文件讀寫50 為什么需要二進(jìn)制文件 輸入輸出更快 比文本文件小很多 有些數(shù)據(jù)不容易被表示為字符6.2.3 寫二進(jìn)制文件(續(xù))二進(jìn)
31、制文件6.2 文件讀寫51 抽象類OutputStream 派生類FileOutputStream 用于一般目的輸出(非字符輸出) 用于成組字節(jié)輸出 派生類DataOutputStream 具有寫各種基本數(shù)據(jù)類型的方法 將數(shù)據(jù)寫到另一個(gè)輸出流 它在所有的計(jì)算機(jī)平臺(tái)上使用同樣的數(shù)據(jù)格式 其常用的一些方法見表6-2 其中size方法,可作為計(jì)數(shù)器,統(tǒng)計(jì)寫入的字節(jié)數(shù)6.2.3 寫二進(jìn)制文件(續(xù))OutputStream類6.2 文件讀寫526.2.3 寫二進(jìn)制文件(續(xù))表6-26.2 文件讀寫536.2.3 寫二進(jìn)制文件(續(xù))表6-26.2 文件讀寫546.2.3 寫二進(jìn)制文件(續(xù))例6-7 將三個(gè)
32、int型數(shù)字255/0/1寫入數(shù)據(jù)文件data1.datimport java.io.*; class FileOutputstreamTester public static void main ( String args ) String fileName = c:/data1.dat ; int value0 = 255, value1 = 0, value2 = -1; try DataOutputStream out = new DataOutputStream( new FileOutputStream( fileName ) ); out.writeInt( value0 );
33、out.writeInt( value1 ); out.writeInt( value2 ); out.close(); catch ( IOException iox ) System.out.println(Problem writing + fileName ); 6.2 文件讀寫55 運(yùn)行結(jié)果 運(yùn)行程序后,在C盤生成數(shù)據(jù)文件data1.dat 用寫字板打開沒有任何顯示 用ultraEdit打開查看其二進(jìn)制信息,內(nèi)容為00 00 00 FF 00 00 00 00 FF FF FF FF,每個(gè)int數(shù)字都是32個(gè)bit的 說明 FileOutputStream類的構(gòu)造方法負(fù)責(zé)打開文件“d
34、ata1.dat”用于寫數(shù)據(jù) FileOutputStream類的對(duì)象與DataOutputStream對(duì)象連接,寫基本類型的數(shù)據(jù)6.2.3 寫二進(jìn)制文件(續(xù))例6-7運(yùn)行結(jié)果6.2 文件讀寫56 BufferedOutputStream 寫二進(jìn)制文件的緩沖流類 類似于文本文件中的BufferedWriter 對(duì)于大量數(shù)據(jù)的寫入,可提高效率 用法示例:DataOutputStream out = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( fileName ) ) ); 6.2.3 寫二進(jìn)制文件(續(xù)
35、)BufferedOutputStream類6.2 文件讀寫57 向文件中寫入各種數(shù)據(jù)類型的數(shù),并統(tǒng)計(jì)寫入的字節(jié)數(shù)import java.io.*; class BufferedOutputStreamTester public static void main ( String args ) throws IOException String fileName = mixedTypes.dat ; DataOutputStream dataOut = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( f
36、ileName ) ) ); dataOut.writeInt( 0 ); System.out.println( dataOut.size() + bytes have been written.); dataOut.writeDouble( 31.2 ); System.out.println( dataOut.size() + bytes have been written.); dataOut.writeBytes(JAVA); System.out.println( dataOut.size() + bytes have been written.); dataOut.close()
37、; 6.2.3 寫二進(jìn)制文件(續(xù))例6-86.2 文件讀寫58 運(yùn)行結(jié)果 4 bytes have been written 12 bytes have been written 16 bytes have been written 說明 這個(gè)程序可作為字節(jié)計(jì)數(shù)器6.2.3 寫二進(jìn)制文件(續(xù))例6-8運(yùn)行結(jié)果6.2 文件讀寫596.2.4 讀二進(jìn)制文件 本節(jié)知識(shí)點(diǎn) FileInputStream DataInputStream BufferedInputSteam 讀寫整數(shù) 讀寫單字節(jié) 6.2 文件讀寫60 過濾流 讀或?qū)懙耐瑫r(shí)對(duì)數(shù)據(jù)進(jìn)行處理 通過另外一個(gè)流來(lái)構(gòu)造一個(gè)過濾流 大部分java.i
38、o 包所提供過濾流都是FilterInputStream和FilterOutputStream的子類 DataInputStream 和 DataOutputStream BufferedInputStream 和 BufferedOutputStream LineNumberInputStream PushbackInputStream PrintStream6.2.4 讀二進(jìn)制文件(續(xù))過濾流6.2 文件讀寫61 讀取例6-7創(chuàng)建的數(shù)據(jù)文件中的3個(gè)int型數(shù)字,顯示相加結(jié)果import java.io.*;class DataInputStreamTester public static
39、void main ( String args ) String fileName = c:data1.dat; int sum = 0; try DataInputStream instr = new DataInputStream( new BufferedInputStream(new FileInputStream( fileName ); sum += instr.readInt(); sum += instr.readInt(); sum += instr.readInt(); System.out.println( The sum is: + sum ); instr.close
40、(); catch ( IOException iox ) System.out.println(Problem reading + fileName ); 6.2.4 讀二進(jìn)制文件(續(xù))例6-106.2 文件讀寫62 該程序顯示結(jié)果是254 分析 readInt方法可以從輸入流中讀入4個(gè)字節(jié)并將其當(dāng)作int型數(shù)據(jù) 由于知道文件中存儲(chǔ)的是3個(gè)int型數(shù)據(jù),所以使用了3個(gè)讀入語(yǔ)句 如果不知道數(shù)據(jù)的個(gè)數(shù)該怎么辦呢?因?yàn)镈ataInputStream的讀入操作如遇到文件結(jié)尾就會(huì)拋出EOFException異常,所以我們可以將讀操作放入try塊中6.2.4 讀二進(jìn)制文件(續(xù))例6-10運(yùn)行結(jié)果6.2
41、文件讀寫63 將讀操作放入try塊中,使遇到文件結(jié)尾就會(huì)拋出EOFException異常,進(jìn)入到相應(yīng)的catch塊中try while ( true ) sum += instr.readInt();catch ( EOFException eof ) System.out.println( The sum is: + sum ); instr.close();6.2.4 讀二進(jìn)制文件(續(xù))例6-10修改6.2 文件讀寫64 如果沒有讀到結(jié)尾,在讀取過程中發(fā)生的異常屬于IOException,這樣就需要我們?cè)偌右粋€(gè)catch塊處理這種異常 一個(gè)try塊后面可以跟不止一個(gè)catch塊,用于處理各
42、種可能發(fā)生的異常 我們可以在上段代碼后再加上用于捕捉IOException的代碼段如下catch ( IOException eof ) System.out.println( Problem reading input ); instr.close(); 6.2.4 讀二進(jìn)制文件(續(xù))例6-10修改6.2 文件讀寫65 如果catch塊中的close方法也發(fā)生異常,現(xiàn)在就沒法捕獲了。解決方法可以有 在main方法中拋出異常 比較簡(jiǎn)單 缺點(diǎn)是沒有catch塊,因而無(wú)法對(duì)異常進(jìn)行進(jìn)一步處理,例如給出提示信息 使用嵌套的try塊6.2.4 讀二進(jìn)制文件(續(xù))例6-10修改6.2 文件讀寫66imp
43、ort java.io.*;class DataInputStreamTester public static void main ( String args ) String fileName = c:/data1.dat ; long sum = 0; try DataInputStream instr = new DataInputStream( new BufferedInputStream(new FileInputStream(fileName); try while ( true ) sum += instr.readInt(); catch ( EOFException eof
44、 ) System.out.println( The sum is: + sum ); instr.close(); catch ( IOException iox ) System.out.println(IO Problems with + fileName ); 6.2.4 讀二進(jìn)制文件(續(xù))例6-116.2 文件讀寫67 由于文本文件的存儲(chǔ)方式其實(shí)也是二進(jìn)制代碼,因此也可使用InputStream類的方法讀取 用InputStream類讀取文本文件并打印在屏幕上import java.io.*;public class InputStreamTester public static v
45、oid main(String args) throws IOException FileInputStream s=new FileInputStream(c:/Hello.txt); int c; while (c = s.read() != -1) /讀取1字節(jié),結(jié)束返回-1 System.out.write(c); s.close(); 6.2.4 讀二進(jìn)制文件(續(xù))例6-126.2 文件讀寫68 DataOutputStream的writeByte方法 public final void writeByte(int b) throws IOException 將int的最不重要字節(jié)寫
46、入輸出流 DataInputStream的readUnsignedByte方法 public final int readUnsignedByte() throws IOException 從輸入流中讀取1字節(jié)存入int的最不重要字節(jié)6.2.4 讀二進(jìn)制文件(續(xù))讀寫字節(jié)6.2 文件讀寫69 從命令行輸入源文件名和目標(biāo)文件名,將源文件復(fù)制為目標(biāo)文件。import java.io.*; class CopyBytes public static void main ( String args ) DataInputStream instr; DataOutputStream outstr; if
47、 ( args.length != 2 ) System.out.println(Please enter file names); return; try instr = new DataInputStream(new BufferedInputStream(new FileInputStream( args0 ); outstr = new DataOutputStream(new BufferedOutputStream(new FileOutputStream( args1 ); 6.2.4 讀二進(jìn)制文件(續(xù))文件復(fù)制程序6.2 文件讀寫70 try int data; while (
48、 true ) data = instr.readUnsignedByte() ; outstr.writeByte( data ) ; catch ( EOFException eof ) outstr.close(); instr.close(); return; catch ( FileNotFoundException nfx ) System.out.println(Problem opening files ); catch ( IOException iox ) System.out.println(IO Problems ); 6.2.4 讀二進(jìn)制文件(續(xù))文件復(fù)制程序6.2 文件讀寫716.2.5 File 類 表示磁盤文件信息 定義了一些與平臺(tái)無(wú)關(guān)的方法來(lái)操縱文件 創(chuàng)建、刪除文件 重命名文件 判斷文件的讀寫權(quán)限及是否存在 設(shè)置和查詢文件的最近修改時(shí)間等 構(gòu)造文件流可以使用File類的對(duì)象作為參數(shù)6.2 文件讀寫726.2.5 File類(續(xù))構(gòu)造方法6.2 文件讀寫736.2.5 File類(續(xù))常用方法6.2 文件讀寫74 例6-13 在C盤創(chuàng)建文件Hello.txt,如果存在則刪除舊文件,不存在則直接創(chuàng)建新的import java.io.*;public class FileTester public static void main(String a
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030商用車項(xiàng)目發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國(guó)自動(dòng)販賣機(jī)行業(yè)市場(chǎng)深度分析及有效策略與實(shí)施路徑評(píng)估報(bào)告
- 2025至2030中國(guó)自動(dòng)清罐機(jī)行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030中國(guó)自動(dòng)開縫機(jī)行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 酒店服務(wù)質(zhì)量與經(jīng)營(yíng)效率提升策略
- 2025至2030中國(guó)自體基質(zhì)誘導(dǎo)軟骨形成行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030中國(guó)腰椎前路椎間融合行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國(guó)脫模膜行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國(guó)脂肪乳注射液行業(yè)發(fā)展分析及競(jìng)爭(zhēng)策略與趨勢(shì)預(yù)測(cè)報(bào)告
- 2025至2030中國(guó)膠凝纖維敷料行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2024屆河北省唐山市玉田縣物理高一第二學(xué)期期末質(zhì)量檢測(cè)試題含解析
- 第三方醫(yī)療消毒供應(yīng)中心項(xiàng)目可行性研究報(bào)告
- 貨架安裝施工方案
- 美羅培南課件
- 128個(gè)常用自然拼讀發(fā)音規(guī)則和1000句生活口語(yǔ)
- 異口同音公開課
- 專利代理人資格考試實(shí)務(wù)試題及參考答案
- 運(yùn)用信息技術(shù)助力勞動(dòng)教育創(chuàng)新發(fā)展 論文
- GB/T 602-2002化學(xué)試劑雜質(zhì)測(cè)定用標(biāo)準(zhǔn)溶液的制備
- GB/T 4074.8-2009繞組線試驗(yàn)方法第8部分:測(cè)定漆包繞組線溫度指數(shù)的試驗(yàn)方法快速法
- 2023年涉縣水庫(kù)投資管理運(yùn)營(yíng)有限公司招聘筆試模擬試題及答案解析
評(píng)論
0/150
提交評(píng)論