Java數(shù)據(jù)流教學(xué)課件_第1頁(yè)
Java數(shù)據(jù)流教學(xué)課件_第2頁(yè)
Java數(shù)據(jù)流教學(xué)課件_第3頁(yè)
Java數(shù)據(jù)流教學(xué)課件_第4頁(yè)
Java數(shù)據(jù)流教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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)介

第11章Java數(shù)據(jù)流

[內(nèi)容提要]

大部分程序都需要數(shù)據(jù)的輸入和輸出,

從鍵盤讀取數(shù)據(jù),

向文件寫入數(shù)據(jù)或從文件獲取數(shù)據(jù),

將數(shù)據(jù)通過(guò)打印機(jī)打印出來(lái),

通過(guò)網(wǎng)絡(luò)進(jìn)行信息交換

本章介紹Java標(biāo)準(zhǔn)程序庫(kù)中各種處理I/O操作的類

的用途及使用方法。

第1節(jié)輸入/輸出概念

一、流的概述

Java使用流(stream)來(lái)執(zhí)行輸入輸出(I/O)

的功能)流是一種數(shù)據(jù)的源頭和目的之

間的通信途徑。

用于讀入數(shù)據(jù)稱為輸入流(inputstream),

用于寫出數(shù)據(jù)稱為輸出流(outputstream)o

當(dāng)像用流時(shí)需要使用java.io包,因此在涉及數(shù)

據(jù)流操作的程序中都要先導(dǎo)入java.io包:

importjava.io.*;

二、I/O類層次結(jié)構(gòu)

Java提供超過(guò)60個(gè)不同的流類型,這些流

類包含在上面提到的java.io包中,

四個(gè)基本的抽象類:

Inputstream、Outputstream、Reader和

Writero

你不能創(chuàng)建這四個(gè)類型的對(duì)象,但是其他

的方法的返回值可以是他們

InputStrearn

File

Outputstream

RandomAccessFile

Reader

StreaniTokemzer

Writer

圖11-1定義在java,io包中的流結(jié)構(gòu)

三、標(biāo)準(zhǔn)輸入輸出

在System類中有三個(gè)靜態(tài)域System,in、

System,out和System,err。

可以在標(biāo)準(zhǔn)位置使用這三個(gè)系統(tǒng)流進(jìn)行I/O操作O

publicstaticInputstreamin

讀取字符數(shù)據(jù)的標(biāo)準(zhǔn)輸入流。

publicstaticPrintstreamout

顯示或打印輸出信息的標(biāo)準(zhǔn)輸出流

publicstaticPrintstreamerr

輸出錯(cuò)誤信息的標(biāo)準(zhǔn)錯(cuò)誤流。

importjava.io.“一八,入,入]、、,一

