




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章第九章 輸入、輸出流輸入、輸出流 本章導(dǎo)讀本章導(dǎo)讀n 文件n 文件字節(jié)流和文件字符流n 緩沖流n 數(shù)組流和字符串流n 數(shù)據(jù)流n 對(duì)象流n 序列化和對(duì)象克隆n 隨機(jī)讀寫流n 使用Scanner類解析文件n 文件鎖1輸入流、輸出流概述 I/O流提供一條通道程序,可以使用這條通道讀取“源”中的數(shù)據(jù),或把數(shù)據(jù)送到“目的地”。 I/O流中的輸入流輸入流的指向稱為源源,程序從指向源的輸入流中讀取源中的數(shù)據(jù)(如圖9.1所示意); 輸出流輸出流的指向稱為目的地目的地,程序通過(guò)向輸出流中寫入數(shù)據(jù)把信息傳遞到目的地(如圖9.2所示意)。 程序的源和目的地也可以是鍵盤、鼠標(biāo)、內(nèi)存或顯示器窗口。2I/O流庫(kù)提供
2、的4個(gè)重要的abstract類 Java的I/O流庫(kù)提供大量的流類(在包java.io中),其中有4個(gè)重要的abstract類:InputStream 字節(jié)輸入流 Reader 字符輸入流 OutputStream 字節(jié)輸出流 Writer字符輸出流 InputStream和Reader類為其子類提供了重要的讀取數(shù)據(jù)的read()方法. OutputStream和Writer類為其子類提供了重要的寫入數(shù)據(jù)的write()方法。 39.1 文件文件 多流的讀寫與文件有關(guān)。 Java使用FileFile類類創(chuàng)建的對(duì)象來(lái)獲取文件本身的一些信息,如文件所在的目錄、文件的長(zhǎng)度、文件讀寫權(quán)限等,文件對(duì)象并
3、不涉及對(duì)文件的讀寫操作。 創(chuàng)建一個(gè)File對(duì)象的構(gòu)造方法有3個(gè): File(String filename); File(String filename); File(String directoryPath,String filename); File(String directoryPath,String filename); File(File f, String filename); File(File f, String filename); 其中filename是文件名字,directoryPath是文件的路徑,f是一個(gè)目錄。 使用File(String filename)File
4、(String filename)創(chuàng)建文件時(shí),該文件被認(rèn)為是與當(dāng)前應(yīng)用程序在同一目錄中。 41 1文件的屬性文件的屬性 使用File類的下列方法可以獲取文件本身的一些信息: public String getName()public String getName() 獲取文件的名字。 public boolean canRead() public boolean canRead() 判斷文件是否是可讀的。 public boolean canWrite() public boolean canWrite() 判斷文件是否可被寫入。 public boolean exits() public b
5、oolean exits() 判斷文件是否存在。 public long length() public long length() 獲取文件的長(zhǎng)度(單位是字節(jié))。 public String getAbsolutePath() public String getAbsolutePath() 獲取文件的絕對(duì)路徑。 public String getParent() public String getParent() 獲取文件的父目錄。 public boolean isFile() public boolean isFile() 判斷文件是否是一個(gè)正常文件,而不是目錄。 public bool
6、ean isDirectroy() public boolean isDirectroy() 判斷文件是否是一個(gè)目錄。 public boolean isHidden() public boolean isHidden() 判斷文件是否是隱藏文件。 public long lastModified() public long lastModified() 獲取文件最后修改的時(shí)間(時(shí)間是從1970年午夜至文件最后修改時(shí)刻的毫秒數(shù)。52目錄 1 1)創(chuàng)建目錄)創(chuàng)建目錄 public boolean mkdir() public boolean mkdir() 創(chuàng)建一個(gè)目錄,創(chuàng)建成功返回true,否
7、則返回false。 2 2)列出目錄中的文件)列出目錄中的文件( (如果File對(duì)象是一個(gè)目錄) public String list() public String list() 用字符串形式返回目錄下的全部文件。 public File listFiles()public File listFiles() 用File對(duì)象形式返回目錄下的全部文件。 File類的下述兩個(gè)方法可以列出指定類型的文件: public String list(public String list(FilenameFilter objFilenameFilter obj) ) 該方法用字符串形式返回目錄下的指定類型的
8、所有文件。 public File listFiles(public File listFiles(FilenameFilter objFilenameFilter obj) ) 該方法用File對(duì)象返回目錄下的指定類型所有文件。 FilenameFilterFilenameFilter是一個(gè)接口,該接口有一個(gè)方法: public boolean accept(public boolean accept(File dir,String nameFile dir,String name);); 使用list()方法時(shí),需向該方法傳遞一個(gè)實(shí)現(xiàn)FilenameFilter接口的對(duì)象。list()方法
9、執(zhí)行時(shí),參數(shù)不斷回調(diào)接口方法accept(File dir,String nameaccept(File dir,String name),參數(shù)name被實(shí)例化目錄中的一個(gè)文件名,參數(shù)dir為調(diào)用list的當(dāng)前對(duì)象,當(dāng)接口方法返回true時(shí),list()方法就將目錄dir中的文件存放到返回的數(shù)組中。63文件的創(chuàng)建與刪除 對(duì)于 File f=new File(C:myletter,letter.txt);File f=new File(C:myletter,letter.txt); 如果C:myletterC:myletter目錄中沒有名字為letter.txtletter.txt的文件,文件對(duì)
10、象f調(diào)用方法 public boolean createNewFile()public boolean createNewFile() 可以在C:myletter目錄中建立一個(gè)名字為letter.txt的文件。文件對(duì)象調(diào)用方法 public boolean delete()public boolean delete() 可以刪除當(dāng)前文件,如 f.delete();f.delete(); 例9-1列出了D:ch9目錄下java源文件的名字及其大小,并刪除了D:ch9中的一個(gè)java源文件。74運(yùn)行可執(zhí)行文件 使用java.lang包中的Runtime類,執(zhí)行一個(gè)本地機(jī)上的可執(zhí)行文件。 首先首先使
11、用Runtime類聲明一個(gè)對(duì)象,如 Runtime ec;Runtime ec; 然后然后使用該類的靜態(tài)getRuntime()方法創(chuàng)建這個(gè)對(duì)象: ec=Runtime.getRuntime();ec=Runtime.getRuntime(); ec可以調(diào)用exec(String command)方法打開本地的可執(zhí)行文件或執(zhí)行一個(gè)操作。 例9-2中,Runtime對(duì)象打開Windows平臺(tái)上的繪圖程序和記事本程序。89.2 文件字節(jié)流文件字節(jié)流 1FileInputStream類 FileInputStream類是InputStream的子類,稱為文件字節(jié)輸入流,按字節(jié)讀取文件中的數(shù)據(jù)。該類的
12、所有方法都是從InputStream類繼承來(lái)的。構(gòu)造方法: FileInputStream(String name) FileInputStream(String name) FileInputStream(File file) FileInputStream(File file) 構(gòu)造方法參數(shù)指定的文件稱為輸入流的源,輸入流通過(guò)使用read()方法從輸入流讀出源中的數(shù)據(jù)。 建立一個(gè)文件輸入流對(duì)象,代碼如下:建立一個(gè)文件輸入流對(duì)象,代碼如下: try FileInputStream ins = new FileInputStream(myfile.dat); try FileInputStre
13、am ins = new FileInputStream(myfile.dat); catch (IOException e ) catch (IOException e ) System.out.println(e ); System.out.println(e ); read()read()方法的形式方法的形式 : int read();int read();從輸入流中順序讀取單個(gè)字節(jié)的數(shù)據(jù) int read(byte b )int read(byte b )和和int read(byte b ,int off,int len)int read(byte b ,int off,int le
14、n) 把多個(gè)字節(jié)讀到一個(gè)字節(jié)數(shù)組中,返回實(shí)際讀取的字節(jié)個(gè)數(shù)。參數(shù)off指定read()方法把數(shù)據(jù)存放在字節(jié)數(shù)組b中的位置,參數(shù)len指定該方法將讀取的最大字節(jié)數(shù)。 FileInputStream流順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read()方法就順序地讀取文件中其余的內(nèi)容,直到文件的末尾或流被關(guān)閉。 9 2FileOutputStream類 FileOutputStream提供了基本的文件寫入能力,是OutputStream的子類,稱為文件字節(jié)輸出流。文件字節(jié)輸出流按字節(jié)將數(shù)據(jù)寫入到文件中.構(gòu)造方法: FileOutputStream(String name) FileOutputStr
15、eam(String name) FileOutputStream(File file) FileOutputStream(File file) FileOutputStream(String name, boolean append) FileOutputStream(String name, boolean append) FileOutputStream(File file, boolean append) FileOutputStream(File file, boolean append) 構(gòu)造方法參數(shù)指定的文件稱為輸出流的目的地。輸出流使用write()方法把數(shù)據(jù)寫入輸出流到達(dá)目的
16、地。 public void write(byte b)public void write(byte b) 寫b.length個(gè)字節(jié)到輸出流。 public void.write(byte b,int off,int len)public void.write(byte b,int off,int len) 從給定字節(jié)數(shù)組中起始于偏移量off處寫len個(gè)字節(jié)到輸出流,參數(shù)b是存放了數(shù)據(jù)的字節(jié)數(shù)組。 只要不關(guān)閉流,每次調(diào)用writer()writer()方法方法就順序地向文件寫入內(nèi)容,直到流被關(guān)閉 例9-3中,首先將“歡迎welcom”寫入到文件“hello.txt”中,然后再讀取該文件中的內(nèi)容
17、。 109.3 文件字符流文件字符流 1FileReader類 FileReader類是Reader的子類,稱為文件字符輸入流。文件字符輸入流按字符讀取文件中的數(shù)據(jù)。構(gòu)造方法: FileReader(String name) FileReader(String name) FileReader (File file)FileReader (File file) 構(gòu)造方法參數(shù)指定的文件稱為輸入流的源,輸入流通過(guò)使用read()方法從輸入流讀出源中的數(shù)據(jù)。 int read()int read() 輸入流調(diào)用該方法從源中讀取一個(gè)字符。該方法返回一個(gè)整數(shù)(065535之間的一個(gè)整數(shù),Unicode字
18、符值),如果未讀出字符就返回1。 int read(char b )int read(char b ) 輸入流調(diào)用該方法從源中讀取b.length個(gè)字符到字符數(shù)組b中,返回實(shí)際讀取的字符數(shù)目。如果到達(dá)文件的末尾,則返回-1。 int read(char b ,int off,int len)int read(char b ,int off,int len) 輸入流調(diào)用該方法從源中讀取len個(gè)字符并存放到字符數(shù)組b中,返回實(shí)際讀取的字符數(shù)目。如果到達(dá)文件的末尾,則返回-1。其中,參數(shù)off指定該方法從字符數(shù)組b中的什么地方存放數(shù)據(jù)。112FileWriter類 FileWriter提供了基本的文
19、件寫入能力。FileWriter類是Writer的子類,稱為文件字符輸出流。文件字符輸出流按字符將數(shù)據(jù)寫入到文件中.構(gòu)造方法: FileWriter(String name); FileWriter (File file); FileWriter (String name, boolean append); FileWriter (String name, boolean append); FileWriter (File file, boolean append); FileWriter (File file, boolean append); 構(gòu)造方法參數(shù)指定的文件稱為輸出流的目的地。輸出
20、流使用write()方法把數(shù)據(jù)寫入輸出流到達(dá)目的地。 public void write(char b) public void write(char b) 寫b.length個(gè)字符到輸出流 public void.write(char b,int off,int len) public void.write(char b,int off,int len) 從給定字符數(shù)組中起始于偏移量off處寫len個(gè)字符到輸出流,參數(shù)b是存放了數(shù)據(jù)的字符數(shù)組 void write(String str) void write(String str) 把字符串中的全部字符寫入到輸出流 void write(S
21、tring str,int off,int len) void write(String str,int off,int len) 從字符串str中起始于偏移量off處寫len個(gè)字符到輸出流 只要不關(guān)閉流,每次調(diào)用writer()方法就順序地向文件寫入內(nèi)容,直到流被關(guān)閉 例9-4首先用字符輸出流向一個(gè)已經(jīng)存在的文件尾加若干個(gè)字符,然后再用字符輸入流讀出文件中的內(nèi)容。 129.4 緩沖流緩沖流 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.5)1 1BufferedReaderBufferedReader類類 BufferedReader類創(chuàng)建的對(duì)象稱為緩沖輸入流,該輸入流的指向必須是一個(gè)Reader流,稱為B
22、ufferedReader流的底層流,底層流負(fù)責(zé)將數(shù)據(jù)讀入緩沖區(qū)。 BufferedReader流的源就是這個(gè)緩沖區(qū),緩沖輸入流再?gòu)木彌_區(qū)中讀取數(shù)據(jù)。 可以將BufferedReader與FileReader連接,然后BufferedReader就可以按行讀FileReader指向的文件。BufferedReader的構(gòu)造方法如下: BufferedReader(Reader in) BufferedReader流能夠讀取文本行,方法是 readLine() 可以向BufferedReader傳遞一個(gè)Reader對(duì)象(如FileReader的實(shí)例)來(lái)創(chuàng)建一個(gè)BufferedReader對(duì)象:
23、FileReader inOne=new FileReader(Student.txt) BufferedReader inTwo=new BufferedReader(inOne);然后inTwo調(diào)用readLine()順序讀取文件“Student.txt”的一行。13 2BufferedWriter類 可以將BufferedWriter流和FileWriter流連接在一起,然后使用BufferedWriter流將數(shù)據(jù)寫到目的地。 F i l e W r i t e r 流 稱 為 B u f f e r e d W r i t e r 的 底 層 流 ,BufferedWriter流將數(shù)據(jù)
24、寫入緩沖區(qū),底層流負(fù)責(zé)將數(shù)據(jù)寫到最終的目的地。例如, FileWriter tofile=new FileWriter(hello.txt); BufferedWriter out=new BufferedWriter(tofile); BufferedReader流調(diào)用方法: write(String str) write(String s,int off,int len) 把字符串s或s的一部分寫入到目的地。 BufferedWriter調(diào)用newLine()newLine()方法方法,可以向文件寫入一個(gè)回行,調(diào)用flush()flush()可以刷新緩沖區(qū)。 例9-5將文件“Student
25、.txt”中的內(nèi)容按行讀出,并寫入到另一個(gè)文件中,且給每一行加上行號(hào)143標(biāo)準(zhǔn)化考試 標(biāo)準(zhǔn)化試題文件的格式要求如下: 每道題目之間用一個(gè)或多個(gè)星號(hào)(*)字符分隔(最后一個(gè)題目的最后一行也是*)。 每道題目提供A、B、C、D四個(gè)選擇(單項(xiàng)選擇)。 test.txt是一套標(biāo)準(zhǔn)化考試的試題文件。 例9-6使用輸入流讀取試題文件,每次顯示試題文件中的一道題目。當(dāng)讀取到字符*時(shí),暫停讀取,等待用戶從鍵盤輸入答案。用戶做完全部題目后,程序給出用戶的得分。程序運(yùn)行效果如圖9.3。 159.5 數(shù)組流數(shù)組流 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.6) 流的源和目標(biāo)除了可以是文件外,還可以是計(jì)算機(jī)內(nèi)存。 ByteArr
26、ayInputStream和字節(jié)輸出流ByteArrayOutputStream分別使用字節(jié)數(shù)組作為流的源和目標(biāo)。 數(shù)組字節(jié)輸入流數(shù)組字節(jié)輸入流 ByteArrayInputStream構(gòu)造方法如下 ByteArrayInputStream(byte buf) ByteArrayInputStream(byte buf,int offset,int length) 數(shù)組字節(jié)輸入流調(diào)用 public int read() 順序地從源中讀出一個(gè)字節(jié),該方法返回讀出的字節(jié)值 public int read(byte b,int off,int len)順序地從源中讀出參數(shù)len指定的字節(jié)數(shù),并將讀出
27、的字節(jié)存放到參數(shù)b指定的數(shù)組中,參數(shù)off指定數(shù)組b存放讀出字節(jié)的起始位置,該方法返回實(shí)際讀出的字節(jié)個(gè)數(shù)。如果未讀出字節(jié)read方法返回-1。數(shù)組字節(jié)輸出流數(shù)組字節(jié)輸出流 ByteArrayOutputStream的構(gòu)造方法如下: ByteArrayOutputStream() ByteArrayOutputStream(int size) 字節(jié)數(shù)組字節(jié)輸出流調(diào)用 public void write(int b) 順序地向緩沖區(qū)寫入一個(gè)字節(jié) public void write(byte b,int off,int len)將參數(shù)b中指定的len個(gè)字節(jié)順序地寫入緩沖區(qū),參數(shù)off指定從b中寫出的
28、字節(jié)的起始位置public byte toByteArray() 返回輸出流寫入到緩沖區(qū)的全部字節(jié) 例9-7向內(nèi)存(輸出流的緩沖區(qū))寫入ASCII表,然后再讀出這些字節(jié)和字節(jié)對(duì)應(yīng)的字符。 16數(shù)組字符流數(shù)組字符流 與數(shù)組字節(jié)流對(duì)應(yīng)的是數(shù)組字符流CharArrayReader和和CharArrayWriter類類,數(shù)組字符流分別使用字符數(shù)組作為流的源和目標(biāo)。 與數(shù)組字節(jié)流不同的是,數(shù)組字符流的讀操作可能發(fā)生IOException異常。 例9-8將Unicode表中的一些字符寫入內(nèi)存,然后再讀出。179.6 字符串流字符串流 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.7) StringReaderString
29、Reader使用字符串作為流的源。構(gòu)造方法: public StringReader(String s) 構(gòu)造的輸入流指向參數(shù)s指定的字符串 字符串輸入流調(diào)用 public int read() 順序讀出源中的一個(gè)字符,并返回字符在Unicode表中的位置 public int read(char buf,int off,int len)順序地從源中讀出參數(shù)len指定的字符個(gè)數(shù),并將讀出的字符存放到參數(shù)b指定的數(shù)組中,參數(shù)off指定數(shù)組b存放讀出字符的起始位置,該方法返回實(shí)際讀出的字符個(gè)數(shù)。 StringWriterStringWriter將內(nèi)存作為流的目的地,構(gòu)造方法: StringWrit
30、er()和和 StringWriter(int size)可以構(gòu)造字符串輸出流對(duì)象 字符串輸出流調(diào)用: public void write(int b) 向緩沖區(qū)寫入字符 public void write(char b,int off,int len)向緩沖區(qū)寫入字符 public void write(String str)向緩沖區(qū)寫入字符 public void write(String str,int off,int len)向緩沖區(qū)寫入字符 public String toString() 返回輸出流寫入到緩沖區(qū)的全部字符 public void flush() 可以刷新緩沖區(qū) 18
31、9.7 數(shù)據(jù)流數(shù)據(jù)流 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.8)1 1DataInputStreamDataInputStream類和類和DataOutputStreamDataOutputStream類類 DataInputStream 類和DataOutputStream類創(chuàng)建的對(duì)象稱為數(shù)據(jù)輸入流和數(shù)據(jù)輸出流。它們?cè)试S程序按照與機(jī)器無(wú)關(guān)的風(fēng)格讀取Java原始數(shù)據(jù)。 2 2DataInputStreamDataInputStream類和類和DataOutputStreamDataOutputStream的構(gòu)造方法的構(gòu)造方法 DataInputStream(InputStream in) 創(chuàng)建的數(shù)據(jù)輸
32、入流指向一個(gè)由參數(shù)in指定的輸入流,以便從后者讀取數(shù)據(jù)(按著機(jī)器無(wú)關(guān)的風(fēng)格讀?。?。 DataOutputStream(OutnputStream out)創(chuàng)建的數(shù)據(jù)輸出流指向一個(gè)由參數(shù)out指定的輸出流,然后通過(guò)這個(gè)數(shù)據(jù)輸出流把Java數(shù)據(jù)類型的數(shù)據(jù)寫到輸出流out。 表9.1 DataInputStream類和DataOutputSteam的部分方法 例9-9可以完成寫幾個(gè)Java類型的數(shù)據(jù)到一個(gè)文件,并再讀出來(lái)。 19表9.1 DataInputStream類和DataOutputSteam的部分方法209.8 對(duì)象流對(duì)象流 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.9) ObjectInputStr
33、eam類和ObjectOutputStream類創(chuàng)建的對(duì)象被稱為對(duì)象輸入流和對(duì)象輸出流。構(gòu)造方法: ObjectInputStream(InputStream in) ObjectOutputStream(OutputStream out) 對(duì)象輸出流對(duì)象輸出流使用writeObject(Object obj)方法將一個(gè)對(duì)象obj寫入輸出流送往目的地,對(duì)象輸入流對(duì)象輸入流使用readObject()從源中讀取一個(gè)對(duì)象到程序中。 將一個(gè)對(duì)象寫入到文件時(shí),首先用FileOutputStream創(chuàng)建一個(gè)文件輸出流,如下所示:FileOutputStream file_out=new FileOutp
34、utStream(tom.txt);ObjectOutputStream object_out=new ObjectOutputStream(file_out); 準(zhǔn)備從文件中讀入一個(gè)對(duì)象到程序中時(shí),首先用FileInputStream創(chuàng)建一個(gè)文件輸入流,如下所示:FileInputStream file_in=new FileInputStream(tom.txt);ObjectInputStream object_in=new ObjectInputStream(file_in); 注注: :當(dāng)我們使用對(duì)象流寫入或讀入對(duì)象時(shí),要保證對(duì)象是序列化的。 一個(gè)類如果實(shí)現(xiàn)了Serializable
35、接口,那么這個(gè)類創(chuàng)建的對(duì)象就是序列化的對(duì)象。 使用對(duì)象流把一個(gè)對(duì)象寫入到文件時(shí)不僅保證該對(duì)象是序列化的,而且該對(duì)象的成員對(duì)象也必須是序列化的。 例9-10中有一個(gè)實(shí)現(xiàn)Serializable接口的Goods類。219.9 序列化與對(duì)象克隆序列化與對(duì)象克隆 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.10) 有時(shí)我們想得到對(duì)象的一個(gè)“復(fù)制品”,該復(fù)制品的實(shí)體是原對(duì)象實(shí)體的拷貝。復(fù)制品實(shí)體的變化不會(huì)引起原對(duì)象實(shí)體發(fā)生變化。對(duì)象調(diào)用clone()clone()方法方法就可以獲取對(duì)象的“復(fù)制品”,稱為原對(duì)象的克隆對(duì)象。 對(duì)象進(jìn)行克隆時(shí)需要特別注意的是:如果原對(duì)象有引用型成員變量,那么克隆對(duì)象對(duì)應(yīng)的成員變量的引用就與
36、原對(duì)象那個(gè)成員變量的引用相同,克隆對(duì)象對(duì)自己的這個(gè)成員變量所引用的實(shí)體的操作,將影響原對(duì)象引用型成員變量的實(shí)體。這樣一來(lái)就涉及到深度克隆的問(wèn)題,因?yàn)樵瓕?duì)象的成員變量中可能還會(huì)有其他對(duì)象。因此,程序必須重寫clone()clone()方法方法,增加了編程的難度。 使用對(duì)象流很容易獲取一個(gè)序列化對(duì)象的克隆。只需將該對(duì)象寫入到對(duì)象輸出流,然后用對(duì)象輸入流讀回的對(duì)象就是原對(duì)象的一個(gè)克隆。 例9-11將對(duì)象寫入到內(nèi)存,然后讀回該對(duì)象的一個(gè)克隆。229.10 隨機(jī)讀寫流隨機(jī)讀寫流 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.11) 當(dāng)用戶需要嚴(yán)格地處理文件時(shí),就可以使用RandomAccessFile類來(lái)創(chuàng)建一個(gè)對(duì)象(
37、稱為隨機(jī)讀寫流隨機(jī)讀寫流)。RandomAccessFile類創(chuàng)建的流的指向既可以作為源,也可以作為目的地。 RandomAccessFile類有兩個(gè)構(gòu)造方法: RandomAccessFile(String name,String mode) 參數(shù)name用來(lái)確定一個(gè)文件名,給出創(chuàng)建的流的源,也是流目的地。參數(shù)mode取r(只讀)或rw(可讀寫),決定創(chuàng)建的流對(duì)文件的訪問(wèn)權(quán)力。 RandomAccessFile(File file,String mode) 參數(shù)file是一個(gè)File對(duì)象,給出創(chuàng)建的流的源,也是流目的地。參數(shù)mode取r(只讀)或rw(可讀寫),決定創(chuàng)建的流對(duì)文件的訪問(wèn)權(quán)力。
38、 流還可以調(diào)用流還可以調(diào)用 seek(long a) 用來(lái)移動(dòng)RandomAccessFile流的讀寫位置,其中參數(shù)a確定讀寫位置距離文件開頭的字節(jié)位置。 getFilePointer() 獲取當(dāng)前流在文件中的讀寫的位置。 表9.2給出了RandomAccessFile的常用方法。23表表9.2 9.2 RandomAccessFileRandomAccessFile的常用方法的常用方法24例題例題9-12,9-12,例題例題9-129-12 例9-12 把5個(gè)int類型整數(shù)寫入到一個(gè)名字為tom.dat文件中,然后按相反順序讀出這些數(shù)據(jù)。一個(gè)int類型數(shù)據(jù)占4個(gè)字節(jié),首先將讀寫位置移動(dòng)到文件
39、的第16個(gè)字節(jié)位置,讀取tom.dat文件中最后一個(gè)整數(shù),然后將讀寫位置再移動(dòng)到文件的第12個(gè)字節(jié),讀取tom.dat文件中倒數(shù)第二個(gè)整數(shù),依次類推將tom.dat文件中的整數(shù)按相反順序讀出。 注注: : RondomAccessFile流的readLine()readLine()方法方法在讀取含有非ASCII字符的文件時(shí)(比如含有漢字的文件)會(huì)出現(xiàn)亂碼問(wèn)題,因此,需要把readLine()readLine()讀取的字符串用“iso-8859-1” 重新編碼存放到 byte數(shù)組中,然后再用當(dāng)前機(jī)器的默認(rèn)編碼將該數(shù)組轉(zhuǎn)化為字符串,操作如下:(1)讀取 String str=in.readLine
40、();(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); 如果機(jī)器的默認(rèn)編碼是“GB2312”,那么 String content=new String(b); 等同于: String content=new String(b, GB2312); 例9-13中RondomAccessFile流使用readLine()讀取一個(gè)文件。259.11使用使用Scanner解析文件解析文件 (教材印刷錯(cuò)誤教材印刷錯(cuò)誤9.12) 應(yīng)用程序可
41、能需要解析文件中的特殊數(shù)據(jù),此時(shí),應(yīng)用程序可以把文件的內(nèi)容全部讀入內(nèi)存后,再使用第6章的有關(guān)知識(shí)解析所需要的內(nèi)容,其優(yōu)點(diǎn)是處理速度快,但如果讀入的內(nèi)容較大將消耗較多的內(nèi)存,即以空間換取時(shí)間。 本節(jié)介紹怎樣借助Scanner類和正則表達(dá)式來(lái)解析文件,比如,要解析出文件中的特殊單詞,數(shù)字等信息。使用Scanner類和正則表達(dá)式來(lái)解析文件的特點(diǎn)是以時(shí)間換取空間,即解析的速度相對(duì)較慢,但節(jié)省內(nèi)存。 261使用默認(rèn)分隔標(biāo)記解析文件使用默認(rèn)分隔標(biāo)記解析文件 創(chuàng)建Scanner對(duì)象,并指向要解析的文件,例如: File file = new File(hello.java); Scanner sc = ne
42、w Scanner(file); 那么sc將空格作為分隔標(biāo)記、調(diào)用next()方法方法依次返回file中的單詞,如果file最后一個(gè)單詞已被next()方法方法返回,sc調(diào)用hasNext()將返回false,否則返回true。 對(duì)于數(shù)字型的單詞,比如108,167.92等可以用nextInt()或nextDouble()方法方法來(lái)代替next()方法方法,即sc可以調(diào)用nextInt()或nextDouble()方法方法將數(shù)字型單詞轉(zhuǎn)化為int或double數(shù)據(jù)返回,但需要特別注意的是,如果單詞不是數(shù)字型單詞,調(diào)用nextInt()或nextDouble()方法將發(fā)生InputMismatc
43、hException異常,在處理異常時(shí)可以調(diào)用next()方法返回該非數(shù)字化單詞。 假設(shè)cost.txt的內(nèi)容如下: TV cost 876 dollar,Computer cost 2398 dollar.The milk cost 98 dollar. The apple cost 198 dollar. 例9-14中使用Scanner對(duì)象解析文件cost.txt中的全部消費(fèi)并計(jì)算出總消費(fèi)。程序運(yùn)行效果如圖9.4272使用正則表達(dá)式作為分隔標(biāo)記解析文件使用正則表達(dá)式作為分隔標(biāo)記解析文件 創(chuàng)建Scanner對(duì)象,指向要解析的文件,并使用useDelimiter方法指定正則表達(dá)式作為分隔標(biāo)記,例如:File file = new File(hello.java);Scanner sc = new Scanner(file);sc.useDelimiter(正則表達(dá)式正則表達(dá)式); 那么sc將正則表達(dá)式作為分隔標(biāo)記,調(diào)用next()方法方法依次返回file中的單詞,如果file
溫馨提示
- 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 研究針對(duì)性護(hù)理干預(yù)在接受長(zhǎng)程視頻腦電圖監(jiān)測(cè)患者中的臨床應(yīng)用價(jià)值
- 市場(chǎng)新員工培訓(xùn)
- 2024-2025學(xué)年佛山市高二語(yǔ)文上學(xué)期期末教學(xué)質(zhì)量檢測(cè)試卷
- 2025年小提琴專業(yè)水平測(cè)試卷:國(guó)內(nèi)外著名小提琴曲演奏分析試題
- 2025年法律職業(yè)資格考試民法法律咨詢專項(xiàng)試題卷
- 2025年小學(xué)語(yǔ)文畢業(yè)升學(xué)考試全真模擬卷(基礎(chǔ)夯實(shí)版)-小學(xué)語(yǔ)文閱讀理解能力訓(xùn)練實(shí)戰(zhàn)
- 統(tǒng)計(jì)質(zhì)量管理在現(xiàn)代制造業(yè)中的應(yīng)用-2025年統(tǒng)計(jì)學(xué)期末試卷
- 2025年網(wǎng)絡(luò)安全培訓(xùn)考試題庫(kù):網(wǎng)絡(luò)安全防護(hù)技術(shù)與應(yīng)用實(shí)踐試題
- 熱水鍋爐定期檢驗(yàn)工作制度
- 1200×650mm真空蒸鍍技術(shù)協(xié)議
- 個(gè)人結(jié)算業(yè)務(wù)培訓(xùn)
- DL∕T 617-2019 氣體絕緣金屬封閉開關(guān)設(shè)備技術(shù)條件
- 輸電線路工程導(dǎo)線壓接技術(shù)培訓(xùn)
- 網(wǎng)絡(luò)輿情監(jiān)測(cè)與研判全書電子教案正本書課件全套ppt最全教學(xué)教程電子講義
- 山東省各地電廠聯(lián)系方式
- 第16課 動(dòng)物面具
- 納蘭容若納蘭性德及其詞賞析
- 耐壓測(cè)試儀點(diǎn)檢記錄表
- 幼兒園繪本故事:《花婆婆》
- msp430g2553測(cè)頻率以及測(cè)峰值
- 大體積混凝土測(cè)溫檢測(cè)報(bào)告(共14頁(yè))
評(píng)論
0/150
提交評(píng)論