Java語言程序設計案例教程第10章_第1頁
Java語言程序設計案例教程第10章_第2頁
Java語言程序設計案例教程第10章_第3頁
Java語言程序設計案例教程第10章_第4頁
Java語言程序設計案例教程第10章_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 輸入輸入/ /輸出處理是程序設計中重要的一個部分,比如從鍵盤讀取數(shù)據、從輸出處理是程序設計中重要的一個部分,比如從鍵盤讀取數(shù)據、從文件中讀取數(shù)據或向文件中寫數(shù)據等等。文件中讀取數(shù)據或向文件中寫數(shù)據等等。JavaJava把這些不同類型的輸入、把這些不同類型的輸入、輸出源抽象為流(輸出源抽象為流(streamstream),用統(tǒng)一接口來表示,從而使程序簡單明了。),用統(tǒng)一接口來表示,從而使程序簡單明了。本章主要介紹本章主要介紹JavaJava程序輸入輸出的實現(xiàn)和文件與目錄的管理。程序輸入輸出的實現(xiàn)和文件與目錄的管理。 本章要點本章要點l10.1 輸入與輸出基礎輸入與輸出基礎l10.2 文件輸入文

2、件輸入/輸出輸出l思考與練習思考與練習10Java的輸入輸出功能必須使用類庫java.io來實現(xiàn),這個類庫中的類大部分是用來完成流式輸入輸出的類。Java Applet程序的特點如下。10.1.1 流的概念流的概念流式輸入輸出是一種很常見的輸入輸出方式。流是指在計算機的輸入與輸出之間運動的數(shù)據序列。流序列中的數(shù)據既可以是未經加工的原始的二進制數(shù)據,也可以是經一定編碼處理后符合某種格式規(guī)定的特定數(shù)據。Java程序通過流來完成輸入/輸出。流通過Java的輸入/輸出系統(tǒng)與物理設備鏈接。盡管與它們鏈接的物理設備不盡相同,所有流的行為具有同樣的方式。這樣,相同的輸入/輸出類和方法適用于所有類型的外部設備

3、。這意味著一個輸入流能夠抽象多種不同類型的輸入:磁盤文件,鍵盤或網絡套接字。同樣,一個輸出流可以輸出到控制臺,磁盤文件或相連的網絡。Java中流的實現(xiàn)是在java.io包定義的類層次結構內部的。在Java中,把不同類型的輸入、輸出源(鍵盤、文件、網絡等)抽象為流(Stream),而其中輸入或輸出的數(shù)據則稱為數(shù)據流(Data Stream),用統(tǒng)一的方式來表示,從而使程序設計簡單明了。輸入流只能從中讀取數(shù)據,而不能向其寫出數(shù)據;輸出流只能向其寫出數(shù)據,而不能從中讀取數(shù)據。10.1.2 字節(jié)流與字符流字節(jié)流與字符流Java定義了兩種類型的流:字節(jié)類和字符類。它們屬于基本輸入/輸出流類,是其他輸入/

4、輸出流類的父類。字節(jié)流(byte stream)為處理字節(jié)的輸入和輸出提供了方便的方法,例如,使用字節(jié)流讀取或書寫二進制數(shù)據。字符流(character stream)為字符的輸入和輸出處理提供了方便。它們采用了統(tǒng)一的編碼標準,因而可以國際化。當然,在某些場合,字符流比字節(jié)流更有效。需要聲明:在最底層,所有的輸入/輸出都是字節(jié)形式的?;谧址牧髦粸樘幚碜址峁┓奖阌行У姆椒?。下面是對字節(jié)流和字符流的介紹。字節(jié)流類字節(jié)流由兩個類層次結構定義。在頂層有兩個抽象類:InputStream 和 OutputStream。每個抽象類都有多個具體的子類,這些子類對不同的外設進行處理,例如磁盤文件,網絡連

