《Java程序設(shè)計(jì)》課件第7章_第1頁(yè)
《Java程序設(shè)計(jì)》課件第7章_第2頁(yè)
《Java程序設(shè)計(jì)》課件第7章_第3頁(yè)
《Java程序設(shè)計(jì)》課件第7章_第4頁(yè)
《Java程序設(shè)計(jì)》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章輸入/輸出7.1流和文件7.2基本輸入/輸出類7.3文件的輸入/輸出7.4編程實(shí)例 7.1流和文件

7.1.1流

Java語(yǔ)言中輸入/輸出功能是通過(guò)流類來(lái)實(shí)現(xiàn)的,java.io包提供了一套豐富的流類,可以完成從基本的輸入/輸出到復(fù)雜的隨機(jī)文件訪問(wèn),包括Java中的網(wǎng)絡(luò)操作也是通過(guò)流來(lái)完成的。

流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開(kāi)啟一個(gè)通向數(shù)據(jù)源的流,這個(gè)數(shù)據(jù)源可以是文件、內(nèi)存或是網(wǎng)絡(luò)連接。當(dāng)程序需要寫入數(shù)據(jù)的時(shí)候,就會(huì)開(kāi)啟一個(gè)通向目的地的流。可以想像,數(shù)據(jù)好像在其中流動(dòng),如圖7.1所示。圖7.1流的概念

Java中的流按照處理數(shù)據(jù)的單位可分為兩種:一種是字節(jié)流,另一種是字符流,分別由四個(gè)抽象類InputStream、OutputStream、Reader和Writer來(lái)表示。Java中的其他多種多樣的流類均是由它們派生出來(lái)的。早期的Java版本僅提供InputStream和OutputStream,它們是基于字節(jié)的流,而基于字符流的Reader和Writer是作為補(bǔ)充后來(lái)加入的。

本書主要介紹字節(jié)流的使用。字符流的使用與字節(jié)流十分相似,只是它們的讀/寫單位是Unicode字符,而字節(jié)流的讀/寫單位是字節(jié)。按照對(duì)流中數(shù)據(jù)的處理方式,Java語(yǔ)言中的流可分為文本流和二進(jìn)制流。文本流是一個(gè)字符序列,在文本流中可按需要進(jìn)行某些字符的轉(zhuǎn)換,被讀/寫的字符和外部設(shè)備之間不存在一一對(duì)應(yīng)的關(guān)系,被讀/寫字符的個(gè)數(shù)可能與外部設(shè)備中字符的個(gè)數(shù)不一樣。例如標(biāo)準(zhǔn)輸出流System.out就是文本流,程序中不同類型的數(shù)據(jù)經(jīng)過(guò)轉(zhuǎn)換后輸出到標(biāo)準(zhǔn)輸出設(shè)備。二進(jìn)制流在讀/寫過(guò)程中不進(jìn)行轉(zhuǎn)換,外部設(shè)備中的字節(jié)(或字符)與被讀/寫的字節(jié)(或字符)一一對(duì)應(yīng)。

由于Java輸入/輸出涉及的類非常多,本章首先介紹幾個(gè)基本的抽象類,然后著重討論文件的輸入/輸出操作。本書第8章將討論部分有關(guān)網(wǎng)絡(luò)編程的流類的使用。7.1.2文件

文件也是一個(gè)邏輯概念。計(jì)算機(jī)系統(tǒng)中的文件不僅指通常的磁盤文件,還包括很多外部設(shè)備,如鍵盤、顯示器、打印機(jī)等,都可以看成是文件。

Java語(yǔ)言中對(duì)文件的讀/寫操作都是通過(guò)流來(lái)完成的。通過(guò)對(duì)文件的打開(kāi)操作,可以建立流與特定文件之間的聯(lián)系??梢允褂幂斎肓鲝奈募镒x出字節(jié),并將這些字節(jié)保存到臨時(shí)的字節(jié)數(shù)組里,或者使用輸出流把它們寫到新的文件里。值得注意的是,并不是所有的文件都具有相同的功能,例如,磁盤文件支持隨機(jī)存取,而標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出只能順序存取。

