《JAVA語言程序設計教程》課件第8章_第1頁
《JAVA語言程序設計教程》課件第8章_第2頁
《JAVA語言程序設計教程》課件第8章_第3頁
《JAVA語言程序設計教程》課件第8章_第4頁
《JAVA語言程序設計教程》課件第8章_第5頁
已閱讀5頁,還剩78頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第8章File類與輸入輸出流8.1File類8.2輸入輸出流概述8.3字節流類8.4字符流類8.1File類

無論學習那種語言,都不免要接觸到文件系統,要經常和文件打交道,Java當然也不例外。在介紹JavaIO之前首先介紹一個非常重要的類File。在Java整個io包中,File類是唯一表示與文件本身有關的類。使用File類可以進行創建或刪除文件等常規操作。File類的常用構造方法如下:

File(Stringparent,Stringchild)

File(Fileparent,Stringchild)

File(URIuri)

File(Stringpathname)

其中前面兩種方法可以在某個已知特定的目錄下新建文件或者目錄,后面兩種可以通過pathname或者URI新建文件或者目錄。將File類中的主要方法按如下方式分類:

(1)文件名的處理:

StringgetName():得到一個文件的名稱(不包括路徑)。

StringgetParent():得到一個文件的上一級目錄名。

StringgetPath():得到一個文件的路徑名。

StringgetAbsolutePath():得到一個文件的絕對路徑名。

StringrenameTo(FilenewName):將當前文件名更名為給定文件的完整路徑。

(2)文件屬性測試:

booleanisAbsolute():測試此抽象路徑名是否為絕對路徑名。

booleancanRead():測試當前文件是否可讀。

booleancanWrite():測試當前文件是否可寫。

booleanexists():測試當前File對象所指示的文件是否存在。

booleanisFile():測試當前文件是否是文件(不是目錄)。

booleanisDirectory();測試當前文件是否是目錄。

booleanisHidden():測試當前文件是否是一個隱藏文件。

(3)普通文件信息和工具:

longlastModified():得到文件最近一次修改的時間。

longlength():得到文件的長度,以字節為單位。

booleandelete():刪除當前文件。

(4)目錄操作:

booleanmkdir():根據當前對象生成一個由該對象指定的路徑。

String[]list():返回一個字符串數組,列出當前目錄中的文件和目錄。本示例程序首先檢查“d:/test”文件夾是否存在文件a.txt,若不存在則創建一個新文件。然后,將該文件夾下的所有文件和目錄遍歷以后,分類打印出來。程序運行結果如圖8.1所示。圖8.1例8-1運行結果8.2輸入輸出流概述

流是一個很形象的概念,當程序需要讀取數據的時候,就會開啟一個通向數據源的流,這個數據源可以是文件、內存、或網絡連接。類似的,當程序需要寫入數據的時候,就會開啟一個通向目的地的流。輸入和輸出流可形象地描述為如圖8.2和圖8.3所示的形狀。圖8.2輸入流圖示圖8.3輸出流圖示

Java中的輸入輸出流可以按如下方式進行劃分。典型的輸入輸出流由四個抽象類來表示:InputStream、OutputStream、Reader、Writer。Java中其他多種多樣變化的流均是從它們派生出來的。

(1)按數據流動方向分:

輸入流:只能從中讀取字節數據,而不能向其寫入數據。

輸出流:只能向其寫入字節數據,而不能從中讀取數據。

(2)按照流所處理的數據類型分:

字節流:用于處理字節數據。

字符流:用于處理Unicode字符數據。

(3)按照流所處理的源分:

節點流(低級流):從/向一個特定的IO設備讀/寫數據的流。

處理流(高級流):對已存在的流進行連接和封裝的流。標準輸入/輸出指在字符方式下(如DOS),程序與系統進行交互的方式,分為三種:

(1)標準輸入studin,對象是鍵盤。

(2)標準輸出stdout,對象是屏幕。

(3)標準錯誤輸出stderr,對象也是屏幕。在例8-2中,用“System.in.read(buffer)”從鍵盤輸入一行字符,存儲在緩沖區buffer中,count保存實際讀入的字節個數,再以整數和字符兩種方式輸出buffer中的值。Read方法在java.io包中,而且要拋出IOException異常。

程序輸出結果如圖8.4所示。圖8.4例8-2輸出流圖示8.3字節流類

8.3.1字節輸入輸出流

字節流是從InputStream和OutputStream派生出來的一系列類,這類流以字節(byte)為基本處理單位。

1.?InputStream類

字節輸入流類InputStream的主要方法描述如下:

(1)?publicabstractintread():返回讀取的一個字節;如果到達流的末尾,則返回?-1。