5、接,甚至是內存緩沖區(qū)。需要說明的是,要使用流類,必須導入java.io包。書中表10-1顯示了字節(jié)流類。 10.1.2 字節(jié)流與字符流字節(jié)流與字符流抽象類InputStream 和 OutputStream定義了實現(xiàn)其他流類的關鍵方法。最重要的兩種方法是read()和write(),它們分別對數(shù)據的字節(jié)進行讀寫。兩種方法都在InputStream 和OutputStream中被定義為抽象方法,它們被派生的流類重載。InputStream類中的常用方法有:int read():從輸入流中讀一個字節(jié),形成一個0255之間的整數(shù)返回(是一個抽象方法)。int read(byte b):讀多個字節(jié)到數(shù)

6、組中。int read(byte b, int off, int len):從輸入流中讀取長度為len的數(shù)據,寫入數(shù)組b中從索引off開始的位置,并返回讀取的字節(jié)數(shù)。對于這三個方法,若返回1,表明流結束。10.1.2 字節(jié)流與字符流字節(jié)流與字符流skip():跳過流中若干字節(jié)數(shù)available():返回流中可用字節(jié)數(shù)mark():在流中標記一個位置reset():返回標記過得位置markSupport():是否支持標記和復位操作close():關閉流OutputStream類的常用方法有:write(int b):將一個整數(shù)輸出到流中(只輸出低位字節(jié),抽象方法)nwrite(byte b):

7、將字節(jié)數(shù)組中的數(shù)據輸出到流中nwrite(byte b, int off, int len):將數(shù)組b中從off指定的位置開始,長度為len的數(shù)據輸出到流中flush():刷空輸出流,并將緩沖區(qū)中的數(shù)據強制送出close():關閉流10.1.2 字節(jié)流與字符流字節(jié)流與字符流字符流類字符流類由兩個類層次結構定義。頂層有兩個抽象類:Reader和Writer。這些抽象類處理統(tǒng)一編碼的字符流。Java中這些類含有多個具體的子類。字符流類如書中表10-2所示。 抽象類Reader和Writer定義了幾個實現(xiàn)其他流類的關鍵方法。其中兩個最重要的是read()和write(),它們分別進行字符數(shù)據的讀和寫

8、。這些方法被派生流類重載。Java的輸入/輸出類庫中包含的流類很多,這里只作了一個簡要的介紹。更詳細的內容可以參看類庫手冊。 10.1.3 標準輸入標準輸入/輸出輸出Java程序使用字符界面與系統(tǒng)標準輸入輸出間進行數(shù)據通信,即從鍵盤讀入數(shù)據,或向屏幕輸出數(shù)據,是十分常見的操作。為此而頻頻創(chuàng)建輸入輸出流類對象將很不方便。因此,Java系統(tǒng)事先定義好三個流對象,分別與系統(tǒng)的標準輸入、標準輸出和標準錯誤輸出相聯(lián)系。所有的Java程序自動導入java.lang包。該包定義了一個名為System的類,該類封裝了運行時環(huán)境的多個方面。例如,使用它的某些方法,你能獲得當前時間和與系統(tǒng)有關的不同屬性。Syst

9、em 同時包含三個預定義的流變量:in,out和err。這些成員在System中是被定義成public和static型的,這意味著它們可以不引用特定的System對象而被用于程序的其他部分。10.1.3 標準輸入標準輸入/輸出輸出System.out是標準的輸出流,默認情況下,它指的是顯示設備。System.in是標準輸入,默認情況下,它指的是鍵盤。System.err指的是標準錯誤流,它默認是顯示設備。這些流也可以重定向到任何兼容的輸入/輸出設備。System.in 是InputStream的對象;System.out和System.err是PrintStream的對象。盡管它們用來讀寫外設

10、的字符,但它們都是字節(jié)流。(1)標準輸入Java的標準輸入System.in是InputStream類的對象,當程序中需要從鍵盤讀入數(shù)據的時候,只需調用System.in的read()方法即可。如下面的語句將從鍵盤讀入一個字節(jié)的數(shù)據:char ch = System.in.read();10.1.3 標準輸入標準輸入/輸出輸出在使用System.in.read()方法讀入數(shù)據時,需要注意如下幾點:System.in.read()語句必須包含在try塊中,且try塊后面應該有一個可接收IOException異常的catch塊。如下例所示:try ch = System.in.read(); ca