publicclasslODemo{例11-1:標(biāo)準(zhǔn)輸入輸出舉例

publicstaticvoidmain(Stringargs[])throwsIOException{

intb;

intcount=0;

//循環(huán)利用Sys比m.in錢收.輸入存入b,在用Systern.out.輸出b

〃如果遇到文件結(jié)束則終止循環(huán)

while((b=System.in.read())!=-1){

count4-F;

System.out.print((char)b);

}

Sysrem.out.println();

System,out.printin(rrprogramendrr);

!)

程序運(yùn)行如下:

輸入:a,b,c,d輸出:a,b,c,d

輸入:AZ(注:輸入復(fù)合鍵CTRL-Z)輸出:programend

第2節(jié)文件的順序訪問(wèn)

一、字節(jié)流

字節(jié)流是用來(lái)讀寫8位的數(shù)據(jù),由于不會(huì)對(duì)數(shù)據(jù)

作任何轉(zhuǎn)換,因此可以用來(lái)處理二進(jìn)制的數(shù)據(jù)。

(一)、Outputstream

(二)、Inputstream

(三)、FilelnputStream和FileOutputStream

(四)、ByteArraylnputStream^ByteArrayOutputStream

(五)、BufferedlnputStream^BufferedOutputStream

Inputstream輸入流輸出流的類繼承關(guān)系

FilelnputStream

Outputstream

StringBufiferlnputStream

ByteArraylnputStreamFileOutputStream

SequencelnputStreamByteArrayOutputStream

PipedlnputStreamPipedOutputStream

FilterlnputStreamFilterOutputStream

BufferedlnputStreamBuflferedOutputStream

LineNumberlnputStreamPrintstream

DatalnputStreamDataOutputStream

PushbacklnputStream

(—0、Outputstream

Outputstream為所有的字節(jié)流輸出流的父類,因

尼所有源自于它的類也會(huì)繼承下列的方法:

voidwrite(intb):寫入一個(gè)字節(jié)的數(shù)據(jù)。

voidwrite(byte[]buttfer):講數(shù)組buffer的數(shù)據(jù)寫

入流。

voidwrite(byte[]9intoffsetintlen):從buffer[offset]

開始,寫入len個(gè)字節(jié)的數(shù)據(jù)。

voidflush():強(qiáng)制將buffer內(nèi)的數(shù)據(jù)寫入流。

voidclose():關(guān)閉流。

(二)、Inputstream

InputStream為所有的字節(jié)輸入流的父類,因此

所宥癰于它的類也會(huì)繼承下列的方法:

intread。:讀入一個(gè)字節(jié)的數(shù)據(jù),如果已達(dá)到文

件的末端,返回值為-L

intread(byte[]buffer):讀出buffer大小的數(shù)據(jù),

返回值為實(shí)際所讀由的字節(jié)。

intread(byte[]bufferJntoffsetjntlen):臀讀出的

數(shù)據(jù)從buffer[offset]開始,寫入len個(gè)字節(jié)至

bufferf,返回值為實(shí)際所讀出的字節(jié)數(shù)目。

intavailable():返回流內(nèi)可供讀取的字節(jié)數(shù)目。

longskip(longn):跳過(guò)n個(gè)字節(jié)的數(shù)據(jù),返回值

為實(shí)像所述過(guò)的數(shù)據(jù)數(shù)。

voidclose():關(guān)閉流。

(三)、FilelnputStream^FileOutputStream

FilelnputStream用來(lái)讀取一個(gè)文件,FileOutPutStream用

來(lái)修數(shù)據(jù)寫入文件。

常用的構(gòu)造函數(shù)如下:

FileInputStream(Stringname):打開文件name用來(lái)讀取

數(shù)據(jù)。

FileInputStream(Filefile):打開文件行l(wèi)e用來(lái)讀取數(shù)據(jù)。

FileOutputStream(Stringname):打開文件name用來(lái)寫入

數(shù)據(jù)。

FileOutputStream(Filefile):打開文件行l(wèi)e用來(lái)寫入數(shù)據(jù)。

FileOutputStream(Stringname,Booleanappend):孑丁開文

件name用來(lái)寫入數(shù)據(jù),若append為true,貝I寫入的數(shù)據(jù)

會(huì)加到原有文件后面,否則,覆蓋原有的文件。

將FileExam.java復(fù)制為FileExam.java.bako

1)程序首先打開FileExam.java文件,

2)使用read。將其內(nèi)容逐字節(jié)讀取出來(lái)(如果

返回值為則表明已到達(dá)文件尾端),

3)再使用write。將讀出的字節(jié)逐一寫入另一個(gè)

文件FileExam.java.bak中。

4)若文件無(wú)法打開(例如FileExam.java不存在)

或無(wú)法生成(FileExam.java.bak),會(huì)拋出

FileNotFoundException異常,若讀寫出錯(cuò),

則會(huì)拋出lOException異常。

5)最后,我們?cè)趂inally中關(guān)閉文件。

importjava..io.*;