(2)?publicintread(byte[]b):從輸入流中讀取一定數量的字節,并將其存儲在緩沖區數組b中。

(3)?publicintread(byte[]b,intoff,intlen):將輸入流中最多len個數據字節讀入byte數組。

(4)?publiclongskip(longn):跳過和丟棄此輸入流中數據的n個字節。

(5)?publicintavailable():可以不受限制地從此輸入流讀取(或跳過)估計的字節數;如果到達輸入流末尾,則返回0。

(6)?publicvoidmark(intreadlimit):在此輸入流中標記當前的位置,readlimit參數告知此輸入流在標記位置失效之前允許讀取的字節數。

(7)?publicvoidreset():將此流重新定位到最后一次對此輸入流調用mark方法時的位置。

(8)?publicbooleanmarkSupported():如果此輸入流實例會支持mark和reset方法,則返回true;否則返回false。

(9)?publicvoidclose():關閉此輸入流并釋放與該流關聯的所有系統資源。

字節輸入流類InputStream的類層次如圖8.5所示。圖8.5InputStream類層次

2.?OutputStream類

字節輸出流類OutputStream的主要方法描述如下:

(1)?publicabstractvoidwrite(intb):將指定的字節寫入此輸出流,要寫入的字節是參數b的八個低位。

(2)?publicvoidwrite(byte[]b):將b.length個字節從指定的byte數組寫入此輸出流。

(3)?publicvoidwrite(byte[]b,intoff,intlen):將指定的byte數組中從偏移量off開始的len個字節寫入此輸出流。

(4)?publicvoidflush():刷新此輸出流并強制寫出所有緩沖的輸出字節。

(5)?publicvoidclose():關閉此輸出流并釋放與此流有關的所有系統資源。字節輸出流類OutputStream的類層次如圖8.6所示。圖8.6OutputStream類層次8.3.2文件字節流

1.?FileInputStream類

文件字節輸入流FileInputStream類按字節讀取文件中的數據。在生成FileInputStream類的對象時,若指定文件找不到,則拋出FileNotFoundException異常,該異常必須聲明捕獲或拋出。該類的所有方法都是從InputStream類繼承來的,其構造方法主要有如下兩種:

publicFileInputStream(Stringname)throws

FileNotFoundException

publicFileInputStream(Filefile)throwsFileNotFoundException

前者使用給定的文件名name創建對象,后者使用File對象file創建對象。構造方法參數所指定的文件成為輸入流的源。

【例8-3】使用FileInputStream類打開并讀取文件

Example8_3.Java。

importjava.io.*;

publicclassExample8_3

