版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 足療店員工合同協(xié)議書范本
- 精準(zhǔn)權(quán)威治療協(xié)議服務(wù)合同
- 智能軟件服務(wù)升級新約
- 家庭電器安全保證
- 物資采購合同范例
- 抗磨損性能灰砂磚采購
- 上海房屋交易合同規(guī)范版
- 循環(huán)借款合同的金融科技應(yīng)用
- 學(xué)生筆記本采購合同范本
- 易用的競爭性談判招標(biāo)文件范本
- 小學(xué)三年級上冊美術(shù)期末測試卷(含答案)
- 智慧樹知到《艾滋病性與健康》見面課答案
- 起重機(jī)械安裝拆卸工安全操作規(guī)程
- 安徽省合肥市琥珀中學(xué)2023-2024學(xué)年八年級上學(xué)期期中語文試題
- 15D501 建筑物防雷設(shè)施安裝
- 面向多目標(biāo)優(yōu)化的煙草制絲APS設(shè)計(jì)與實(shí)現(xiàn)
- 復(fù)變函數(shù)論與運(yùn)算微積智慧樹知到課后章節(jié)答案2023年下哈爾濱工業(yè)大學(xué)(威海)
- 青海利亞達(dá)化工有限公司年產(chǎn)6000噸高純硼酸升級改造項(xiàng)目環(huán)評報(bào)告
- 小班健康《動(dòng)物模仿秀》
- 5S提升管理報(bào)告
- 電力建設(shè)“五新”推廣應(yīng)用信息目錄(試行)
評論
0/150
提交評論