使用關(guān)閉操作,可以解除流與特定文件之間的聯(lián)系。對(duì)于一個(gè)輸出流,關(guān)閉流會(huì)使其相關(guān)的緩沖區(qū)中的所有內(nèi)容寫到外部設(shè)備。在程序終止前,應(yīng)該關(guān)閉所有打開(kāi)的流。 7.2基本輸入/輸出類

7.2.1InputStream類

InputStream是基本的輸入流類,它是一個(gè)抽象類,程序中不可能直接創(chuàng)建InputStream類的對(duì)象,它定義了輸入流類共同的特性。

InputStream類中定義了read方法,用于從輸入流讀取數(shù)據(jù):

●?publicabstractintread()throwsIOException;

●?publicintread(byteb[])throwsIOException;

●?publicintread(byteb[],intoffset,intlength)throwsIOException。

read方法有幾種重載形式,可以讀取一個(gè)字節(jié)或一組字節(jié)。若流中數(shù)據(jù)已讀完,例如遇到磁盤文件尾,則返回-1。第三種形式的參數(shù)offset指將結(jié)果放在數(shù)組b[]中從第offset個(gè)字節(jié)開(kāi)始的空間,length為字節(jié)長(zhǎng)度。

InputStream類中還定義了其他一些基本的方法:

●?publicintavailable()throwsIOException——返回輸入流中可用的字節(jié)數(shù)。此方法對(duì)InputStream的有些派生類無(wú)效,會(huì)返回零字節(jié)的錯(cuò)誤結(jié)果。

●?publicvoidclose()throwsIOException——關(guān)閉輸入流并釋放資源?!?publicbooleanmarkSupported();——返回布爾值,說(shuō)明此流能否做標(biāo)記。

●?publicsynchronizedvoidmark(intreadlimit);——為當(dāng)前流做標(biāo)記。其參數(shù)說(shuō)明在標(biāo)記失效前可以讀多少字節(jié),這個(gè)值通常也就設(shè)定了流的緩沖區(qū)大小。

●?publicsynchronizedvoidreset()throwsIOException——返回到上一次做標(biāo)記處。

●?publiclongskip(longn)throwsIOException——從輸入流跳過(guò)幾個(gè)字節(jié)。返回值為實(shí)際跳過(guò)的字節(jié)數(shù)。輸入流只能從外部設(shè)備順序讀取數(shù)據(jù),為了能重復(fù)讀部分內(nèi)容,提供“標(biāo)記”(mark)這一機(jī)制,用于記錄流中某些特定的位置。要支持mark,要求輸入流有一定大小的緩沖區(qū),用于存放部分?jǐn)?shù)據(jù),即從標(biāo)記點(diǎn)到當(dāng)前位置的數(shù)據(jù)。當(dāng)這一緩沖區(qū)裝滿溢出,無(wú)法追蹤到上一個(gè)標(biāo)記處的數(shù)據(jù)時(shí),標(biāo)記失效。若用reset返回到一個(gè)失效的標(biāo)記處,將會(huì)發(fā)生輸入/輸出異常(IOException)。7.2.2OutputStream類

OutputStream是基本的輸出流類,與InputStream類一樣也是抽象類,它定義了輸出流類的共同特性。

OutputStream類定義了write方法,用于輸出數(shù)據(jù):

●?publicabstractvoidwrite(intb)throwsIOException;

●?publicvoidwrite(byteb[])throwsIOException;

●?publicvoidwrite(byteb[],intoffset,intlength)throwsIOException。這三個(gè)重載形式都是用來(lái)向輸出流寫數(shù)據(jù)的。參數(shù)b為要輸出的數(shù)據(jù),第三種形式中offset、length參數(shù)的作用與輸入流類的read方法類似。