{

publicstaticvoidmain(Stringargs[])

{

try{

//創建文件輸入流對象FileInputStreamin=newFileInputStream("Example8_3.Java");

intn=2;

bytebuffer[]=newbyte[n];

//讀取輸入流

while(in.read(buffer,0,n)!=-1){

Stringstr=newString(buffer,0,n);

System.out.print(str);

}

System.out.println();

//關閉輸入流

in.close();圖8.7例8-3運行結果例8-3以文件名Example8_3.Java創建FileInputStream對象,調用InputStream類的read(byte[]buffer,0,n)方法,每次從源程序文件Example8_3.Java中讀取n個字節,存儲在緩沖區buffer中,再將以buffer中的值構造的字符串str顯示在屏幕上。流操作執行完后需要調用close()方法將輸入流關閉。程序必須使用一個try-catch塊捕獲并處理異常。

2.?FileOutputStream類

文件字節輸出流FileOutputStream類按字節將數據寫入到文件中。在生成FileOutputStream類的對象時,若指定文件不存在,則創建一個新文件;若指定文件存在,但它是一個目錄,則會產生FileNotFoundException異常。在進行文件讀寫操作時會產生IOException異常,該異常必須聲明捕獲或拋出。FileOutputStream類的構造方法主要有如下幾種:

publicFileOutputStream(Stringname)throws

FileNotFoundException

publicFileOutputStream(Filefile)throwsFileNotFoundException

前者使用給定的文件名name創建對象,后者使用File對象file創建對象。構造方法參數所指定的文件成為輸出流的目的地。

publicFileOutputStream(Stringname,Booleanappend)throwsFileNotFoundException

publicFileOutputStream(Filefile,Booleanappend)throwsFileNotFoundException

當用構造方法創建指向一個文件的輸出流時,如果參數append取值true,若文件已存在,輸出流不會刷新所指向的文件,順序地向該文件輸入數據。例8-4首先采用System.in.read(buffer)從鍵盤輸入一行字符,存儲在緩沖區buffer中,再以FileOutputStream類的write(buffer)方法,將buffer中內容寫入文件write.txt中。流操作執行完后需要調用close()方法將輸出流關閉,執行結果如圖8.8所示。圖8.8例8-4運行結果8.3.3管道流

管道用來把一個程序、線程和代碼塊的輸出連接到另一個程序、線程和代碼塊的輸入。java.io中提供了類PipedInputStream和PipedOutputStream作為管道的輸入和輸出流。管道輸入流作為一個通信管道的接收端,管道輸出流則作為發送端。管道流必須是輸入輸出并用,即在使用管道前,兩者必須進行連接。管道輸入/輸出流可以用兩種方式進行連接。

(1)在構造方法中進行連接:

PipedInputStream(PipedOutputStreampos);

PipedOutputStream(PipedInputStreampis);

(2)通過各自的connect()方法連接:

在類PipedInputStream中,

connect(PipedOutputStreampos);

在類PipedOutputStream中,

connect(PipedInputStreampis);例8-5中首先連接輸入管道in與輸出管道out,Send線程向輸出管道out發送數據,Receive線程從輸入管道in中接收數據。程序運行結果如圖8.9所示。圖8.9例8-5輸出流圖示8.3.4數據流

數據輸入流DataInputStream和數據輸出流DataOutputStream在提供了字節流的讀寫手段的同時,以統一的通用形式向輸入流寫入boolean、int、long、double等基本數據類型,并可以再次把基本數據類型的值讀取回來。

DataInputStream類的構造方法描述為:

publicDataInputStream(InputStreamin)

DataOutputStream類的構造方法描述為:

publicDataOutputStream(OutputStreamout)例8-6中使用DataInputStream類逐一將Student對象的相關參數存入student.txt文件中,隨后使用DataOutputStream類將student.txt文件中的數據逐一讀出。程序運行結果如圖8.10所示。圖8.10例8-6輸出流圖示8.4字符流類

字節流不能操作Unicode字符,由于Java采用16位的Unicode字符,即一個字符占16位,所以要使用字符流,以提供直接的字符輸入輸出支持。在Unicode字符中,一個漢字被看成一個字符,占用2個字節,若使用字節流,讀取不當會出現亂碼,若采用字符流,則不會出現類似情形。8.4.1字符流類層次

字符流是從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為基本處理單位。

1.?Reader類

字符輸入流類Reader的主要方法描述如下:

(1)?publicintread(CharBuffertarget):試圖將字符讀入指定的字符緩沖區。

(2)?publicintread():讀取單個字符。

(3)?publicintread(char[]cbuf):將字符讀入數組。

(4)?publicabstractintread(char[]cbuf,intoff,intlen):將字符讀入數組的某一部分。

(5)?publiclongskip(longn):跳過n個字符。

(6)?publicbooleanready():判斷是否準備讀取此流。

(7)?publicbooleanmarkSupported():判斷此流是否支持mark()操作。

(8)?publicvoidmark(intreadAheadLimit):標記流中的當前位置。

(9)?publicvoidreset():重置該流。

(10)?publicabstractvoidclose():關閉該流并釋放與之關聯的所有資源。

字符輸入流類Reader的類層次如圖8.11所示。圖8.11Reader類層次

2.?Writer類

字符輸出流類Writer的主要方法描述如下:

(1)?publicvoidwrite(intc):寫入單個字符。

(2)?publicvoidwrite(char[]cbuf):寫入字符數組。

(3)?publicabstractvoidwrite(char[]cbuf,intoff,intlen):寫入字符數組的某一部分。

(4)?publicvoidwrite(Stringstr):寫入字符串。

(5)?publicvoidwrite(Stringstr,intoff,intlen):寫入字符串的某一部分。

(6)?publicWriterappend(CharSequencecsq):將指定字符序列添加到此writer。

(7)?publicWriterappend(CharSequencecsq,intstart,intend):將指定字符序列的子序列添加到此writer。

(8)?publicWriterappend(charc):將指定字符添加到此writer。

(9)?publicabstractvoidflush():刷新該流的緩沖。

(10)?publicabstractvoidclose():關閉此流,但要先刷新它。字符輸出流類Writer的類層次如圖8.12所示。圖8.12Writer類層次8.4.2文件字符流

1.?FileReader類

文件字符輸入流FileReader類按字符讀取文件中的數據。在生成FileReader類的對象時,若指定文件找不到,則拋出FileNotFoundException異常,該異常必須聲明捕獲或拋出。該類的所有方法都通過繼承得來,其構造方法主要有如下兩種:

publicFileReader(Stringname)throwsFileNotFoundException

publicFileReader(Filefile)throwsFileNotFoundExce

溫馨提示

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

評論

0/150

提交評論