publicclassFllelO(例例

pijJblicstaticvoidm.a.in(StringargsC]){?2

FilelnpiAtLSt-reaiiLinFile=null;

FileOu.tputLStreanaou.tFile=null;FilelO.java

try£//打開"FilaExaia.3ava"由次讀取數(shù)據(jù)

inFile=neuFilelnpucStreaia(,TFileExaixi.iaT?a,r);

//4T5FFrrFileExam.java.bakrr用本與_A數(shù)據(jù).

ou.t.F±le=newFileOxitpucStizeaiii(,rFi±i=!E:":;iiu.java.ba.kr,);

inndate;

while((date=inFile.read())?=一[){//從原文件1立取字干

//■次向目標(biāo)文件耳人一個(gè)字干

o\itFile.write(date);

1)

cat.cli(FlieNotFoiAiiclExcepcione)(//處理立件不存在詰;況

System.out;,printIn(e.gemessage());

}

cacch(IOExceptione){//處理工。號(hào)常

Syscem.out.println(e.getMessage());

)

fInal1丫{//亳后的清理工作

//關(guān)閉、源文件

if(inFile?=nnll)<

3丫{inFile.close();}

catcH(IOExceptione){}

)

if(ont.File!=nu[[){//關(guān)閉目*示文件

trY(o\j.tFile.closeQ;}

catLCti(IOExcep11one)()

>}))

(J)、ByteArraylnputStream^

ByteArrayOutputStream

1)使用這兩個(gè)流類可以將數(shù)據(jù)轉(zhuǎn)換到一個(gè)數(shù)據(jù)類型為字

節(jié)類型的數(shù)組(bytearray)中,

2)ByteArraylnputStream^ByteArrayOutputStream^f-

沒(méi)有牽涉到真正的文件,他們使用內(nèi)存(一個(gè)流緩沖

區(qū))作為I/O流的源頭及目的。

3)ByteArrayInputstream用來(lái)從一個(gè)流緩沖區(qū)(字節(jié)數(shù)

組)中讀入數(shù)據(jù),

4)ByteArrayOutputStream用來(lái)將數(shù)據(jù)轉(zhuǎn)換至一個(gè)流緩

沖區(qū)中

5)由于流對(duì)象的內(nèi)容存放在內(nèi)存中,所以可提供較快的

操作。

常用的構(gòu)造函數(shù)如下:

ByteArrayInputStream(byte[]buffer):生成一個(gè)手節(jié)數(shù)組的

輸入流,并指定一個(gè)字節(jié)數(shù)組buffer為此輸入流的流緩沖區(qū)。

ByteArrayOutputStream():生成一個(gè)字節(jié)數(shù)組的輸出流,其

緩沖區(qū)的默認(rèn)初始大小為32字節(jié),若有需要,緩沖區(qū)的大小

會(huì)隨之增加。

ByteArrayOutputStream(intsize):同上,但分配size字節(jié)的初

始大小給此緩沖區(qū)。

ByteArrayOutputStream的一些常用方法:

intsize():返回此流緩沖區(qū)的大小。

byte[]toByteArray():生成一個(gè)新的字節(jié)數(shù)組,并將流的內(nèi)

容復(fù)制到此字節(jié)數(shù)組。

StringtoString():I導(dǎo)流的內(nèi)容轉(zhuǎn)換為String對(duì)象。

下面程序讀入文件data.in,將其內(nèi)容寫入內(nèi)存中(一個(gè)字節(jié)數(shù)

組),接著轉(zhuǎn)換為String對(duì)象,并將1該String對(duì)象內(nèi)的令牌

解析出來(lái)。

importjava.io.*;

importjava.util.*;

publicclassByteI0(例11?3BytelO.java

publicstaticvoidmain(String[]args){

FileinFile=newFile("data,in");//田明源文件

FileinputscrearninData=newFilelnputStreamfinFile);

ByteArrayOutputStreamdataArray=newByteArrayOutputStreaii();

intdata;

while((data=inData.read())!=-1){

dataArray.vrite(data);

)

inData.close();

StringdataStr=dalaArray.coString。;〃將字節(jié)數(shù).組轉(zhuǎn)換成字符串

〃解析String對(duì)象內(nèi)的令牌

StringTokenizertokens=newStrmgTokeiuzer(dataStr);

while(tokens.hasMoreTokens()){

Systeia.out.printin(tokens,nextToken());

}}