其他方法主要有:

●?publicvoidflush();——清除緩沖區(qū),將緩沖區(qū)內(nèi)尚未寫出的數(shù)據(jù)全部輸出。若要繼承OutputStream類,這個(gè)方法必須重寫,因?yàn)镺utputStream中的方法未做任何實(shí)質(zhì)性工作;

●?publicvoidclose();——關(guān)閉輸出流,釋放資源。7.2.3PrintStream類

為了在標(biāo)準(zhǔn)輸出流上提供更靈活方便的輸出,Java語(yǔ)言定義了輸出類PrintStream,標(biāo)準(zhǔn)輸出流對(duì)象System.out就是PrintStream類的實(shí)例。

PrintStream類可以使用OutputStream類中定義的方法:

●?publicvoidwrite(intb);

●?publicvoidwrite(byteb[],intoffset,intlength);

●?publicvoidflush();

●?publicvoidclose()。更重要的是,PrintStream類提供了print和println方法,用于輸出各種類型的數(shù)據(jù)(如int、double類型),并將各種不同類型的數(shù)據(jù)轉(zhuǎn)換為字符串輸出。

print方法的主要形式有:

●?publicvoidprint(Objectobj);

●?publicvoidprint(Strings);

●?publicvoidprint(chars[]);

●?publicvoidprint(charc);

●?publicvoidprint(inti);

●?publicvoidprint(longl);

●?publicvoidprint(floatf);●?publicvoidprint(doubled);

●?publicvoidprint(booleanb)。

println方法與print方法形式相同,在輸出時(shí)除輸出數(shù)據(jù)外還輸出一個(gè)換行符。println還有一個(gè)不帶參數(shù)的形式:

publicvoidprintln()

該方法用于輸出一個(gè)換行符。7.2.4其他常用流類

1.DataInputStream類與DataOutputStream類

InputStream類、OutputStream類定義了流類的基本特性,但是它提供的讀/寫數(shù)據(jù)的方法比較簡(jiǎn)單,只提供了一次讀/寫若干字節(jié)的功能,在實(shí)際使用時(shí)很不方便。

為了解決這個(gè)問(wèn)題,Java輸入/輸出包中提供了數(shù)據(jù)輸入流類(DataInputStream)與數(shù)據(jù)輸出流類(DataOutput

Stream),對(duì)InputStream和OutputStream類進(jìn)行包裝,以InputStream和OutputStream類一次讀/寫若干字節(jié)的功能為基礎(chǔ)提供了讀/寫各種類型數(shù)據(jù)的功能。數(shù)據(jù)輸入流類DataInputStream類構(gòu)造方法的形式為

publicDataInputStream(InputStream

in)

其中,參數(shù)in為本來(lái)的輸入流對(duì)象。例如,下面的語(yǔ)句創(chuàng)建一個(gè)數(shù)據(jù)輸入流類對(duì)象從標(biāo)準(zhǔn)輸入流讀取數(shù)據(jù):

DataInputStreamkeyInput=newDataInputStream

(System.in);

DataInputStream類提供了讀取各種類型數(shù)據(jù)的方法,例如:

●?publicfinalintread(byte[]

b)throwsIOException;

●?publicfinalintread(byte[]

b,int

off,int

len)throwsIOException;●?publicfinalbooleanreadBoolean()throwsIOException;

●?publicfinalbytereadByte()throwsIOException;

●?publicfinalintreadUnsignedByte()throwsIOException;

●?publicfinalshortreadShort()throwsIOException;

●?publicfinalintreadUnsignedShort()throwsIOException;

●?publicfinalcharreadChar()throwsIOException;

●?publicfinalintreadInt()throwsIOException;

●?publicfinallongreadLong()throwsIOException;

●?publicfinalfloatreadFloat()throwsIOException;

●?publicfinaldoublereadDouble()throwsIOException。

