JAVA數(shù)據(jù)流教學(xué)課件_第1頁
JAVA數(shù)據(jù)流教學(xué)課件_第2頁
JAVA數(shù)據(jù)流教學(xué)課件_第3頁
JAVA數(shù)據(jù)流教學(xué)課件_第4頁
JAVA數(shù)據(jù)流教學(xué)課件_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

_

\itniri

三[Java數(shù)據(jù)流J

■本章主要介紹Java語言如何利用數(shù)據(jù)流的思

想處理字節(jié)和字符的輸入輸出(包括stdin、

stdout和stderr)。本章后面的幾個(gè)小節(jié)還將

介紹一些對(duì)文件和文件中的數(shù)據(jù)進(jìn)行處理

的具體方法。

流的不同層次

■流被組織成不同的層次。最粗略的,數(shù)據(jù)

=LJava開發(fā)環(huán)境數(shù)據(jù)流

■java.io包提供數(shù)據(jù)流

importjava.io.*

<_____________________________________)

■在JDKL1之前,java,io包中的流只有以byte為單

位的流

■對(duì)于以16位的Unicode碼表示的字符流處理很不方便

■JDKL1開始,java,io包中加入了專門用于字符流

處理的類,這是以Reader和Writer為基礎(chǔ)派生的

一系列的類,還有用于對(duì)象的永久化保存狀態(tài)的

機(jī)制,它們通過實(shí)現(xiàn)ObjectInput和ObjectOutput

接口來達(dá)到要求

BL輸入數(shù)據(jù)流

■輸入數(shù)據(jù)流(InputStream)是指只能讀不

能寫的數(shù)據(jù)流,用于向計(jì)算機(jī)內(nèi)輸入信息

而用

■java,io包中所有輸入數(shù)據(jù)流都是由抽象類

InputStream繼承而來

■從數(shù)據(jù)流中讀取數(shù)據(jù)時(shí),必須有一個(gè)數(shù)據(jù)

源與該數(shù)據(jù)流相連

主要數(shù)據(jù)操作方法

intread()

■從輸入流中讀一個(gè)字節(jié)的二進(jìn)制數(shù)據(jù),然后以此數(shù)據(jù)

為低位字節(jié),配上一個(gè)全零字節(jié),形成一個(gè)0?255之

間的整數(shù)返回。它是一個(gè)抽象方法,需要在子類中具

體實(shí)現(xiàn)。讀取結(jié)束時(shí),它會(huì)得到-1

intread(byte[]b[])

將多個(gè)字節(jié)讀到數(shù)組中,填滿整個(gè)數(shù)組

intread(byte[]b口,intoff,intlen)

■從輸入流中讀取長(zhǎng)度為len的數(shù)據(jù),從數(shù)組b中索引為off

的位置開始放置讀入的數(shù)據(jù),讀畢返回讀取的字節(jié)數(shù)

=L主要數(shù)據(jù)操作方法

voidclose()

■數(shù)據(jù)流關(guān)閉,同時(shí)釋放與該數(shù)據(jù)流相關(guān)的資源

■也可以由運(yùn)行時(shí)系統(tǒng)自動(dòng)關(guān)閉

intavailable()

返回目前可以從數(shù)據(jù)流中讀取的字節(jié)數(shù)(實(shí)際

的讀操作所讀得的字節(jié)數(shù)可能大于該返回值)

longskip(long1)

■跳過數(shù)據(jù)流中指定數(shù)量的字節(jié)不讀,返回值表

示實(shí)際跳過的字節(jié)數(shù)

=L主要數(shù)據(jù)操作方法

booleanmarkSupported()

■用于指示數(shù)據(jù)流是否支持回推操作,當(dāng)數(shù)據(jù)流支

持mark。和reset()方法時(shí)返回true,反之返回

false

voidmark(intmarkarea)

標(biāo)記數(shù)據(jù)流的當(dāng)前位置,并劃出一個(gè)緩沖區(qū),

其大小至少為指定參數(shù)的大小

voidreset()

■執(zhí)行完read。操作后,調(diào)用方法reset。將回到輸

入數(shù)據(jù)流中被標(biāo)記的位置

KL輸出數(shù)據(jù)流

■輸出數(shù)據(jù)流(OutputStream)是指只能寫不