catch(IOExcep11one){

Systeiu.out.printin(e.getMessage());

}))

若輸入數(shù)據(jù)(data.in中的數(shù)據(jù))如下:

Aa00001926995

Bb00002779296

則程序輸出如下:

Aa

00001

92

69

95

Bb

00002

77

92

96

(五)、BufferedlnputStream^

BufferedOutputStream

有時(shí)候我們?cè)谔幚韥?lái)自輸入流的數(shù)據(jù)時(shí),希望能夠

重設(shè)流并回到較靠前的位置。

這需要使用緩沖來(lái)實(shí)現(xiàn),通過(guò)使用

BufferedlnputStream^:,可以利用mark和reset方

法在緩沖的輸入流中往回移動(dòng);

同時(shí),通過(guò)使用BufferedOutputStream類,可以先

將輸出寫到內(nèi)存緩沖區(qū),再使用flush方法將數(shù)據(jù)

寫入磁盤,而不必每輸出-一個(gè)字節(jié)就向磁盤中寫

一次數(shù)據(jù)。

1.BufferedlnputStream^:的構(gòu)造函數(shù)和方法

?BufferedInputStream(InputStreamin):構(gòu)造一個(gè)

BufferedlnputStream。

?BufferedInputStream(InputStreamin,intsize):構(gòu)造一個(gè)

具有給定的緩沖區(qū)大力、BufferedlnputStreamo

?intavailable():得到可以從這個(gè)輸入流讀取的字節(jié)數(shù)。

?voidclose():關(guān)閉流。

?voidmark(intreadlimit):在這個(gè)輸入流的當(dāng)前位置做標(biāo)記。

?booleanmarkSupported():檢查這個(gè)輸入流是否支持mark

和reset方法。

?intread():讀取數(shù)據(jù)的下一個(gè)字節(jié)。

?intread(byte[]b,intoff,intlen):從這個(gè)字節(jié)輸入流的給

定偏移量處開始讀取字節(jié),存儲(chǔ)到給定的字節(jié)數(shù)組。

?voidreset():將緩沖區(qū)重新設(shè)置到加標(biāo)記的位置。

?longskip(longn):跳過(guò)n個(gè)字節(jié)的數(shù)據(jù)。

2.BufferedOutputStream類的構(gòu)造函數(shù)和方法:

?BufferedOutputStream(OutputStreamout):構(gòu)造一個(gè)

BufferedOutputStream。

?BufferedOutputStream(OutputStreamout,intsize):構(gòu)

造一個(gè)具有給定的緩沖區(qū)大小的

BufferedOutputStream。

?voidflush():刷新這個(gè)流。

?voidwrite(byte[]b,intoff,intlen):將給定的字節(jié)數(shù)組

寫到這個(gè)緩沖輸出流。

?voidwrite(intb):將給定的字節(jié)寫到這個(gè)緩沖輸出流。

下面我們通過(guò)一個(gè)例子來(lái)演示BufferedlnputStream類的

作用,程序讀取并顯示字節(jié)數(shù)組中的字符,當(dāng)遇

至十%,字符時(shí),如果和下一個(gè),%,字符之間的字符

沒(méi)有空格,則兩個(gè),%,之間的字符不顯示:

importjava.io.*;