DataInputStream類是FilterInputStream類的子類,從FilterInputStream類中繼承了skip、available、close、mark、read等方法,功能與InputStream類中同名方法類似,這里不再詳細(xì)介紹。

DataOutputStream類用于數(shù)據(jù)的輸出,其構(gòu)造方法形式為

publicDataOutputStream(OutputStream

out)

其中,參數(shù)out為本來(lái)的輸出流對(duì)象。

DataOutputStream類定義了很多方法,用于輸出各種類型的數(shù)據(jù),例如:

●?publicfinalvoidwriteBoolean(boolean

v)throwsIOException;

●?publicfinalvoidwriteByte(int

v)throwsIOException;

●?publicfinalvoidwriteShort(int

v)throwsIOException;

●?publicfinalvoidwriteChar(int

v)throwsIOException;

●?publicfinalvoidwriteInt(int

v)throwsIOException;

●?publicfinalvoidwriteLong(long

v)throwsIOException;

●?publicfinalvoidwriteFloat(float

v)throwsIOException;

●?publicfinalvoidwriteDouble(double

v)throwsIOException;

●?publicfinalvoidwriteBytes(String

s)throwsIOException;●?publicfinalvoidwriteChars(String

s)throwsIOException。

DtaOutputStream類是FilterOutputStream類的子類,從該類繼承了close和write方法,write方法的功能及形式同OutputStream類的同名方法,close方法用于關(guān)閉輸出流。

2.InputStreamReader類與OutputStreamWriter類

InputStream類與OutputStream類是字節(jié)流,而Java語(yǔ)言本身采用的是Unicode字符集,使用InputStream類與OutputStream類讀/寫雙字節(jié)的中文信息有時(shí)會(huì)出現(xiàn)問(wèn)題,不能正確處理。

Java語(yǔ)言輸入/輸出包從JDK1.1版開(kāi)始提供了Reader類、Writer類讀/寫字符流,但是JDK1.1版以前的輸入/輸出功能都是通過(guò)字節(jié)流來(lái)實(shí)現(xiàn)的。為了能夠處理這部分類型的流對(duì)象,JDK1.1版提供了InputStreamReader類與OutputStream

Writer類,它們分別是Reader、Writer類的子類,提供從字節(jié)流到字符流的轉(zhuǎn)換。

InputStreamReader類的構(gòu)造方法有四種形式:

●?publicInputStreamReader(InputStream

in);

●publicInputStreamReader(InputStream

in,String

charsetName)throwsUnsupportedEncodingException;●?publicInputStreamReader(InputStream

in,Charset

cs);

●?publicInputStreamReader(InputStream

in,CharsetDecoder

dec)。

參數(shù)in為原來(lái)的字節(jié)流對(duì)象,charsetName、cs及dec均用于指定字符編碼集。

InputStreamReader類提供了以下與InputStream類相似的方法,用于讀取數(shù)據(jù),不過(guò)它是以字符為單位的:

●?publicintread()throwsIOException;

●?publicintread(char[]

cbuf,int

offset,int

length)throwsIOException。

InputStreamReader類的其他常用的方法還有:

●?publicbooleanready()throwsIOException——判斷輸入流是否已準(zhǔn)備好,即是否可以讀取數(shù)據(jù);

●?publicvoidclose()throwsIOException——關(guān)閉輸入流。

OutputStreamWrite類的構(gòu)造方法有四種形式:

●?publicOutputStreamWriter(OutputStream

out);

●?publicOutputStreamWriter(OutputStream

out,Charset

cs);

●?publicOutputStreamWriter(OutputStream

out,CharsetEncoder

enc);●publicOutputStreamWriter(OutputStream

out,String

charsetName)throwsUnsupportedEncodingException。

參數(shù)out為原來(lái)的字節(jié)輸出流,cs、enc、charsetName用于指定字符編碼集。

對(duì)于中文信息的輸入/輸出,可采用相應(yīng)的漢字編碼集,例如:

