《JAVA語言程序設(shè)計(jì)教程》課件第8章_第1頁
《JAVA語言程序設(shè)計(jì)教程》課件第8章_第2頁
《JAVA語言程序設(shè)計(jì)教程》課件第8章_第3頁
《JAVA語言程序設(shè)計(jì)教程》課件第8章_第4頁
《JAVA語言程序設(shè)計(jì)教程》課件第8章_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

無論學(xué)習(xí)那種語言,都不免要接觸到文件系統(tǒng),要經(jīng)常和文件打交道,Java當(dāng)然也不例外。在介紹JavaIO之前首先介紹一個(gè)非常重要的類File。在Java整個(gè)io包中,F(xiàn)ile類是唯一表示與文件本身有關(guān)的類。使用File類可以進(jìn)行創(chuàng)建或刪除文件等常規(guī)操作。File類的常用構(gòu)造方法如下:

File(Stringparent,Stringchild)

File(Fileparent,Stringchild)

File(URIuri)

File(Stringpathname)

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

(1)文件名的處理:

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

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

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

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

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

(2)文件屬性測試:

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

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

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

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

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

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

booleanisHidden():測試當(dāng)前文件是否是一個(gè)隱藏文件。

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

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

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

booleandelete():刪除當(dāng)前文件。

(4)目錄操作:

booleanmkdir():根據(jù)當(dāng)前對象生成一個(gè)由該對象指定的路徑。

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

流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向數(shù)據(jù)源的流,這個(gè)數(shù)據(jù)源可以是文件、內(nèi)存、或網(wǎng)絡(luò)連接。類似的,當(dāng)程序需要寫入數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向目的地的流。輸入和輸出流可形象地描述為如圖8.2和圖8.3所示的形狀。圖8.2輸入流圖示圖8.3輸出流圖示

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

(1)按數(shù)據(jù)流動(dòng)方向分:

輸入流:只能從中讀取字節(jié)數(shù)據(jù),而不能向其寫入數(shù)據(jù)。

輸出流:只能向其寫入字節(jié)數(shù)據(jù),而不能從中讀取數(shù)據(jù)。

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

字節(jié)流:用于處理字節(jié)數(shù)據(jù)。

字符流:用于處理Unicode字符數(shù)據(jù)。

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

節(jié)點(diǎn)流(低級流):從/向一個(gè)特定的IO設(shè)備讀/寫數(shù)據(jù)的流。

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

(1)標(biāo)準(zhǔn)輸入studin,對象是鍵盤。

(2)標(biāo)準(zhǔn)輸出stdout,對象是屏幕。

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

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

8.3.1字節(jié)輸入輸出流

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

1.?InputStream類

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

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

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

(3)?publicintread(byte[]b,intoff,intlen):將輸入流中最多l(xiāng)en個(gè)數(shù)據(jù)字節(jié)讀入byte數(shù)組。

(4)?publiclongskip(longn):跳過和丟棄此輸入流中數(shù)據(jù)的n個(gè)字節(jié)。

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

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

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

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

(9)?publicvoidclose():關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。

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

2.?OutputStream類

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

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

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

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

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

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

1.?FileInputStream類

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

publicFileInputStream(Stringname)throws

FileNotFoundException

publicFileInputStream(Filefile)throwsFileNotFoundException

前者使用給定的文件名name創(chuàng)建對象,后者使用File對象file創(chuàng)建對象。構(gòu)造方法參數(shù)所指定的文件成為輸入流的源。

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

Example8_3.Java。

importjava.io.*;

publicclassExample8_3

{

publicstaticvoidmain(Stringargs[])

{

try{

//創(chuàng)建文件輸入流對象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();

//關(guān)閉輸入流

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

2.?FileOutputStream類

文件字節(jié)輸出流FileOutputStream類按字節(jié)將數(shù)據(jù)寫入到文件中。在生成FileOutputStream類的對象時(shí),若指定文件不存在,則創(chuàng)建一個(gè)新文件;若指定文件存在,但它是一個(gè)目錄,則會(huì)產(chǎn)生FileNotFoundException異常。在進(jìn)行文件讀寫操作時(shí)會(huì)產(chǎn)生IOException異常,該異常必須聲明捕獲或拋出。FileOutputStream類的構(gòu)造方法主要有如下幾種:

publicFileOutputStream(Stringname)throws

FileNotFoundException

publicFileOutputStream(Filefile)throwsFileNotFoundException

前者使用給定的文件名name創(chuàng)建對象,后者使用File對象file創(chuàng)建對象。構(gòu)造方法參數(shù)所指定的文件成為輸出流的目的地。

publicFileOutputStream(Stringname,Booleanappend)throwsFileNotFoundException

publicFileOutputStream(Filefile,Booleanappend)throwsFileNotFoundException

當(dāng)用構(gòu)造方法創(chuàng)建指向一個(gè)文件的輸出流時(shí),如果參數(shù)append取值true,若文件已存在,輸出流不會(huì)刷新所指向的文件,順序地向該文件輸入數(shù)據(jù)。例8-4首先采用System.in.read(buffer)從鍵盤輸入一行字符,存儲(chǔ)在緩沖區(qū)buffer中,再以FileOutputStream類的write(buffer)方法,將buffer中內(nèi)容寫入文件write.txt中。流操作執(zhí)行完后需要調(diào)用close()方法將輸出流關(guān)閉,執(zhí)行結(jié)果如圖8.8所示。圖8.8例8-4運(yùn)行結(jié)果8.3.3管道流

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

(1)在構(gòu)造方法中進(jìn)行連接:

PipedInputStream(PipedOutputStreampos);

PipedOutputStream(PipedInputStreampis);

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

在類PipedInputStream中,

connect(PipedOutputStreampos);

在類PipedOutputStream中,

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

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

DataInputStream類的構(gòu)造方法描述為:

publicDataInputStream(InputStreamin)

DataOutputStream類的構(gòu)造方法描述為:

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

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

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

1.?Reader類

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

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

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

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

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

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

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

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

(8)?publicvoidmark(intreadAheadLimit):標(biāo)記流中的當(dāng)前位置。

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

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

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

2.?Writer類

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

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

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

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

(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():關(guān)閉此流,但要先刷新它。字符輸出流類Writer的類層次如圖8.12所示。圖8.12Writer類層次8.4.2文件字符流

1.?FileReader類

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

publicFileReader(Stringname)throwsFileNotFoundException

publicFileReader(Filefile)throwsFileNotFoundExce

溫馨提示

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

評論

0/150

提交評論