11、tch(IOException e) 執(zhí)行System.in.read()方法將從鍵盤緩沖區(qū)讀入一個字節(jié)的數(shù)據,然而返回的卻是16比特的整型量的低位字節(jié)是真正輸入的數(shù)據,其高位字節(jié)是全零。10.1.3 標準輸入標準輸入/輸出輸出另外,作為InputStream類的對象,System.in只能從鍵盤讀取二進制的數(shù)據,而不能把這些比特信息轉換為整數(shù)、字符、浮點數(shù)或字符串等復雜數(shù)據類型的量。當鍵盤緩沖區(qū)中沒有未被讀取的數(shù)據時,執(zhí)行System.in.read()將導致系統(tǒng)轉入阻塞(block)狀態(tài)。在阻塞狀態(tài)下,當前流程將停留在上述語句位置且整個程序被掛起,等待用戶輸入一個鍵盤數(shù)據后,才能繼續(xù)運行下

12、去;所以程序中有時利用System.in.read()語句來達到暫時保留屏幕的目的。例如,下面的語句段:System.out.println(Press any key to finish the program);try char test=(char)System.in.read( );catch(IOException e) 10.1.3 標準輸入標準輸入/輸出輸出(2) 標準輸出Java的標準輸出System.out是打印輸出流PrintStream類的對象。PrintStream是過濾輸出類流FilterOutputStream的一個子類,其中定義了向屏幕輸送不同類型數(shù)據的方法pri

13、nt()和println()。println()方法有多種形式,概括起來可表述為:public void println ( 類型 變量或對象 );println()的作用是向屏幕輸出其參數(shù)指定的變量或對象,然后再換行,使光標停留在屏幕下一行第一個字符的位置。如果println()方法的參數(shù)為空,則將輸出一個空行。println()方法可輸出多種不同類型的變量或對象,包括boolean,double,float,int,long類型的變量以及Object類的對象。print()方法的使用情況與println()方法完全相同,也可以實現(xiàn)在屏幕上輸出不同類型的變量和對象的操作。不同的是,print

14、()方法輸出對象后并不附帶一個回車,下一次輸出時,將輸出在同一行中。Java提供了一系列的讀寫文件的類和方法。在Java中,所有文件都是字節(jié)形式的。Java提供從文件讀寫字節(jié)的方法,而且允許在字符形式的對象中使用字節(jié)文件流。10.2.1 Java文件和目錄管理文件和目錄管理文件是用來保存數(shù)據的,目錄是管理文件的特殊機制,同類文件保存在同一個目錄下可以簡化文件管理。因此,掌握文件和目錄的操作對于編程人員是十分必須的。Java支持文件管理和目錄管理,它們都是由專門的java.io.File類來實現(xiàn)。File類也屬于javaio包中,但它不是InputStream或者OutputStream的子類。

15、每個File類的對象表示一個磁盤文件或目錄,其對象屬性中包含了文件或目錄的相關信息,如名稱、長度、所含文件個數(shù)等,調用它的方法則可以完成對文件或目錄的常用管理操作,如創(chuàng)建、刪除等。10.2.1 Java文件和目錄管理文件和目錄管理1創(chuàng)建創(chuàng)建File類的對象類的對象每個File類的對象都對應了系統(tǒng)的一個磁盤文件或目錄,所以創(chuàng)建File類對象時需指明它所對應的文件或目錄名。File類共提供了三個不同的構造方法,以不同的參數(shù)形式靈活地接收文件和目錄名信息。(1)File(String path):字符串參數(shù)path指明了新創(chuàng)建的File對象對應的磁盤文件或目錄名及其路徑名。path參數(shù)也可以對應磁盤

16、上的某個目錄,如“c:javatemp”或“javatemp”。(2)File(String path,String name):第一個參數(shù)path表示所對應的文件或目錄的絕對或相對路徑,第二個參數(shù)name表示文件或目錄名。這里將路徑與名稱分開的好處是相同路徑的文件或目錄可共享同一個路徑字符串,管理、修改都較方便。(3)File(File dir,String name):這個構造方法使用另一個已經存在的代表某磁盤目錄的File對象作為第一個參數(shù),表示文件或目錄的路徑,第二個字符串參數(shù)表述文件或目錄名。10.2.1 Java文件和目錄管理文件和目錄管理2獲取文件或目錄屬性獲取文件或目錄屬性一個