InputStreamReaderin=newInputStreamReader(System.in,“GB2312”);

OutputStreamWriterout=newOutputStreamWriter

(System.out,“GB2312”);

OutputStreamWriter類常用的方法主要有下面幾個(gè):●?publicvoidwrite(int

c)throwsIOException;

●?publicvoidwrite(char[]

cbuf,int

off,int

len)throwsIOException;

●?publicvoidwrite(String

str,int

off,int

len)throwsIOException。

以上三種方法用于向輸出流輸出數(shù)據(jù),功能與OutputStream類的同名方法類似,不過(guò)是以字符為單位的。

●?publiclongskip(long

n)throwsIOException——從輸入流跳過(guò)幾個(gè)字符。返回值為實(shí)際跳過(guò)的字符數(shù);

●?publicvoidflush()throwsIOException——刷新輸出流;

●?publicvoidclose()throwsIOException——關(guān)閉輸出流。

3.BufferedReader類與BufferedWriter類

BufferedReader類與BufferedWriter類分別是Reader類和Writer類的子類,為Reader類對(duì)象和Writer類對(duì)象提供輸入和輸出緩沖區(qū)以提高輸入/輸出的效率。

BufferedReader類的構(gòu)造方法形式為:

●?publicBufferedReader(Reader

in);

●?publicBufferedReader(Reader

in,int

sz)。

參數(shù)in為字符輸入流對(duì)象,參數(shù)sz用于指定緩沖區(qū)大小。

除了從Reader類繼承的方法外,BufferedReader類還提供了讀取一行字符的方法:

publicStringreadLine()throwsIOException

BufferedWriter類的構(gòu)造形式為:

●?publicBufferedWriter(Writer

out);

●?publicBufferedWriter(Writer

out,int

sz)。

參數(shù)out為字符輸出流對(duì)象,sz指定緩沖區(qū)的大小。

除了從Writer類繼承的方法外,BufferedWriter類還提供了在輸出流中插入換行符的方法:

publicvoidnewLine()throwsIOException

在第8章的例子中讀者將可以看到這里介紹的幾個(gè)流類的例子。

7.3文件的輸入/輸出

7.3.1FileInputStream類

磁盤文件的輸入/輸出操作是Java語(yǔ)言中流類最基本的應(yīng)用,磁盤文件的輸入操作由FileInputStream類實(shí)現(xiàn)。

FileInputStream是文件輸入流類,最常用的構(gòu)造方法只需提供文件名即可,形式如下:

publicFileInputStream(StringfileName)throwsFileNot

FoundException

FileInputStream類是InputStream類的派生類,它覆蓋了InputStream類中的read、skip、available、close等方法。程序7.1演示了磁盤文件的讀取方法,運(yùn)行該程序?qū)@示FileInput.java文件的內(nèi)容。【程序7.1】顯示文本文件。

importjava.io.*;

publicclassFileInput

{

publicstaticvoidmain(String[]args)

{

bytebuffer[]=newbyte[2048];

try{

FileInputStreamfileIn=newFileInputStream("FileInput.java"); //創(chuàng)建FileInputStream類對(duì)象,打開(kāi)文件

intbytes=fileIn.read(buffer,0,2048); //文件內(nèi)容讀入到buffer

Stringstr=newString(buffer,0,bytes); //利用buffer內(nèi)容創(chuàng)建字符串

System.out.print(str); //輸出字符串內(nèi)容

}

catch(Exceptione){ System.out.println(e.toString());

}

}

}

7.3.2FileOutputStream類

FileOutputStream類提供了寫文件的功能,它從Output

Stream派生而來(lái)。

FileOutputStream類最常用的構(gòu)造方法與FileInputStream類似,只需提供文件名作參數(shù),形式如下:

publicFileOutputStream(StringfileName)throwsFileNot

FoundException

