


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java 基礎(chǔ)輸入輸出io 包支持 Java 的基本 I/O(輸入 /輸出)系統(tǒng),包括文件的輸入 /輸出。對(duì)輸入 /輸出的支持是來(lái)源于 Java 的內(nèi)核 API庫(kù),而不是語(yǔ)言關(guān)鍵字。一、輸入 /輸出基礎(chǔ)很多實(shí)際的Java 應(yīng)用程序不是基于文本的控制臺(tái)程序。盡管基于文本的程序作為教學(xué)實(shí)例是很出色的,它們無(wú)法勝任JAVA 在實(shí)際中的重要應(yīng)用。Java 對(duì)外設(shè)輸入 /輸出的支持也是有限的,并且用起來(lái)有些笨拙甚至是在簡(jiǎn)單的例子程序中。基于文本的控制臺(tái)輸入/輸出對(duì)于Java 程序并不是十分重要。Java 提供了與文件和網(wǎng)絡(luò)相關(guān)的強(qiáng)大的和靈活的輸入/輸出支持, Java 的輸入 /輸出系統(tǒng)是緊密相連并且是
2、具有一致性的。1.1 流的概念Java 程序通過(guò)流來(lái)完成輸入/輸出。流是生產(chǎn)或消費(fèi)信息的抽象。流通過(guò)Java 的輸入 /輸出系統(tǒng)與物理設(shè)備鏈接。盡管與它們鏈接的物理設(shè)備不盡相同,所有流的行為具有同樣的方式。這樣,相同的輸入 /輸出類和方法適用于所有類型的外部設(shè)備。這意味著一個(gè)輸入流能夠抽象多種不同類型的輸入:從磁盤(pán)文件,從鍵盤(pán)或從網(wǎng)絡(luò)套接字。同樣,一個(gè)輸出流可以輸出到控制臺(tái),磁盤(pán)文件或相連的網(wǎng)絡(luò)。流是處理輸入 / 輸出的一個(gè)潔凈的方法,例如它不需要代碼理解鍵盤(pán)和網(wǎng)絡(luò)的不同。 Java 中流的實(shí)現(xiàn)是在 java.io 包定義的類層次結(jié)構(gòu)內(nèi)部的。1.2 字節(jié)流和字符流要使用流類, 必須導(dǎo)入 Jav
3、a.io 包。Java 2 定義了兩種類型的流:字節(jié)類和字符類。字節(jié)流( byte stream)為處理字節(jié)的輸入和輸出提供了方便的方法。例如使用字節(jié)流讀取或書(shū)寫(xiě)二進(jìn)制數(shù)據(jù)。字符流(character stream)為字符的輸入和輸出處理提供了方便。它們采用了統(tǒng)一的編碼標(biāo)準(zhǔn),因而可以國(guó)際化。在某些場(chǎng)合,字符流比字節(jié)流更有效。在最底層,所有的輸入 /輸出都是字節(jié)形式的。基于字符的流只為處理字符提供方便有效的方法。下面是對(duì)字節(jié)流和字符流的概述。1.2.1 字節(jié)流類字節(jié)流由兩個(gè)類層次結(jié)構(gòu)定義。在頂層有兩個(gè)抽象類:InputStream 和 OutputStream。每個(gè)抽象類都有多個(gè)具體的子類,這些
4、子類對(duì)不同的外設(shè)進(jìn)行處理,例如磁盤(pán)文件,網(wǎng)絡(luò)連接,甚至是內(nèi)存緩沖區(qū)。字節(jié)流類顯示于表1-1 中。表 1-1 字節(jié)流類流類 含義BufferedInputStream 緩沖輸入流BufferedOutputStream 緩沖輸出流ByteArrayInputStream 從字節(jié)數(shù)組讀取的輸入流ByteArrayOutputStream 向字節(jié)數(shù)組寫(xiě)入的輸出流DataInputStream 包含讀取 Java 標(biāo)準(zhǔn)數(shù)據(jù)類型方法的輸入流DataOutputStream 包含編寫(xiě) Java 標(biāo)準(zhǔn)數(shù)據(jù)類型方法的輸出流FileInputStream 讀取文件的輸入流FileOutputStream 寫(xiě)文件
5、的輸出流FilterInputStream 實(shí)現(xiàn) InputStreamFilterOutputStream 實(shí)現(xiàn) OutputStreamInputStream 描述流輸入的抽象類OutputStream 描述流輸出的抽象類PipedInputStream 輸入管道PipedOutputStream 輸出管道PrintStream 包含 print() 和 println() 的輸出流PushbackInputStream 支持向輸入流返回一個(gè)字節(jié)的單字節(jié)的“unget” 的輸入流RandomAccessFile 支持隨機(jī)文件輸入/輸出Sequence
6、InputStream兩個(gè)或兩個(gè)以上順序讀取的輸入流組成的輸入流抽象類 InputStream 和 OutputStream 定義了實(shí)現(xiàn)其他流類的關(guān)鍵方法。最重要的兩種方法是read()和 write() ,它們分別對(duì)數(shù)據(jù)的字節(jié)進(jìn)行讀寫(xiě)。兩種方法都在InputStream 和OutputStream 中被定義為抽象方法。 它們被派生的流類重載。1.2.2 字符流類字符流類由兩個(gè)類層次結(jié)構(gòu)定義。頂層有兩個(gè)抽象類: Reader和 Writer 。這些抽象類處理統(tǒng)一編碼的字符流。 Java 中這些類含有多個(gè)具體的子類。字符流類如表 1-2 所示。表 1-2 字符流的輸入 /輸出類抽象類 Reade
7、r 和 Writer 定義了幾個(gè)實(shí)現(xiàn)其他流類的關(guān)鍵方法。其中兩個(gè)最重要的是 read()和 write() ,它們分別進(jìn)行字符數(shù)據(jù)的讀和寫(xiě)。這些方法被派生流類重載。1.3 預(yù)定義流所有的 Java 程序自動(dòng)導(dǎo)入java.lang 包。該包定義了一個(gè)名為System的類,該類封裝了運(yùn)行時(shí)環(huán)境的多個(gè)方面。System同時(shí)包含三個(gè)預(yù)定義的流變量,in, out和err。這些成員在System 中是被定義成public 和 static 型的,這意味著它們可以不引用特定的System 對(duì)象而被用于程序的其他部分。System.out 是標(biāo)準(zhǔn)的輸出流。默認(rèn)情況下, 它是一個(gè)控制臺(tái)。System.in 是
8、標(biāo)準(zhǔn)輸入,默認(rèn)情況下,它指的是鍵盤(pán)。 System.err指的是標(biāo)準(zhǔn)錯(cuò)誤流,它默認(rèn)是控制臺(tái)。然而,這些流可以重定向到任何兼容的輸入/輸出設(shè)備。 System.in 是 inputStream的對(duì)象; System.out 和 System.err 是 PrintStream 的對(duì)象。它們都是字節(jié)流,盡管它們用來(lái)讀寫(xiě)外設(shè)的字符。但可以用基于字符的流來(lái)包裝它們。二、讀取控制臺(tái)輸入在 Java 1.0 中,完成控制臺(tái)輸入的惟一途徑是字節(jié)流,使用該方法的老代碼依然存在。今天,運(yùn)用字節(jié)流讀取控制臺(tái)輸入在技術(shù)上仍是可行的,但這樣做需要用到不被贊成的方法,這種做法不值得推薦。 Java 2 中讀取控制臺(tái)輸入
9、的首選方法是字符流,它使程序容易符合國(guó)際標(biāo)準(zhǔn)并且易于維護(hù)。Java 沒(méi)有像標(biāo)準(zhǔn)C 的函數(shù) scanf()或 C+ 輸入操作符那樣的統(tǒng)一的控制臺(tái)輸入方法。Java 中,控制臺(tái)輸入由從System.in讀取數(shù)據(jù)來(lái)完成。為獲得屬于控制臺(tái)的字符流,在BufferedReader 對(duì)象中包裝System.in。 BufferedReader 支持緩沖輸入流。它最常見(jiàn)的構(gòu)造函數(shù)如下:BufferedReader(Reader inputReader)這里,inputReader 是鏈接被創(chuàng)建的BufferedReader 實(shí)例的流。Reader 是一個(gè)抽象類。它的一個(gè)具體的子類是InputStreamRe
10、ader,該子類把字節(jié)轉(zhuǎn)換成字符。為獲得鏈接System.in 的一個(gè) InputStreamReader 的對(duì)象,用下面的構(gòu)造函數(shù):InputStreamReader(InputStream inputStream)因?yàn)?System .in 引用了 InputStream 類型的對(duì)象,它可以用于inputStream。綜上所述,下面的一行代碼創(chuàng)建了與鍵盤(pán)相連的 BufferedReader 對(duì)象。BufferedReader br = new BufferedReader(newInputStreamReader(System.in);當(dāng)該語(yǔ)句執(zhí)行后,br 是通過(guò) System.in 生成
11、的鏈接控制臺(tái)的字符流。2.1 讀取字符從 BufferedReader 讀取字符,用 read()。這里所用的 read()版本如下:int read( ) throws IOException該方法每次執(zhí)行都從輸入流讀取一個(gè)字符然后以整型返回。當(dāng)遇到流的末尾時(shí)它返回-1。可以看到,它要引發(fā)一個(gè)IOException 異常。下面的例程演示了read()方法,從控制臺(tái)讀取字符直到用戶鍵入“q” :/ Use a BufferedReader to read characters from the console. import java.io.*;clas
12、s BRRead public static void main(String args) throws IOExceptionchar c;BufferedReader br = newBufferedReader(new InputStreamReader(System.in); System.out.println("Enter characters, 'q' to quit."); / read charactersdo c = (char) br.read();System.out.println(c); while(c != 'q'
13、;);下面是程序運(yùn)行:Enter characters, 'q' to quit.123abcq123abcq2.2 讀取字符串從鍵盤(pán)讀取字符串, 使用 readLine() 。它是 BufferedReader 類的成員。它的通常形式如下:String readLine( ) throws IOException它返回一個(gè)String 對(duì)象。下面的例子闡述了BufferedReader類和 readLine() 方法;程序讀取和顯示文本的行直到鍵入“stop” :/ Read a string from console using a
14、BufferedReader. import java.io.*;class BRReadLines public static void main(String args) throws IOException/ create a BufferedReader using System.in BufferedReader br = new BufferedReader(new InputStreamReader(System.in);String str;System.out.println("Enter lines of text."); System.out.prin
15、tln("Enter 'stop' to quit."); do str = br.readLine(); System.out.println(str); while(!str.equals("stop");下面的例程生成了一個(gè)小文本編輯器。它創(chuàng)建了一個(gè)String對(duì)象的數(shù)組,然后依行讀取文本,把文本每一行存入數(shù)組。它將讀取到100 行或直到按 “stop” 才停止。該例運(yùn)用一個(gè)BufferedReader 類來(lái)從控制臺(tái)讀取數(shù)據(jù)。/ A tiny editor. import java.io.*;
16、 class TinyEdit public static void main(String args) throws IOException/ create a BufferedReader using System.in BufferedReader br = new BufferedReader(new InputStreamReader(System.in);String str = new String100; System.out.println("Enter lines of text."); System.out.println("Enter
17、39;stop' to quit."); for(int i=0; i<100; i+) stri = br.readLine(); if(stri.equals("stop") break;System.out.println("nHere is your file:");/ display the linesfor(int i=0; i<100; i+) if(stri.equals("stop") break;System.out.println(stri);下面是輸出部分:Ente
18、r lines of text.Enter ‘stop’ to quit.This is line one.This is line two.Java makes working with strings easy.Just create String objects.stopHere is your file:This is line one.This is line two.Java makes working with strings easy.Just create String objects.三、向控制臺(tái)寫(xiě)輸出控制臺(tái)輸出由print( )和
19、println( ) 來(lái)完成最為簡(jiǎn)單。這兩種方法由 PrintStream(System.out 引用的對(duì)象類型)定義。盡管System.out 是一個(gè)字節(jié)流,用它作為簡(jiǎn)單程序的輸出是可行的。因?yàn)?PrintStream 是從 OutputStream 派生的輸出流, 它同樣實(shí)現(xiàn)低級(jí)方法write() ,write() 可用來(lái)向控制臺(tái)寫(xiě)數(shù)據(jù)。PrintStream 定義的 write( ) 的最簡(jiǎn)單的形式如下:void write(int byteval)該方法按照byteval 指定的數(shù)目向文件寫(xiě)字節(jié)。盡管byteval定義成整數(shù),但只有低位的8 個(gè)字節(jié)被寫(xiě)入。下面的短例用write() 向
20、屏幕輸出字符“A” ,然后是新的行。/ Demonstrate System.out.write(). class WriteDemo public static void main(String args) int b;b = 'A' System.out.write(b); System.out.write('n');一般不常用write() 來(lái)完成向控制臺(tái)的輸出(盡管這樣做在某些場(chǎng)合非常有用) ,因?yàn)?print() 和 println()更容易用。四、 PrintWriter 類盡管 Java 允許用 System
21、.out 向控制臺(tái)寫(xiě)數(shù)據(jù), 但建議僅用在調(diào)試程序時(shí)或在例程中。對(duì)于實(shí)際的程序, Java 推薦的向控制臺(tái)寫(xiě)數(shù)據(jù)的方法是用 PrintWriter 流。 PrintWriter 是基于字符的類。用基于字符類向控制臺(tái)寫(xiě)數(shù)據(jù)使程序更為國(guó)際化。PrintWriter 定義了多個(gè)構(gòu)造函數(shù),這里所用到的一個(gè)如下:PrintWriter(OutputStream outputStream, booleanflushOnNewline)outputStream 是 OutputStream 類的對(duì)象, flushOnNewline 控制 Java 是否在 println() 方法被調(diào)用時(shí)刷新輸出流。如果 fl
22、ushOnNewline 為 true,刷新自動(dòng)發(fā)生,若為 false,則不發(fā)生。PrintWriter 支持所有類型 (包括 Object )的 print( ) 和 println( )方法,這樣,就可以像用System.out 那樣用這些方法。如果遇到不同類型的情況,PrintWriter 方法調(diào)用對(duì)象的toString()方法并打印結(jié)果。用PrintWriter 向外設(shè)寫(xiě)數(shù)據(jù),指定輸出流為 System.out 并在每一新行后刷新流。例如這行代碼創(chuàng)建了與控制臺(tái)輸出相連的 PrintWriter 類。PrintWriter pw = new PrintWriter(System.out,
23、 true);下面的應(yīng)用程序說(shuō)明了用PrintWriter 處理控制臺(tái)輸出的方法:/ Demonstrate PrintWriterimport java.io.*;public class PrintWriterDemo public static void main(String args) PrintWriter pw = new PrintWriter(System.out, true); pw.println("This is a string"); int i = -7;pw.println(i);double d = 4.5e-7;pw.println(d);
24、該程序的輸出如下:This is a string-74.5E-7五、文件的讀寫(xiě)Java 提供了一系列的讀寫(xiě)文件的類和方法。在 Java 中,所有的文件都是字節(jié)形式的。Java 提供從文件讀寫(xiě)字節(jié)的方法。而且, Java 允許在字符形式的對(duì)象中使用字節(jié)文件流。兩個(gè)最常用的流類是FileInputStream 和 FileOutputStream ,它們生成與文件鏈接的字節(jié)流。為打開(kāi)文件,只需創(chuàng)建這些類中某一個(gè)類的一個(gè)對(duì)象,在構(gòu)造函數(shù)中以參數(shù)形式指定文件的名稱。這兩個(gè)類都支持其他形式的重載構(gòu)造函數(shù)。下面是這里將要用到的形式:FileInputStream(String fileName) thr
25、owsFileNotFoundExceptionFileOutputStream(String fileName) throwsFileNotFoundExceptionfileName 指定需要打開(kāi)的文件名。當(dāng)創(chuàng)建了一個(gè)輸入流而文件不存在時(shí), 引發(fā) FileNotFoundException 異常。對(duì)于輸出流,如果文件不能生成,則引發(fā)FileNotFoundException 異常。如果一個(gè)輸出文件被打開(kāi),所有原先存在的同名的文件被破壞。注意:在早期的Java 版本中,當(dāng)輸出文件不能創(chuàng)建時(shí)FileOutputStream() 引發(fā)一個(gè) IOException 異常。這在Java 2中有所修改
26、。 當(dāng)對(duì)文件的操作結(jié)束后,需要調(diào)用 close( )來(lái)關(guān)閉文件。該方法在FileInputStream 和 FileOutputStream 中都有定義。如下:void close( ) throws IOException為讀文件,可以使用在FileInputStream 中定義的read( )方法。這里用到的如下:int read( ) throws IOException該方法每次被調(diào)用,它僅從文件中讀取一個(gè)字節(jié)并將該字節(jié)以整數(shù)形式返回。當(dāng)讀到文件尾時(shí),read( )返回 -1。該方法可以引發(fā) IOException 異常。下面的程序用read()來(lái)輸入和顯示文本文件的內(nèi)容,該文件名以命
27、令行形式指定。注意try/catch 塊處理程序運(yùn)行時(shí)可能發(fā)生的兩個(gè)錯(cuò)誤未找到指定的文件或用戶忘記包括文件名了。import java.io.*;class ShowFile public static void main(String args)throws IOExceptionint i;FileInputStream fin;try fin = new FileInputStream(args0); catch(FileNotFoundException e) System.out.println("File Not Found"); return; catch(A
28、rrayIndexOutOfBoundsException e) System.out.println("Usage: ShowFile File"); return;/ read characters until EOF is encountered do i = fin.read();if(i != -1) System.out.print(char) i); while(i != -1); fin.close();向文件中寫(xiě)數(shù)據(jù), 需用 FileOutputStream 定義的 write() 方法。它的最簡(jiǎn)單形式如下:void write(int byteval) throws IOException該方法按照byteval 指定的數(shù)目向文件寫(xiě)入字節(jié)。盡管 byteval作為整數(shù)聲明,但僅低8 位字節(jié)可以寫(xiě)入文件。如果在寫(xiě)的過(guò)程中出現(xiàn)問(wèn)題,一個(gè)IOException 被引發(fā)。下面的例子用write() 拷貝一個(gè)文本文件:import java.io.*;class CopyFile public static void main(String args)throws IOExceptionint i;Fi
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物資贊助活動(dòng)策劃方案
- 特色年會(huì)策劃活動(dòng)方案
- 狗狗開(kāi)業(yè)活動(dòng)方案
- 狼人殺線上活動(dòng)方案
- 玉蘭油品牌活動(dòng)方案
- 玉田保險(xiǎn)推銷活動(dòng)方案
- 玉溪衛(wèi)校學(xué)生會(huì)活動(dòng)方案
- 王者榮耀任務(wù)活動(dòng)方案
- 玩轉(zhuǎn)鄉(xiāng)鎮(zhèn)活動(dòng)方案
- 環(huán)保檢查活動(dòng)方案
- 安全產(chǎn)風(fēng)險(xiǎn)管理制度
- 深化國(guó)有企業(yè)改革調(diào)研提綱
- 小學(xué)騎車安全課件
- 公司個(gè)人獨(dú)資章程范本
- 《中國(guó)酒類企業(yè)ESG披露指南》
- 物業(yè)消防培訓(xùn)教學(xué)課件
- 2025年航空安全管理專業(yè)考試試卷及答案
- 2025至2030年中國(guó)玉米淀粉行業(yè)市場(chǎng)現(xiàn)狀分析及前景戰(zhàn)略研判報(bào)告
- 安徽省2025年普通高校招生志愿預(yù)填表(普通類)
- 詐騙諒解書(shū)和退賠協(xié)議書(shū)
- 養(yǎng)生店合作合同協(xié)議書(shū)
評(píng)論
0/150
提交評(píng)論