版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 毛毯歐盟采購(gòu)合同模板
- 鋼材西銷售合同模板
- 福建省消防采購(gòu)合同模板
- 個(gè)人車位租賃合同模板
- 工地混凝土合同模板
- 防腐噴漆合同模板
- 銀 連鎖合同模板
- 酒類咨詢服務(wù)合同模板
- 麥草采購(gòu)合同模板
- 裝修保潔施工合同模板
- 2025屆高考語文一輪復(fù)習(xí):荒誕小說 專題突破 課件
- 2024至2030年中國(guó)EDI超純水設(shè)備行業(yè)運(yùn)行態(tài)勢(shì)與發(fā)展行情監(jiān)測(cè)報(bào)告
- 2024年車輛牌照租賃協(xié)議標(biāo)準(zhǔn)版本(四篇)
- 汽車調(diào)光玻璃行業(yè)專題報(bào)告(技術(shù)路徑、市場(chǎng)空間、競(jìng)爭(zhēng)格局等)-2024-08-零部件
- ISO∕IEC 27014-2020 信息安全、網(wǎng)絡(luò)安全與隱私保護(hù)-信息安全治理(中文版-雷澤佳譯2024)
- 2024年全國(guó)中級(jí)銀行從業(yè)資格之中級(jí)個(gè)人貸款考試重點(diǎn)試題附答案
- 2024年東南亞心血管介入器械市場(chǎng)深度研究及預(yù)測(cè)報(bào)告
- 中小學(xué)預(yù)防毒品教育
- 紅色教育典型案例(3篇模板)
- 2024山西大同市平城區(qū)司法協(xié)理員招聘筆試參考題庫含答案解析
- 文藝復(fù)興運(yùn)動(dòng)省公開課一等獎(jiǎng)新名師課比賽一等獎(jiǎng)?wù)n件
評(píng)論
0/150
提交評(píng)論