FileOutputStream類覆蓋了OutputStream類中的write、close、flush等方法。程序7.2演示了創(chuàng)建磁盤文件的方法,完成了磁盤文件的復(fù)制。

【程序7.2】復(fù)制文件。

importjava.io.*;

publicclassFileCopy

{

publicstaticvoidmain(String[]args)

{

if(args.length!=2){

System.out.println("命令行參數(shù)不正確"); }

try{

FileInputStreaminFile=newFileInputStream(args[0]); //打開(kāi)源文件

FileOutputStreamoutFile=newFileOutputStream(args[1]);//打開(kāi)目標(biāo)文件

while(inFile.available()>0){

intc=inFile.read(); //從源文件讀一字節(jié)

outFile.write(c); //寫入到目標(biāo)文件

} inFile.close(); //關(guān)閉源文件

outFile.close(); //關(guān)閉目標(biāo)文件

System.out.println("文件復(fù)制成功");

}

catch(Exceptione){

System.out.println("文件復(fù)制失敗");

}

}

}程序7.2從命令行獲得源文件和目標(biāo)文件名(保存在main方法的args參數(shù)中)。首先判斷參數(shù)的個(gè)數(shù),如果參數(shù)個(gè)數(shù)不為2,則顯示出錯(cuò)信息后退出;如果參數(shù)個(gè)數(shù)正確,則

打開(kāi)第一個(gè)參數(shù)(args[0])指定的文件,將其內(nèi)容復(fù)制到第二個(gè)參數(shù)指定的文件。如果第二個(gè)參數(shù)指定的文件不存在,則創(chuàng)建一個(gè)新文件;如果該文件存在,則原來(lái)的內(nèi)容被覆蓋。

如果使用JDK調(diào)試程序7.2,運(yùn)行該程序時(shí)可在命令行輸入:

javaFileCopyFileCopy.javaFileCopy.bak其中,斜體字部分為傳遞給程序的命令行參數(shù),上面的命令行表示將FileCopy.java復(fù)制到FileCopy.bak。

如果在JBuilder集成環(huán)境下調(diào)試該程序,可在設(shè)置運(yùn)行配置的對(duì)話框中輸入命令行參數(shù),如圖7.2所示。圖7.2在JBuilder集成環(huán)境下設(shè)置調(diào)試命令行7.3.3RandomAccessFile類

FileInputStream與FileOutputStream類對(duì)磁盤文件的操作僅限于順序讀或順序?qū)?,但很多時(shí)候希望訪問(wèn)文件中的某一塊數(shù)據(jù),或者按照某種邏輯順序而不是數(shù)據(jù)在文件中存儲(chǔ)的物理順序訪問(wèn)文件,java.io包提供了RandomAccessFile類來(lái)實(shí)現(xiàn)磁盤文件的隨機(jī)訪問(wèn)。

RandomAccessFile類不是InputStream或者OutputStream類的子類,但它定義了與InputStream和OutputStream類相似的read、write等方法,使用方法與FileInputStream、File

OutputStream類似。

RandomAccessFile類構(gòu)造方法常用形式如下:

publicRandomAccessFile(StringFilename,Stringmode)throwsIOException

mode參數(shù)為文件讀/寫方式,用“r”表示只讀,“rw”表示可讀/寫,與C語(yǔ)言文件打開(kāi)的參數(shù)的含義類似。

與FileInputStream、FileOutputStream相比,Random

AccessFile的使用更靈活、更方便,定義了很多方法用于讀/寫各種類型的數(shù)據(jù),例如:

●?publicfinalbooleanreadBoolean()throwsIOException;

●?publicfinalbytereadByte()throwsIOException;●?publicfinalcharreadChar()throwsIOException;

●?publicfinalshortreadShort()throwsIOException;

●?publicfinalintreadInt()throwsIOException;

●?publicfinaldoublereadDouble()throwsIOException;

●?publicfinalfloatreadFloat()throwsIOException;

●?publicfinalvoidwriteBoolean(booleanv)throwsIOException;