能讀的流,用于從計(jì)算機(jī)中輸出數(shù)據(jù)

■java.io包中所有輸出數(shù)據(jù)流大多是從抽象類

Outputstream繼承而來

=L主要數(shù)據(jù)操作方法

voidwrite(inti)

■將字節(jié)i寫入到數(shù)據(jù)流中,它只輸出低位字節(jié)。

該方法是抽象方法,需要在其輸出流子類中加

以實(shí)現(xiàn),然后才能使用

voidwrite(byteb[])

■將數(shù)組b□中的全部b.length個(gè)字節(jié)寫入數(shù)據(jù)流

voidwrite(byteb[]5intoff,intlen)

■將數(shù)組b口中從第off個(gè)字節(jié)開始的len個(gè)字節(jié)寫

入數(shù)據(jù)流

=L主要數(shù)據(jù)操作方法

voidclose()

,當(dāng)結(jié)束對(duì)輸出數(shù)據(jù)流的操作時(shí)將其關(guān)閉

voidflush()

■輸出數(shù)據(jù)流會(huì)在提交數(shù)據(jù)之前把所要輸出的數(shù)

據(jù)先鎖定在內(nèi)存緩沖區(qū)中,然后成批地進(jìn)行輸

出,每次傳輸過程都以某特定數(shù)據(jù)長(zhǎng)度為單位

進(jìn)行傳輸。這種方式下,在數(shù)據(jù)的末尾一般都

會(huì)有一部分?jǐn)?shù)據(jù)由于數(shù)量不夠一個(gè)批次,而存

留在緩沖區(qū)里,flush。可以將留在緩沖區(qū)里的

數(shù)據(jù)強(qiáng)制提交

=L基本字節(jié)數(shù)據(jù)流類三

■文件數(shù)據(jù)流

■包括FilelmputStream和FileOutputStream,

■用來進(jìn)行文件的I/O處理,其數(shù)據(jù)源都應(yīng)當(dāng)是文

對(duì)本機(jī)上的文件進(jìn)行操作,但是它們不支持方

法nark()^nreset()

在構(gòu)造文件數(shù)據(jù)流時(shí),可以直接給出文件名

FilelnputStreamfis=newFileInputStream(HmyFileH);

I)

例10-2

■在“myFile.dat”文件中會(huì)保存字符串

FLTO

FileOutputStreamout=newFileOutputStream(nmyFile.datn);

out.write(,H,);

out.write(69);

out.write(76);

out.write('L');

out.write(,O,);

out.write(,!!);

out.closeQ;

BL文件I/O操作異常]=

■類FilelnputStream的實(shí)例對(duì)象,如果所指定

的文件未存在,產(chǎn)生FileNotFoundException

異常

■類FileOutputStream的實(shí)例對(duì)象,如果所指

定的文件不存在,則創(chuàng)建一個(gè)新文件;如

果存在,那么新寫入的內(nèi)容將會(huì)覆蓋原有

數(shù)據(jù)

■如果在讀、寫或生成新文件時(shí)發(fā)生錯(cuò)誤,

則會(huì)產(chǎn)生DException異常

文件數(shù)據(jù)流I/O操作

■程序10-1異常捕獲并處理

■FileInputStrearn來讀取FileOutputStream

輸出的數(shù)據(jù)程序10-2.

前命令提示符

D:\jaua\progran\chapter9>jauacFilelnputStreanTest.Java

D:\jaua\progi'an\chapter9>jauaFilelnputStreanTest

726976767933

D:\jaua\pi'ogi'am\chaptei'9>.

過濾流

■過濾器數(shù)據(jù)流在創(chuàng)建時(shí)與一個(gè)已經(jīng)存在的

數(shù)據(jù)流相連,這樣在從這樣的數(shù)據(jù)流中讀

取數(shù)據(jù)時(shí),它提供的是對(duì)一個(gè)原始輸入數(shù)

據(jù)流的內(nèi)容進(jìn)行了特定處理的數(shù)據(jù)。

=L緩沖區(qū)數(shù)據(jù)流

■BufferedlnputStream^DBufferedOutputStream

■都屬于過濾器數(shù)據(jù)流,都是在數(shù)據(jù)流上增

加了一個(gè)緩沖區(qū)

■讀寫數(shù)據(jù)時(shí),數(shù)據(jù)以塊為單位先進(jìn)入緩沖