classbufinstrearns{

publicstaticvoidmain(Sttmaargs[])tiirowslOExcept.ion{

〃定義數(shù)據(jù)誨

bytedata口="Thisisatestofbuffervorreams.與匚口因口它11七二二”?9已七3¥七23();

BYteArraylnputStreamin=newByteArraylnput.Streaik(data);

BufferedlnputStreambufinstream=newBufferedlnput.Stream(in);

intcharacter;booleanflag=false;

while((character=bufinstream.read())?=-1){

switch(character){

caseT':例U?4

if(flag){〃第二個(gè)

flag=false;

}else{//第一個(gè)bufinstreams.java

flag=true;

bufinstream.mark(100);//力口標(biāo))己

break;

case,1:運(yùn)行結(jié)果:

if(flag)(//3

flagI

SystJThisisatestofbuffer#Streams

〃將4

bufirf

)else

Syst.em.out.print((char)character);

break;

default:

if(!flag)System.out..print((char)character);

)1))

二、字符流

盡管字節(jié)流更快更高效,但是人們讀起來(lái)十分困

難(因?yàn)槭嵌M(jìn)制)。

接下來(lái)我們講述文本格式的輸入輸出,即字符流。

字符流主要是用來(lái)支持Unicode的文字內(nèi)容,絕

大多數(shù)在字節(jié)流中所提供的類,都有相對(duì)應(yīng)的

字符流的類。

ReaderWriter

BufferedReaderPrintWriter

BufferedWriter

InputStreamReader

OutputStreamWriter

FileReader

FileWriter

()、Reader和Writer

Reader是所有輸入字符流的基類,Writer

是所有輸出字符流的基類。

你可以使用從這兩個(gè)類派生出的類來(lái)讀寫

字符流,這兩個(gè)類常用的方法與

Inputstream>Outputstream相類似,區(qū)

別在于參數(shù)內(nèi)的byte[]需要改為char

(二)、InputStreamReader和

OutputStreamWriter

為了從鍵盤讀取按鍵,常常從System.iii構(gòu)

造一個(gè)InputStreamReader流)然后使用

InputStreamReader^:的read方法讀取用

戶輸入的內(nèi)容。

而OutputStreamWriter與

InputStreamReader相對(duì))支持輸出流。

1.InputStreamReader^:的構(gòu)造函數(shù)和方法:

?InputStreamReader(InputStreamin):構(gòu)造一個(gè)

InputStreamReader。

?InputStreamReader(InputStreamin,Stringenc):

使用命名的字符編瑪構(gòu)造一個(gè)InputStreamReader。

?voidclose():關(guān)閉流。

?StringgetEncoding():得到字符編碼的名稱。

?intread():讀取一個(gè)字符。

?intread(char[]cbuf,intoff,intlen):將字符讀到

數(shù)組工

?booleanready():如果這個(gè)流已準(zhǔn)備好,返回

True。

2.OutputStreamWriter類的構(gòu)造函數(shù)和方法:

?OutputStreamWriter(OutputStreamout):構(gòu)造一個(gè)

OutputStreamWritero

?OutputStreamyVriter(OutputStreamout,Stringenc):使

用命名的字符編碼構(gòu)造一個(gè)OutputStreamWriter。

?voidclose():關(guān)閉流。

?voidflush():刷新流。

?StringgetEncoding():得到這個(gè)流使用的字符編碼的名稱。

?voidwrite(char[]cbuf,intoff,intlen):寫字符數(shù)組的一部

分。

?voidwrite(intc):寫一個(gè)字符。

?voidwrite(Stringstr,intoff,intlen):寫一個(gè)字符串的一部

分。

下面的程序利用InputStreamReader從鍵盤接受輸入,再將輸

入的字符顯示出來(lái):

inputstreamreader.java

importjava.io.*;