●?publicfinalvoidwriteByte(bytev)throwsIOException;

●?publicfinalvoidwriteChar(charv)throwsIOException;

●?publicfinalvoidwriteShort(shortv)throwsIOException;

●?publicfinalvoidwriteInt(intv)throwsIOException;●?publicfinalvoidwriteDouble(doublev)throwsIOException;

●?publicfinalvoidwriteFloat(floatv)throwsIOException。

其他主要方法成員還有:

●?publicvoidseek(longpos);——將文件當(dāng)前讀/寫位置移動(dòng)到一個(gè)絕對(duì)地址,該地址是相對(duì)于文件頭的偏移量。地址0表示文件的開(kāi)頭。

●?longgetFilePointer();——返回文件當(dāng)前讀/寫位置。

●?longlength();——返回文件的長(zhǎng)度。

●?publicfinalStringreadLine();——從文件讀取一行文本。程序7.3是一個(gè)使用RandomAccessFile類的簡(jiǎn)單例子,該程序以讀/寫方式打開(kāi)一個(gè)已存在的文件,在文件的尾部添加一個(gè)字符串。

【程序7.3】RandomAccessFile類的使用。

importjava.io.IOException;

importjava.io.RandomAccessFile;

publicclassFileTest{

publicstaticvoidmain(Stringargs[])

{

RandomAccessFilemyRAFile;

Strings="InformationtoAppend\nHello!\n";

try{

myRAFile=newRandomAccessFile(“file1.txt”,“rw”); //打開(kāi)文件

myRAFile.seek(myRAFile.length()); //移動(dòng)到文件尾

myRAFile.writeBytes(s); //添加數(shù)據(jù)

myRAFile.close();

}catch(IOExceptione){

System.out.print(e.getMessage());

}

}

}7.3.4File類

File類并不是流類,但在處理磁盤文件時(shí)經(jīng)常會(huì)用到,它可以完成文件的刪除、創(chuàng)建等操作。

File類有兩個(gè)經(jīng)常會(huì)用到的與平臺(tái)相關(guān)的屬性。一個(gè)是seperatorChar,它是系統(tǒng)的名字分隔符,在UNIX平臺(tái)上為“/”,在Windows平臺(tái)上為“\”。另一個(gè)是路徑分隔字符,在UNIX平臺(tái)上為“:”,而在Windows平臺(tái)上為“;”,如在Windows95中使用path命令設(shè)置路徑時(shí),多個(gè)文件夾名之間采用“;”分隔。

File類的構(gòu)造方法有三種形式,分別根據(jù)文件名、文件路徑與文件名、文件對(duì)象(目錄)與文件名創(chuàng)建對(duì)象:

●?publicFile(Stringpath);

●?publicFile(Stringpath,Stringname);

●?publicFile(Filedir,Stringname)。

習(xí)慣使用Windows平臺(tái)的讀者應(yīng)注意,F(xiàn)ile類所指的文件包含文件和文件夾(子目錄),可以使用File類的方法創(chuàng)建、刪除和更名子目錄。

File類常用的方法成員還有:

●?publicbooleancanWrite();——測(cè)試文件和目錄是否可寫;

●?publicbooleancanRead();——測(cè)試文件和目錄是否可讀;

●?publicbooleanexists();——測(cè)試文件和目錄是否存在;

●?publicbooleandelete();——?jiǎng)h除文件或目錄,若刪除目錄,要求該目錄必須為空;

●?publicbooleancreateNewFile();——當(dāng)且僅當(dāng)該文件不存在時(shí),創(chuàng)建一個(gè)空文件;●?publicbooleanisDirectory();——判斷File對(duì)象是否為目錄;

●?publicbooleanisFile();——判斷File對(duì)象是否為文件;

●?publicbooleanisHidden();——測(cè)試文件或目錄是否隱含;

●?publiclonglastModified();——獲取文件或目錄的最后修改時(shí)間;

