版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第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è)文件的上一級(jí)目錄名。
StringgetPath():得到一個(gè)文件的路徑名。
StringgetAbsolutePath():得到一個(gè)文件的絕對(duì)路徑名。
StringrenameTo(FilenewName):將當(dāng)前文件名更名為給定文件的完整路徑。
(2)文件屬性測(cè)試:
booleanisAbsolute():測(cè)試此抽象路徑名是否為絕對(duì)路徑名。
booleancanRead():測(cè)試當(dāng)前文件是否可讀。
booleancanWrite():測(cè)試當(dāng)前文件是否可寫。
booleanexists():測(cè)試當(dāng)前File對(duì)象所指示的文件是否存在。
booleanisFile():測(cè)試當(dāng)前文件是否是文件(不是目錄)。
booleanisDirectory();測(cè)試當(dāng)前文件是否是目錄。
booleanisHidden():測(cè)試當(dāng)前文件是否是一個(gè)隱藏文件。
(3)普通文件信息和工具:
longlastModified():得到文件最近一次修改的時(shí)間。
longlength():得到文件的長(zhǎng)度,以字節(jié)為單位。
booleandelete():刪除當(dāng)前文件。
(4)目錄操作:
booleanmkdir():根據(jù)當(dāng)前對(duì)象生成一個(gè)由該對(duì)象指定的路徑。
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)流(低級(jí)流):從/向一個(gè)特定的IO設(shè)備讀/寫數(shù)據(jù)的流。
處理流(高級(jí)流):對(duì)已存在的流進(jìn)行連接和封裝的流。標(biāo)準(zhǔn)輸入/輸出指在字符方式下(如DOS),程序與系統(tǒng)進(jìn)行交互的方式,分為三種:
(1)標(biāo)準(zhǔn)輸入studin,對(duì)象是鍵盤。
(2)標(biāo)準(zhǔn)輸出stdout,對(duì)象是屏幕。
(3)標(biāo)準(zhǔn)錯(cuò)誤輸出stderr,對(duì)象也是屏幕。在例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():將此流重新定位到最后一次對(duì)此輸入流調(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類的對(duì)象時(shí),若指定文件找不到,則拋出FileNotFoundException異常,該異常必須聲明捕獲或拋出。該類的所有方法都是從InputStream類繼承來的,其構(gòu)造方法主要有如下兩種:
publicFileInputStream(Stringname)throws
FileNotFoundException
publicFileInputStream(Filefile)throwsFileNotFoundException
前者使用給定的文件名name創(chuàng)建對(duì)象,后者使用File對(duì)象file創(chuàng)建對(duì)象。構(gòu)造方法參數(shù)所指定的文件成為輸入流的源。
【例8-3】使用FileInputStream類打開并讀取文件
Example8_3.Java。
importjava.io.*;
publicclassExample8_3
{
publicstaticvoidmain(Stringargs[])
{
try{
//創(chuàng)建文件輸入流對(duì)象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對(duì)象,調(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類的對(duì)象時(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)建對(duì)象,后者使用File對(duì)象file創(chuàng)建對(duì)象。構(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對(duì)象的相關(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類的對(duì)象時(shí),若指定文件找不到,則拋出FileNotFoundException異常,該異常必須聲明捕獲或拋出。該類的所有方法都通過繼承得來,其構(gòu)造方法主要有如下兩種:
publicFileReader(Stringname)throwsFileNotFoundException
publicFileReader(Filefile)throwsFileNotFoundExce
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年山西省職教高考《職測(cè)》核心考點(diǎn)必刷必練試題庫(含答案)
- 《國(guó)防動(dòng)員法》知識(shí)考試題庫300題(含答案)
- 2025年武漢警官職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 《金融市場(chǎng)培訓(xùn)》課件
- 2025高考物理一輪復(fù)習(xí)第21講.機(jī)械波.含答案
- 技術(shù)服務(wù)類合同范本
- 幼兒園園長(zhǎng)工作活動(dòng)策劃方案五篇
- 夫妻協(xié)議書范文
- 面包車租車合同
- 公墓銷售代理合同十
- 江蘇省蘇州市2024-2025學(xué)年高三上學(xué)期1月期末生物試題(有答案)
- 銷售與銷售目標(biāo)管理制度
- 2025年第一次工地開工會(huì)議主要議程開工大吉模板
- 第16課抗日戰(zhàn)爭(zhēng)課件-人教版高中歷史必修一
- 對(duì)口升學(xué)語文模擬試卷(9)-江西省(解析版)
- 糖尿病高滲昏迷指南
- 壁壘加筑未來可期:2024年短保面包行業(yè)白皮書
- 2024年四川省廣元市中考物理試題(含解析)
- 環(huán)保局社會(huì)管理創(chuàng)新方案市環(huán)保局督察環(huán)保工作方案
- 2024至2030年中國(guó)水質(zhì)監(jiān)測(cè)系統(tǒng)行業(yè)市場(chǎng)調(diào)查分析及產(chǎn)業(yè)前景規(guī)劃報(bào)告
- 運(yùn)動(dòng)技能學(xué)習(xí)
評(píng)論
0/150
提交評(píng)論