classinputstreamreader{

publicstaticvoidmam(Stringargs[]){例11-5

try1、

intcharacter;

InputstreaioP.eaderinstreaiaread=newInputStLeanF'.eader(System,in);

/Inputs(口reainReader以字符形式序取輸入

while((character=instreamread.read())1=-1){

Ystem.out.print((char)character);

catch(lOExcepnone)()

J

System,out.print(rrBye,r);

獷……八….一?

程序運(yùn)行結(jié)果如下:

輸入:a,bqd輸出:a9b9c9d

輸入:1,2,3,4輸出:1,2,3,4

輸入:AZ輸出:Bye

(三)、FileReader

你可以使用FileReader類創(chuàng)建一個(gè)字符流來(lái)讀取

一個(gè)文件,F(xiàn)ileReader類只具有女

InputStreamReader繼承的功能,但是它有自

己的構(gòu)造函數(shù):

?FileReader(Filefile):構(gòu)造一個(gè)FileReader。

?FileReader(FileDescriptorfd):從一個(gè)文件描

述符構(gòu)造一個(gè)FileReader。

?FileReader(Stringfilename):從一個(gè)文件名構(gòu)

造一個(gè)FileReader。

在下面的例子中,我們打開一個(gè)文件file.txt(內(nèi)容

為:"Hellofromfile”),將文件的內(nèi)容讀到緩沖

區(qū),然后顯示數(shù)據(jù):

fileread.java

importjava.io.*;例11-6

publicclassfileread{

publicstaticvoidmam(Stringargs[])throwsException

FileReaderfileread=newFileReadertxtH);

chardata[]=newchar[1024];

intcharsread=fileread.read(data);

System.out.printin(newString(data,0,charsread));

fileread,close();

)}

程序運(yùn)行結(jié)果如下:

Hellofromfile

(四)、FileWriter

FileWriter與FileReader對(duì)應(yīng),用來(lái)將1字符緩沖區(qū)中的數(shù)

據(jù)寫到文件中。這個(gè)類也只定義了構(gòu)造函數(shù),此外只

具宥灰OutputStreamWriter繼承的功能。

?FileWriter(Filefile):從File對(duì)象構(gòu)造一個(gè)FileWriter。

?FileWriter(FileDescriptorfd):從文件描述符構(gòu)造一

個(gè)FileWriter。

?FileWriter(Stringfilename):從文件名構(gòu)造一個(gè)

FileWritero

?FileWriter(Stringfilename,booleanappend):構(gòu)造一進(jìn)

行附加的FileWriter。

在下面例子中,我們分別采用三種方式:逐字符地寫數(shù)

據(jù)、一次寫入所有數(shù)據(jù)、分批寫數(shù)據(jù),使用FileWriter:

filewrite.java

importjava.io.*;例11-7

publicclassfilewrite{

publicstaticvoidmain(String[]args)throwsExceptionf

,,1

chardata口={'T?zh,,s/'/a'z

11111

?zo*,1f?,1'z*e'z'x'z,1.1);

FileWriterfilewriterl=newFilelJritertxtrr);

〃逐字符地寫數(shù)據(jù)

for(intloop_index=0;loop_index<data.length;loop_index-H-){

fileuriterl.write(data[1oop_index]);

}一

FileWriterfilevriterZ=newFileUnter(rrfile2.;

〃一次寫入所有敏據(jù)

fileuriter2.write(data);

FileUriterfileuriter3=newFileUriter(file3.txt^);

門分批寫人數(shù)據(jù)程序執(zhí)行后:

filevriter3.write(data,5

filewriterl.close();gel.txt和file2.txt的內(nèi)容為:

fileuriter2.close();Thisisastringoftext.

filewriter3.close();

))me3.txt的內(nèi)容為:isastrin

(五)、CharArrayReader^CharArrayWriter

1.CharArrayReader類的構(gòu)造函數(shù)和方法如下:

?CharArrayReader(char[]buf):從給定的字符數(shù)組構(gòu)造一個(gè)

CharArrayReader。

?CharArrayReader(char[]buf,intoffset,intlength):同上。

?voidclose():關(guān)閉流。

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

?booleanmarkSupported():如臬這個(gè)流支持mark操作,那么

返回True。

?intread():讀取一個(gè)字符。

?intread(char[]b,intoff,intlen):4尋字符讀人數(shù)組的一部分。

?booleanready():檢查這個(gè)流是否已經(jīng)準(zhǔn)備好被讀取。

?voidreset():將流重設(shè)到最近的標(biāo)記。

?longskip(longn):跳過(guò)n個(gè)字符。

?CharArrayWriter():構(gòu)造一個(gè)CharArrayWriter。

?CharArrayWriter(intinitialSize):構(gòu)造一個(gè)具有給定初始大小

的CharArrayWritero

?voidclose():關(guān)閉流。

?voidflush():刷新流。

?voidreset():重設(shè)流。

?intsize():得到緩沖區(qū)的當(dāng)前大小。

?char[]toCharArray():得到輸入數(shù)據(jù)的副本。

?StringtoString():4尋輸入數(shù)據(jù)轉(zhuǎn)換為字符串。

?voidwrite(char[]c,intoff,intlen):將字符寫到緩沖區(qū)中。

?voidwrite(intc):羽1一個(gè)字符寫到緩沖區(qū)中。

?voidwrite(Stringstr,intoff,intlen):4尋字符串的一部分寫到緩

沖區(qū)中。

?voidwriteTo(Writerout):4等緩沖區(qū)的內(nèi)容寫到另一個(gè)字符流

中。

chararrayreader.java

importjava.io.*;例

publicclasschararrayreader{11-8

publicstaticvoidmain(Stringargs[])throwslOException{

chardata[]={*T1'h111',1s1'lull's'/'Ja',

1/叫

,、tJI,

CharArrayReaderchararrayreader=newCharArrayReader(data);

intcharacter;

while((character=chararrayreader.read()),=-1){

}}.}System.out.print—((char—)character);

程序運(yùn)行結(jié)果為:

Thisisastringoftext.

第3節(jié)文件的隨機(jī)訪問(wèn)

前面所提及的流都是順序的I/O流,無(wú)法隨

機(jī)的讀寫文件的某個(gè)位置,如果需要對(duì)

文件進(jìn)行隨機(jī)的訪問(wèn),必須使用

RandomAccessFile類)其常用的構(gòu)造函

數(shù)如下:

?RandomAccessFile(Filefile,Stringmode):構(gòu)造一個(gè)隨機(jī)訪

問(wèn)文件流,行能為被訪問(wèn)的文作好象,mode是用來(lái)指定存

取的模式,mode可改為r(讀)、w(寫)或rw(讀寫)。

?RandomAccessFile(Stringname.Stringmode):構(gòu)造一個(gè)隨

機(jī)訪問(wèn)文件流,以彳更訪商由字符串name指定名字的文件,

mode參數(shù)使用同上。

?RandomAccessFile類提供的用來(lái)讀取某種基本數(shù)據(jù)類型的

數(shù)據(jù)或字符串的方法如下:

?booleanreadBoolean()

?bytereadByte()

?charreadChar()

?doublereadDouble()

?floatreadFloat()

?intreadlnt()

?longreadLong()

?shortreadShort()

?StringreadLineQ

?RandomAccessFile類提供的用來(lái)向文件中寫入

某種基本類型的數(shù)據(jù)或字符串的方法如下:

?voidwriteByte(byteb)

?voidwriteBytes(Strings)

?voidwriteChar(charc)

?voidwriteChars(Strings)

?voidwriteDouble(doubled)

?voidwriteFloat(floatf)

?voidwritelnt(inti)

?voidwriteLong(long1)

?voidwriteShort(shorts)

-和目前文件位置有關(guān)的方法:

?voidseek(longpos):將文件指針移到

pos(不可為負(fù))的位置)這是相對(duì)于文

彳牛的初始位置的值(初始值為0)。

?longgetFilePointer():得至U目前文件指

針的位置(相對(duì)于文件初始位置)。

?longlengthQ:得至文件的長(zhǎng)度。

第4節(jié)目錄和文件管理

File類是一個(gè)和流無(wú)關(guān)的類。

File對(duì)象可以用來(lái)生成與文件(及其所在的路徑)

或目錄結(jié)構(gòu)相關(guān)的對(duì)象,

由于不同的系統(tǒng)可能會(huì)有不同的目錄結(jié)構(gòu)表示法,

使用File類可以達(dá)到與系統(tǒng)無(wú)關(guān)的目的(使用抽

象的路徑表示法)。

類java.io.File提供了獲得文件基本信息及操作文

件的一些方法。

File類的構(gòu)造函數(shù):

File(Stringpath):將一個(gè)代表路徑的字符串轉(zhuǎn)換為抽象的

路徑表示法。

File(Stringparent,Stringchild):parent代表目錄,child

代表文件(不可為空)。

File(Fileparent,Stringchild):同上。

例如:

FilemyFile;

myFile=newFile("行l(wèi)e.txt");

myFile=newFile("/","file,txt");

FilemyDir=newFile("/");

myFile=newFile(myDir,wfile.txf?);

使用何種構(gòu)造函數(shù)經(jīng)常由其他被訪問(wèn)的文

件對(duì)象來(lái)決定。

例如,

當(dāng)在應(yīng)用程序中只用到一個(gè)文件時(shí),那么

使用第一種構(gòu)造函數(shù)最為實(shí)用;

但是如果使用了一個(gè)共同目錄下的幾個(gè)文

件,則使用第二種或第三種構(gòu)造函數(shù)會(huì)

更方便。

File類一些常用的方法

?booleanexists():若該文件或目錄存在,返回True。

?booleanisDirectory():若為目錄則返回True。

?File[]listFiles():得前該對(duì)象所代表的目錄下的File對(duì)象數(shù)組。

?String[]list():同上。

?longlength。:得到和該對(duì)象相關(guān)的文件大小,若不存在,返回

Oo

?StringtoString():得到抽象路徑表示法。

?StringgetParent():得到抽象路徑表示法的目錄部分。

?StringgetName():得到抽象路徑表示法的最后一個(gè)部分。

?booleanrenameTo(FilenewName):^當(dāng)前File對(duì)象所代表的路

徑名改為newName所代表的路徑名。若成功,返回true。

?booleanmkdir():生成一個(gè)新的目錄。若成功,返回True。

?booleanmkdirs():生成一個(gè)新的目錄,包含子目錄。若成功,

返回true。

?booleandelete():刪除目前File對(duì)象代表的文件或目錄,目錄需

為空。刪除成功,返回true。

importjava.io.*;

classfile(

publicstaticvoidnain(5tring[]args){

Filefl=newFile(rftile.t>:tff);例11?9

System,out.printin("Tiefileisexist?rr+fl.exists());

5ysteia.out.println(,rTlietilecanwrite?r,+fl.canUrite());

System,out.printin(r,Tliefilecanread?rr+fl.canRead());

System,out.printin(nTliefile1程序運(yùn)行結(jié)果如下:

System,out.printin(n,HiefileiThefileisexist?true

System,out.printin(rrThefile1:Thefilecanwrite?true

rr1

System,out.printin(Thefile:Thefilecanread?true

Systeia.out.printin("Thefile'sThefileisafile?true

})Thefileisadirectory?false

The行Ie'snameis:file.txt

Thefile!sallpathis:C:\Java\file.txt

Thefile'slengthis15

第5節(jié)其他常用的流處理

一、管道流

管道(pipe)提供一種線程之間的通信方法,可用

于IPCQnter-ProcessCommunication進(jìn)程間通

信)或是ITC(Inter?ThreadCommunication線

程間通信),但不能夠在不同主機(jī)間進(jìn)行通信。

一個(gè)輸入管道是用來(lái)接收一個(gè)輸出管道所寫出的

數(shù)據(jù),因此,一個(gè)線程會(huì)負(fù)責(zé)送出

(PipedOutputStream對(duì)象)數(shù)據(jù),而另一個(gè)

線程序要負(fù)責(zé)接收(PipedlnputStream對(duì)象)

這些數(shù)據(jù),PipedlnputStream和

PipedOutputStream對(duì)象總是成對(duì)出現(xiàn)的。并

且由于管道的數(shù)據(jù)流是單向的

(一)、創(chuàng)建一組管道通信可以按照下面步驟進(jìn)

行(使用無(wú)參數(shù)的構(gòu)造函數(shù))

建立輸入流:

PipedlnputStreampipedinputstream=

newPipedIn

溫馨提示

  • 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)論