區(qū)(塊的大小可以進(jìn)行設(shè)置),其后的讀

寫操作則作用于緩沖區(qū)

■降低了不同硬件設(shè)備之間速度的差異,提

高了I/O操作的效率

■提供了對(duì)mark。、reset。、skip()等方法的支

^=L創(chuàng)建該類的實(shí)例對(duì)象

■取缺省緩沖區(qū)的大小

FilelnputStreamfis=newFileInputStream(nmyFilen);

InputStreamis=newBuflferedlnputStream(fis);

FileOutputStreamfos=newFileOutputStream("myFilen);

、Outputstreamos=newBufferedOutputStream(fds);/

■自行設(shè)置緩沖區(qū)的大小

FilelnputStreamfis=newFileInputStream(nmyFilen);'

InputStreamis=newBufferedInputStream(fis,1024);

FileOutputStreamfbs=newFileOutputStream(nmyFilen);

Outputstreamos=newBufferedOutputStream(fds,1024);,

■關(guān)閉一個(gè)緩沖區(qū)輸出流之前,使用flush()方法

KL數(shù)據(jù)數(shù)據(jù)流

■DatalnputStream和DataOutputStream

■允許通過數(shù)據(jù)流來讀寫Java原始類型

■布爾型(Boolean)、浮點(diǎn)型(float)等等

■創(chuàng)建方式:

DatalnputStreamdis=newDatalnputStream(is);

DataOutputStreamdos=newDataOutputStream(os);

DatalnputStream類方法

bytereadByte()

longreadLong()

doublereadDouble()

booleanreadBoolean()

StringreadUTF()

intreadlnt()

floatreadFloat()

shortreadShort()

charreadChar()

:DataOutputStream類方法:

voidwriteByte(intaBytel

voidwriteLong(longaLcDatalnputStream的方法

與DataOutputStream的方

voidwriteDouble(doubk法都是成對(duì)出現(xiàn)的

voidwriteBoolean(boole

voidwriteUTF(StringaStrin^

I

voidwritelnt(intanlnt)

voidwriteFloat(floataFloat)

voidwriteShort(shortaShort)

voidwriteChar(charaChar)

KL管道數(shù)據(jù)流

■管道數(shù)據(jù)流主要用于線程間的通信

■一個(gè)線程中的PipedlnputStream對(duì)象從另一

個(gè)線程中互補(bǔ)的PipedOutputStream對(duì)象中接

收輸入

類PipedlnputStream必須和類PipedOutputStream

一起使用,來建立一個(gè)通信通道

管道數(shù)據(jù)流必須同時(shí)具備可用的輸入端和輸出

創(chuàng)建一個(gè)通信通道

=L創(chuàng)建一個(gè)通信通道21

■直接將輸入流與輸出流連接起來

PipedlnputStreampis=newPipedInputStream();

PipedOutputStreampos=newPipedOutputStream(pis);

PipedOutputStreampos=newPipedOutputStream();

PipedlnputStreampis=newPipedlnputStream(pos);

管道通信程序

■管道的兩端建立連接以后就可以進(jìn)行數(shù)據(jù)

的通信了,見程序10-3

對(duì)象流

■能夠輸入輸出對(duì)象的流稱為對(duì)象流

■通過java,io包中ObjectlnputStream^D

ObjectOutputStream兩個(gè)類實(shí)現(xiàn)的

KL寫對(duì)象數(shù)據(jù)流

■將一個(gè)java.util.Date對(duì)象實(shí)例送入文件

Z

Dated=newDate();

FileOutputStreamf=newFileOutputStream(ndate.sern);

ObjectOutputStreams=newObjectOutputStream(f);

try{

s.writeObject(d);

s.closeQ;

}catch(IOExceptione){

e.printStackTrace();

讀對(duì)象數(shù)據(jù)流

■readObject。把數(shù)據(jù)流以O(shè)bject類型返回,應(yīng)

該在轉(zhuǎn)換為正確的類名之后再執(zhí)行

/^Dated=null;

IFilelnputStreamf=newFileInputStream(ndate.sern);

ObjectlnputStreams=newObjectlnputStream(f);

Itry{

d=(Date)s.readObject(d);

s.closeQ;

}catch(IOExceptione){

e.printStackTrace();

}

\System.out.println(nDateserializedat"n+d);

=L可持續(xù)性概念

■能夠記錄自己的狀態(tài)以便將來再生的能力,叫對(duì)

象的持續(xù)性(Persistence)

■一個(gè)對(duì)象是可持續(xù)的,意味著可以把這個(gè)對(duì)象存入磁

盤、磁帶,或傳入另一臺(tái)機(jī)器保存在它的內(nèi)存或磁盤

中。也就是說把對(duì)象存為某種永久存儲(chǔ)類型。

■對(duì)象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己的

過程叫持續(xù)化(或串行化,Serial];)

持續(xù)化的主要任務(wù)是寫出對(duì)象實(shí)例變量的數(shù)值,如果

變量是另一個(gè)對(duì)象的引用,則引用的對(duì)象也要串行化。

這個(gè)過程是遞歸的。

=LJava的可持續(xù)性

■一個(gè)類聲明實(shí)現(xiàn)Serializable接I時(shí),表明該

類加入了對(duì)象串行化協(xié)議

■Serializable接口中沒有定義任何方法,只是

作為一個(gè)標(biāo)記來指示實(shí)現(xiàn)該接口的類可以

被持續(xù)化

■Java中,允許可串行化的對(duì)象通過對(duì)象流進(jìn)

行傳輸

■例10-5

KL串行化對(duì)象

■要串行化一個(gè)對(duì)象,必須與一定的對(duì)象輸

出/輸入流聯(lián)系起來

■通過對(duì)象輸出流將對(duì)象狀態(tài)保存下來

■通過對(duì)象輸入流將對(duì)象狀態(tài)恢復(fù)。

■通過上@丫2二0包中的0句。戊0叫)出51;正@1]1和

ObjectlnputStreamM個(gè)類實(shí)現(xiàn)

前者用writeObject()方法可以直接將對(duì)象保存到

輸出流中,而后者用readObject()方法可以直接

從輸入流中讀取一個(gè)對(duì)象

=L串行化對(duì)象例

■對(duì)象的存儲(chǔ)程序10-4

■對(duì)象的恢復(fù)程序10-5

-nX

D:\java\progran\chapter9>jauacObjectRecou.jaua

D:\java\program\chapter9>jauaObjectRecou

ID:981036name:LiMingage:16dept.:CSD

Dipaua'pi>ogKamXchapterg》________________________________

II

KL對(duì)象結(jié)構(gòu)表

■串行化只能保存對(duì)象的非靜態(tài)成員變量,而不能

保存任何成員方法和靜態(tài)成員變量,并且保存的

只是看.的值,對(duì)于變量的任何修飾符都不能保

存,訪問權(quán)限(public,protected,private)對(duì)于

數(shù)據(jù)域的持續(xù)化沒有影響

■數(shù)據(jù)會(huì)經(jīng)常變化,狀態(tài)只是瞬時(shí)的對(duì)象無法保存

其狀態(tài),不具有可持續(xù)性。如Thread對(duì)象或流對(duì)

象。對(duì)于這樣的成員變量,必須用關(guān)鍵字

標(biāo)明,否則編譯器將報(bào)錯(cuò)。任何用transient關(guān)鍵字

標(biāo)明的成員變量,都不會(huì)被保存

對(duì)象結(jié)構(gòu)表

■串行化可能涉及將對(duì)象存放到磁盤上或在網(wǎng)絡(luò)上

發(fā)送數(shù)據(jù),這時(shí)會(huì)產(chǎn)生安全問題。對(duì)于一些需要

保密的數(shù)據(jù),不應(yīng)保存在永久介質(zhì)中(或者不應(yīng)

簡(jiǎn)單地不加處理地保存下來),為了保證安全,

應(yīng)在這些變量前加上transient關(guān)鍵字

■數(shù)據(jù)變量是一個(gè)對(duì)象時(shí),該對(duì)象的數(shù)據(jù)成員也可

以被持續(xù)化。對(duì)象的數(shù)據(jù)結(jié)構(gòu)或結(jié)構(gòu)樹,包括其

子對(duì)象樹在內(nèi),構(gòu)成了這個(gè)對(duì)象的結(jié)構(gòu)表

■如果一個(gè)對(duì)象圖表中包含了一個(gè)對(duì)不可持續(xù)化對(duì)

象的引用,而這個(gè)引用已用關(guān)鍵字transie加以標(biāo)

記,則這個(gè)對(duì)象仍可以被持續(xù)化

=L例10?6j=

■于myThread域有transient修飾,所以盡管它

為不可持續(xù)化元素,但其整個(gè)對(duì)象仍可持

續(xù)化

publicclassMyClassimplementsSerializable{

publictransientThreadmyThread;

privateStringcustomerlD;

privateinttotal;

transient例J三

■盡管變量customerlD是可持續(xù)化元素,但由

于有transient修飾,所以,整個(gè)對(duì)象在持續(xù)

化時(shí)不會(huì)對(duì)它進(jìn)行持續(xù)化

publicclassMyClassimplementsSerializeble{

publictransientThreadmyThread;

privatetransientStringcustomerlD;

privateinttotal;

KL基本字符流j=

■從JDK1.1開始,java.io包中力口入了專門用于

字符流處理的類

■以Reader和Writer為基礎(chǔ)派生的一系列類

■Reader和Writer也是抽象類,只提供了一系

烈用于字符流處理的接口。匕們的方法與

類InputStream和Outputstream類似,只不過

其中的參數(shù)換成字符或字符數(shù)組

■字節(jié)流中類DatalnputStream的readLine方

法,可以以字節(jié)形式讀入,以Unicode形式

輸出(StringreadLine())

KL讀者和寫者

■讀者(Readers)和寫者(Writers)提供對(duì)

不同平臺(tái)之間數(shù)據(jù)流數(shù)據(jù)進(jìn)行轉(zhuǎn)換的功能

■同其他程序設(shè)計(jì)語言使用ASCH字符集不同:

Java使用licode來表示字符串和字符

ASCII字符集是以一個(gè)字節(jié)(8bit)來表示一個(gè)

字符,所以可以認(rèn)為一個(gè)字符就是一個(gè)字節(jié)

(byte).Unicode是一種大字符集,要用兩個(gè)

字節(jié)(16bit)來表示一個(gè)字符

rInputStreamReader

LOutputStrearnWriterJ

■這兩個(gè)類是字節(jié)流和讀者、寫者的接口

用來在字節(jié)流和字符流之間作為中介

,■構(gòu)造方法

InputStreamReader(InputStreamin);〃缺省規(guī)范

InputStreamReader(InputStreamin,Stringenc);〃指定規(guī)范enc

OutputStreamWriter(OutputStreamout);〃軌省規(guī)范

OutputStreamWriter(OutputStreamout,Stringenc);〃指定規(guī)范enc

構(gòu)造映射至UASCII碼的標(biāo)準(zhǔn)的InputStreamReader的方法如下

ir=newInputStreamReader(System.in,”88591”);

SL讀者提供的方法

voidclose()

voidmark(intreadAheadLimit)

booleanmarkSupported():

intread()

intread(char[]cbuf)

intread(char[]cbuf,intoff,intlen)

booleanready()

voidreset()

longskip(longn)

SL寫者提供的方法

voidclose()

voidflush()

voidwrite(char[]cbuf)

voidwrite(char[]cbuf,intoff,intlen)

voidwrite(intc)

voidwrite(Stringstr)

voidwrite(Stringstr,intoff,intlen)

=L緩沖區(qū)讀者和寫者

■BufferedReader^DBufferedWriter,

構(gòu)造方法與BufIeredInputStream,BufferedOutputStream

相類似

■整行字符處理方法

■publicStringreadLine():BufferedReader方法,

從輸入流中讀取一行字符,行結(jié)束標(biāo)志為"\n\

或兩者一起

■publicvoidnewLine(>:BufferedWriter的方法,

向輸出流中寫入一個(gè)行結(jié)束標(biāo)志

BL程相10?6

■程序10-6每從文件“fllel.txt”中讀出一行,

就將其顯示出來,并在行首加上字符串

“read:"

賓命令程示符

\Dz\jaua\progi*an\chapter9>jauacFileTollnicode.jaua

J司

p、

:dV|,冷Nae

File鐵

踏成

1'9>JToUnod肉泥

09^羅apau1C,^

d馬

nea?等*

過一

—E

d?國(guó)

戰(zhàn)

mea^意

?。

戰(zhàn)

,

對(duì)

險(xiǎn)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論