17、對應于某磁盤文件或目錄的File對象一經創(chuàng)建,就可以通過調用它的方法來獲得該文件或目錄的屬性。其中,較常用的方法如下:(1)判斷文件或目錄是否存在:pub1ic boo1ean exists();若文件或目錄存在,則返回true;否則返回false(2)判斷是文件還是目錄:public boolean isFile();若對象代表有效文件,則返回truepub1ic boolean isDirectory();若對象代表有效目錄,則返回true10.2.1 Java文件和目錄管理文件和目錄管理2獲取文件或目錄屬性獲取文件或目錄屬性(3)獲取文件或目錄名稱與路徑:public String ge

18、tName();返回文件名或目錄名public String getPath();返回文件或目錄的路徑(4)獲取文件的長度:public long length();返回文件的字節(jié)數(shù)(5)獲取文件讀寫屬性public boolean canRead();若文件為可讀文件,則返回true,否則返回falsepublic boolean canWrite();若文件為可寫文件,返回true,否則返回false 10.2.1 Java文件和目錄管理文件和目錄管理2獲取文件或目錄屬性獲取文件或目錄屬性(6)列出目錄中的文件:public Strins list();將目錄中所有文件名保存在字符串數(shù)組中

19、返回(7)比較兩個文件或目錄public boolean equals(File f);若兩個File對象相同,則返回true10.2.1 Java文件和目錄管理文件和目錄管理3文件或目錄操作文件或目錄操作File類中還定義了一些對文件或目錄進行管理、操作的方法,常用的有如下幾種:(1)重命名文件:pub1ic boolean renameTo(FilenewFile);將文件重命名成newFile對應的文件名(2)刪除文件:public void delete();將當前文件刪除(3)創(chuàng)建目錄:public boolean mkdir();創(chuàng)建當前目錄的子目錄 10.2.2 文件輸入文件輸入

20、/輸出流輸出流使用File類,可以方便地建立與某磁盤文件的連接,但是,如果希望從磁盤文件讀取數(shù)據,或者將數(shù)據寫入文件,還需要使用文件輸入/輸出流類FileInputStream和FileOutputStream。下面是它們的形式:FileInputStream(String fileName) throws FileNotFoundExceptionFileOutputStream(String fileName) throws FileNotFoundException這里,fileName指定需要打開的文件名。當你創(chuàng)建了一個輸入流而文件不存在時,引發(fā)FileNotFoundExceptio

21、n異常。對于輸出流,如果文件不能生成,則引發(fā)FileNotFound Exception異常。如果一個輸出文件被打開,所有原先存在的同名的文件被破壞。10.2.2 文件輸入文件輸入/輸出流輸出流當你對文件的操作結束后,需要調用close( )來關閉文件。該方法在FileInputStream和FileOutputStream中都有定義。例如:void close( ) throws IOException為讀文件,可以使用在FileInputStream中定義的read( )方法。例如:int read( ) throws IOException該方法每次被調用,它僅從文件中讀取一個字節(jié)并將該

22、字節(jié)以整數(shù)形式返回。當讀到文件尾時,read( )返回-1。該方法可以引發(fā)IOException異常。向文件中寫數(shù)據,需用FileOutputStream定義的write()方法。它的最簡單形式如下:void write(int byteval) throws IOException該方法按照byteval指定的數(shù)向文件寫入字節(jié)。盡管byteval作為整數(shù)聲明,但僅低8位字節(jié)可以寫入文件。如果在寫的過程中出現(xiàn)問題,一個IOException異常被引發(fā)。10.2.2 文件輸入文件輸入/輸出流輸出流利用文件輸入、輸出流完成磁盤文件的讀寫一般應遵循如下的步驟:1 1利用文件名字符串或利用文件名字符串