●?publicbooleansetLastModified(longtime);——設(shè)置文件或目錄的最后修改時(shí)間;●?publicString[]list();——得到當(dāng)前目錄下的所有文件名和目錄名,若該File對(duì)象不是表示目錄,則返回null;

●?publicbooleanmkdir();——?jiǎng)?chuàng)建一個(gè)目錄;

●?publicbooleanmkdirs();——?jiǎng)?chuàng)建一個(gè)目錄樹(shù),包括原來(lái)不存在的父目錄;

●?publicbooleanrenameTo(Filedest);——重命名文件或目錄,成功返回true;

●?publicbooleansetReadOnly();——將文件或目錄設(shè)置為只讀。

程序7.4使用File類列出當(dāng)前目錄下的所有文件和子目錄名。【程序7.4】當(dāng)前目錄文件列表。

importjava.io.File;

publicclassDirList{

publicstaticvoidmain(String[]args){

Filepath=newFile(".");

String[]list=path.list();

for(inti=0;i<list.length;i++)

System.out.println(list[i]);

}

}【程序7.5】File類的文件管理功能演示。

importjava.io.*;

publicclassdemofile

{

privatefinalstaticStringusage=

"Usage:demofilepath1...\n"+

"Createeachpath\n"+

"Usage:demofile-dpath1...\n"+

"Deleteseachpath\n"+

"Usage:demofile-rpath1path2\n"+

"renamesfrompath1topath2\n"; privatestaticvoidusage()

{

System.err.println(usage);

System.exit(1);

}

privatestaticvoidfileData(Filef)

{

try{

System.out.println("Absolutepath:"+f.getAbsolutePath()+ “\r\nCanread:”+f.canRead()+

“\r\nCanwrite:”+f.canWrite()+

“\r\ngetName:”+f.getName()+

“\r\ngetParent:”+f.getParent()+

"\r\ngetPath:"+f.getPath()+

"\r\ngetCanonicalPath:"+f.getCanonicalPath()+

"\r\ntostring:"+f.toString()); if(f.isFile())

System.out.println("itisafile");

elseif(f.isDirectory())

System.out.println("itisadirectory");

}catch(Exceptione){

Stringerr=e.toString();

System.out.println(err);

}

}

publicstaticvoidmain(String[]args) {

if(args.length<1)

usage();

if(args[0].equals("-r")){

if(args.length!=3)usage();

Fileold=newFile(args[1]);

Filername=newFile(args[2]);

old.renameTo(rname);

fileData(old);

fileData(rname);

return; }

intcount=0;

booleandel=false;

if(args[0].equals("-d")){

count++;

del=true;

}

for(;count<args.length;count++){

Filef=newFile(args[count]);

if(f.exists()){

System.out.println(f+"Exists"); if(del){

System.out.println("deleting..."+f);

f.delete();

}

}

else{

if(!del){

f.mkdirs();

System.out.println("created"+f); }

}

fileData(f);

}

}

}

程序7.5使用File類實(shí)現(xiàn)了目錄的創(chuàng)建、刪除和重命名,該程序從命令行獲取參數(shù),然后執(zhí)行相應(yīng)的操作。例如,輸入命令:

javademofilenewdir1newdir2斜體部分為傳遞給命令行的參數(shù),即在當(dāng)前目錄下創(chuàng)建newdir1和newdir2子目錄。

輸入命令:

javademofile–dnewdir1

將刪除newdir1子目錄。

輸入命令:

javademofile–rnewdir2newdir3

將子目錄newdir2命名為newdir3。

7.4編程實(shí)例

最后再來(lái)看一個(gè)例子,該程序?qū)⑽募ext.src的內(nèi)容連接到text.des文件原有內(nèi)容的后面,然后顯示文件text.des的有關(guān)信息,最后顯示文件的內(nèi)容。

【程序7.6】文件的連接。

importjava.io.*;

publicclassfileUnion{

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論