23、或FileFile對象創(chuàng)建輸入輸出流對象對象創(chuàng)建輸入輸出流對象FileInputStream有兩個常用的構造方法:(1)FileInputStream(String FileName);利用文件名(包括路徑名)字符串創(chuàng)建從該文件讀入數(shù)據的輸入流。(2)FileInputStream(File f);利用已存在的File對象創(chuàng)建從該對象對應的磁盤文件中讀入數(shù)據的文件輸入流。需要注意的是:無論哪個構造方法,在創(chuàng)建文件輸入或輸出流時都可能因給出的文件名不對或路徑不對,或文件的屬性不對等,不能讀出文件而造成錯誤,此時系統(tǒng)會拋出異常FileNotFoundException。所以創(chuàng)建文件輸入、輸出流并調

24、用構造方法的語句應該被包括在try塊中,并有相應的catch塊來處理它們可能產生的異常。10.2.2 文件輸入文件輸入/輸出流輸出流2 2從文件輸入從文件輸入/ /輸出流中讀寫數(shù)據輸出流中讀寫數(shù)據從文件輸入、輸出流中讀寫數(shù)據有兩種方式,一是直接利用FileInputStream和FileOutputStream自身的讀寫功能;一是以FileInputStream和FileOutputStream為原始數(shù)據源,再套接上其他功能較強大的輸入、輸出流完成文件的讀寫操作。為了能更方便地從文件中讀寫不同類型的數(shù)據,一般都采用第二種方式,即以FileInputStream和FileOutputStream

25、為數(shù)據源完成與磁盤文件的映射連接后,再創(chuàng)建其他流類的對象從FileInputStream和FileOutputStream對象中讀寫數(shù)據。一般較常用的是過濾流的兩個子類DataInputStream和DataOutputStream,甚至還可以進一步簡化為如下寫法:Fi1e MyFi1e= new File (MyTextFile );DataInputStream din =new DataInputStream(new FileInputStream (MyEile);DataOutputStream dour=new DataOutputStream(new FileOutputStre

26、am(MyFi1e);10.2.3 隨機存取文件隨機存取文件FileInputStream和FileOutputStream實現(xiàn)的是對磁盤文件的順序讀寫,而且讀和寫要分別創(chuàng)建不同的對象。相比之下,Java中還定義了另一個功能更強大,使用更方便的類RandomAccessFile,它可以實現(xiàn)對文件的隨機讀寫操作。1 1創(chuàng)建創(chuàng)建RandomAccessFileRandomAccessFile對象對象RandomAccessFile類有兩個構造方法:RandomAccessFile(String name, String mode);RandomAccessFile(File f, String m

27、ode);無論使用哪個創(chuàng)建RandomAccessFile對象,都要求提供兩種信息:一個作為數(shù)據源的文件,以文件名字符串或文件對象的方式表述;另一個是訪問模式字符串,它規(guī)定了RandomAccessFile對象可以用何種方式打開和訪問指定的文件。10.2.3 隨機存取文件隨機存取文件訪問模式字符串mode有兩種取值:“r”代表了以只讀方式打開文件;“rw”代表以讀寫方式打開文件,這時用一個對象就可以同時實現(xiàn)讀寫兩種操作。創(chuàng)建RandomAccessFile對象時,可能產生兩種異常:當指定的文件不存在時,系統(tǒng)將拋出FileNotFoundException;若試圖用讀寫方式打開只讀屬性的文件或出現(xiàn)了其他輸入、輸出錯誤,則會拋出IOException異常。下面是創(chuàng)建RandomAccessFile對象例子:File File1=new File (File1.txt );RandomAccessFile MyRa=new RandomAccessFile (File1, rw );10.2.3 隨機存取文件隨機存取文件2 2對文件位置指針的操作對文件位置指針的操作RandomAccessFile實現(xiàn)的是隨機讀寫,即可以在文件的任意位置執(zhí)行數(shù)據讀寫,而不一定要從前向后操作。要實現(xiàn)這樣的功能,必須定義文件位置指針和移動這個指針的方法。RandomAccessFile對象的文件位置指針遵循

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論