Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流_第1頁(yè)
Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流_第2頁(yè)
Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流_第3頁(yè)
Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流_第4頁(yè)
Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

12輸入輸出流Java程序設(shè)計(jì)第章Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第1頁(yè)。導(dǎo)讀IntroductionJava中提供的I/O流技術(shù)可以使數(shù)據(jù)在不同設(shè)備之間進(jìn)行傳送;通過(guò)輸入流,可以方便地從輸入設(shè)備中獲得數(shù)據(jù);通過(guò)輸出流,可以容易將數(shù)據(jù)傳送到存儲(chǔ)設(shè)備中。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第2頁(yè)。C目錄ONTENTS12.2File類(lèi)12.3實(shí)體流12.4裝飾流12.5NIO12.6小結(jié)12.1流的概念Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第3頁(yè)。12.1.1流流是一個(gè)無(wú)結(jié)構(gòu)化的數(shù)據(jù)組成的序列,流中的數(shù)據(jù)沒(méi)有任何格式和含義,只是以字節(jié)或字符形式進(jìn)行流入或流出。數(shù)據(jù)流的流入和流出都是以程序本身作為核心,流入是指數(shù)據(jù)從外部數(shù)據(jù)源流入到程序內(nèi)部;流出是指數(shù)據(jù)從程序內(nèi)部向外部流出到數(shù)據(jù)的目的地。不管是流入還是流出,其數(shù)據(jù)的流動(dòng)都是通過(guò)一個(gè)管道進(jìn)行的,管道兩端分別連接數(shù)據(jù)源和數(shù)據(jù)目的地。流的本質(zhì)就是進(jìn)行數(shù)據(jù)傳輸,因此Java根據(jù)數(shù)據(jù)傳輸?shù)奶匦詫⒘鞒橄蟪筛鞣N類(lèi),以方便進(jìn)行數(shù)據(jù)操作。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第4頁(yè)。12.1.1流輸入數(shù)據(jù)流磁盤(pán)文件網(wǎng)絡(luò)其他數(shù)據(jù)源數(shù)據(jù)目的地輸出數(shù)據(jù)流應(yīng)用程序Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第5頁(yè)。根據(jù)處理數(shù)據(jù)類(lèi)型,可以分為字節(jié)流和字符流。根據(jù)數(shù)據(jù)的流向可以分為輸入流和輸出流。根據(jù)處理數(shù)據(jù)功能,可以分為實(shí)體流和裝飾流。實(shí)體流對(duì)數(shù)據(jù)不做任何處理,只完成基本的讀寫(xiě)操作。裝飾流是在實(shí)體流的基礎(chǔ)上,提供更高級(jí)的功能。這些流都在java.io包中。12.1.2流的分類(lèi)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第6頁(yè)。在數(shù)據(jù)傳輸過(guò)程中以字節(jié)為單位進(jìn)行輸入和輸出。適用于傳輸各種類(lèi)型的文件或數(shù)據(jù)。在字節(jié)輸入流中,InputStream類(lèi)是所有的輸入字節(jié)流的父類(lèi),它是一個(gè)抽象類(lèi)。其子類(lèi)中的ByteArrayInputStream、FileInputStream是兩種基本的實(shí)體流。ObjectInputStream和所有FilterInputStream的子類(lèi)都是裝飾流。在字節(jié)輸出流中,OutputStream是所有的輸出字節(jié)流的父類(lèi),它是一個(gè)抽象類(lèi)。ByteArrayOutputStream、FileOutputStream是兩種基本的實(shí)體流。ObjectOutputStream和所有FilterOutputStream的子類(lèi)都是裝飾流。12.1.2流的分類(lèi)1.字節(jié)流Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第7頁(yè)。12.1.2流的分類(lèi)1.字節(jié)流字節(jié)流InputStreamOutputStreamFileInputStreamFilterInputStream*ObjectInputStream*PipedInputStreamSequenceInputStream*ByteArrayInputStreamBufferedInputStream*DataInputStream*PushBackInputStream*FileOutputStreamFilterOutputStream*ObjectOutputStream*PipedOutputStreamByteArrayOutputStreamBufferedOutputStream*DataOutputStream*PrintStream*Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第8頁(yè)。在數(shù)據(jù)傳輸過(guò)程中以字符為單位進(jìn)行輸入和輸出。根據(jù)字符編碼表,一個(gè)字符占用兩個(gè)字節(jié),因此字符流只適用于字符類(lèi)型數(shù)據(jù)的處理。在字符輸入流中,Reader是所有的輸入字符流的父類(lèi),它是一個(gè)抽象類(lèi)。InputStreamReader是一個(gè)連接字節(jié)流和字符流的橋梁,它使用指定的字符集讀取字節(jié)并轉(zhuǎn)換成字符。其FileReader子類(lèi)可以更方便地讀取字符文件,也是常用的Reader流對(duì)象。在字符輸出流中,Writer是所有的輸出字符流的父類(lèi),也是一個(gè)抽象類(lèi)。相對(duì)輸入流的子類(lèi),輸出流當(dāng)中也有相應(yīng)的輸出子類(lèi),只是數(shù)據(jù)傳輸方向相反。這些類(lèi)有OutputStreamWriter及其子類(lèi)FileWriter、CharArrayWriter、StringWriter、BufferedWriter、PipedWriter等。12.1.2流的分類(lèi)2.字符流Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第9頁(yè)。12.1.2流的分類(lèi)2.字符流字符流ReaderWriterBufferedReaderInputStreamReaderStringReaderPipedReaderCharArrayReaderFilterReaderFileReader*BufferedWriter*OutputStreamWriterStringWriterPipedWriterCharArrayWriterPushbackReader*FileWriter*FilterWriterPrintWriterJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第10頁(yè)。C目錄ONTENTS12.2File類(lèi)12.3實(shí)體流12.4裝飾流12.5NIO12.6小結(jié)12.1流的概念Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第11頁(yè)。12.2.1文件對(duì)象與文件屬性類(lèi)型方法名功能File(String

filename)在當(dāng)前路徑下,創(chuàng)建一個(gè)名字為filename的文件File(Stringpath,Stringfilename)在給定的path路徑下,創(chuàng)建一個(gè)名字為filename的文件StringgetName()獲取此文件(目錄)的名稱(chēng)StringgetPath()獲取路徑名字符串StringgetAbsolutePath()獲取路徑名的絕對(duì)路徑名字符串longlength()獲取文件的長(zhǎng)度。如果表示目錄,則返回值不確定booleancanRead()判斷文件是否可讀文件用文件類(lèi)的對(duì)象表示,有了文件對(duì)象就可以獲取文件的屬性。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第12頁(yè)。12.2.1文件對(duì)象與文件屬性【例12.1】讀取給定文件的相關(guān)屬性,如果該文件不存在則創(chuàng)建該文件。Example12_01.java類(lèi)型方法名功能booleancanWrite()判斷文件是否可寫(xiě)booleancanExecute()判斷文件是否執(zhí)行booleanexists()判斷文件(目錄)是否存在booleanisFile()判斷文件是否是一個(gè)標(biāo)準(zhǔn)文件booleanisDirectory()判斷文件是否是一個(gè)目錄booleanisHidden()判讀文件是否是一個(gè)隱藏文件longlastModified()獲取文件最后一次被修改的時(shí)間Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第13頁(yè)。12.2.2目錄類(lèi)型方法名功能booleanmkdir()創(chuàng)建一個(gè)目錄,并返回創(chuàng)建結(jié)果。成功返回true,失?。夸浺汛嬖冢┓祷豧alsebooleanmkdirs()創(chuàng)建一個(gè)包括父目錄在內(nèi)的目錄。創(chuàng)建所有目錄成功返回true,如果失敗返回false,但要注意的是有可能部分目錄已創(chuàng)建成功String[]list()獲取目錄下字符串表示形式的文件名和目錄名String[]list(FilenameFilter

filter)獲取滿(mǎn)足指定過(guò)濾器條件的字符串表示形式的文件名和目錄名Java把目錄作為一種特殊的文件進(jìn)行處理,它除了具備文件的基本屬性如文件名、所在路徑等信息以外,同時(shí)也提供了專(zhuān)用于目錄的一些操作方法。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第14頁(yè)。12.2.2目錄類(lèi)型方法名功能File[]listFiles()獲取目錄下文件類(lèi)型表示形式的文件名和目錄名File[]listFiles(FileFilter

filter)獲取滿(mǎn)足指定過(guò)濾器文件條件的文件表示形式的文件名和目錄名File[]listFiles(FilenameFilter

filter)獲取滿(mǎn)足指定過(guò)濾器路徑和文件條件的文件表示形式的文件名和目錄名【例12.2】列出給定目錄下的所有文件名,并列出給定擴(kuò)展名的所有文件名。Example12_02.javaJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第15頁(yè)。12.2.3文件的操作1.創(chuàng)建文件File類(lèi)的方法:

publicbooleancreateNewFile()例如,要想在D盤(pán)根目錄下創(chuàng)建一個(gè)hello.txt文件,則首先由File類(lèi)創(chuàng)建一個(gè)文件對(duì)象:

Filefile=newFile(“D:\\”,”hello.txt”);然后使用語(yǔ)句:file.createNewFile();就可以創(chuàng)建文件。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第16頁(yè)。

publicbooleandelete()例如上述的hello.txt文件可以使用語(yǔ)句:

file.delete();刪除。12.2.3文件的操作2.刪除文件File類(lèi)中的方法:Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第17頁(yè)。

Runtimeec=Runtime.getRuntime();然后用ec調(diào)用方法:

Processexec(Stringcommand);需要使用java.lang.Runtime類(lèi)。首先利用Runtime類(lèi)的靜態(tài)方法創(chuàng)建一個(gè)Runtime對(duì)象:方法執(zhí)行本地的命令,參數(shù)command為指定的系統(tǒng)命令。12.2.3文件的操作3.運(yùn)行可執(zhí)行文件【例12.3】調(diào)用記事本命令,打開(kāi)一個(gè)新記事本。Example12_03.javaJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第18頁(yè)。12.2.4Scanner類(lèi)與文件

Scannerinput=newScanner(文件類(lèi)對(duì)象);創(chuàng)建的Scanner類(lèi)的對(duì)象使用read()方法即可從文件中讀數(shù)據(jù)。讀數(shù)據(jù)時(shí)默認(rèn)以空格作為數(shù)據(jù)的分隔標(biāo)記。利用Scanner類(lèi)的對(duì)象,可以從文件中讀取數(shù)據(jù):【例12.4】有一個(gè)購(gòu)物清單:電視機(jī)3200.00元,智能手機(jī)2200.00元,筆記本4200.00元,午餐120.25元。統(tǒng)計(jì)該次購(gòu)物共花費(fèi)多少?該購(gòu)物清單存放在一個(gè)文件record.txt中。Example12_04.javaJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第19頁(yè)。C目錄ONTENTS12.2File類(lèi)12.3實(shí)體流12.4裝飾流12.5NIO12.6小結(jié)12.1流的概念Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第20頁(yè)。12.3.1字節(jié)流抽象類(lèi)InputStream和抽象類(lèi)OutputStream是所有字節(jié)流類(lèi)的根類(lèi),其他字節(jié)流類(lèi)都繼承自這兩個(gè)類(lèi)。字節(jié)輸入流的作用是從數(shù)據(jù)輸入源(例如從磁盤(pán)、網(wǎng)絡(luò)等)獲取字節(jié)數(shù)據(jù)到應(yīng)用程序(內(nèi)存)中。1.字節(jié)輸入流InputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第21頁(yè)。類(lèi)型方法名功能intread()從輸入流中讀取下一個(gè)字節(jié),返回讀入的字節(jié)數(shù)據(jù);如果讀到末尾,返回-1intread(byteb[])從輸入流中讀取一定數(shù)量的字節(jié)保存到字節(jié)數(shù)組中,并返回實(shí)際讀取的字節(jié)數(shù)intread(byteb[],intoff,intlen)從輸入流中讀取最多l(xiāng)en個(gè)字節(jié),保存到數(shù)組b中從off開(kāi)始的位置,并返回實(shí)際讀入的字節(jié)數(shù);如果off+len大于b.length,或者off和len中有一個(gè)是負(fù)數(shù),那么會(huì)拋出IndexOutOfBoundsException異常longskip(longn)從輸入流中跳過(guò)并丟棄n個(gè)字節(jié),并返回實(shí)際跳過(guò)的字節(jié)數(shù)12.3.1字節(jié)流1.字節(jié)輸入流InputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第22頁(yè)。類(lèi)型方法名功能voidclose()關(guān)閉輸入流,釋放資源。對(duì)流的讀取完畢后調(diào)用該方法以釋放資源intavailable()返回此輸入流可以讀?。ɑ蛱^(guò))的估計(jì)字節(jié)數(shù)voidmark(int

readlimit)在輸入流中標(biāo)記當(dāng)前的位置。參數(shù)readlimit為標(biāo)記失效前最多讀取的字節(jié)數(shù)。如果讀取的字節(jié)數(shù)超出此范圍則標(biāo)記失效voidreset()將輸入流重新定位到最后一次調(diào)用

mark方法時(shí)的位置booleanmarkSupported()測(cè)試此輸入流是否支持

mark和

reset方法。只有帶緩存的輸入流支持標(biāo)記功能12.3.1字節(jié)流1.字節(jié)輸入流InputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第23頁(yè)。publicFileInputStream(File

file)throwsFileNotFoundExceptionpublicFileInputStream(String

name)throwsFileNotFoundException在進(jìn)行字節(jié)輸入流操作時(shí),經(jīng)常使用的是InputStream類(lèi)的子類(lèi)FileInputStream,實(shí)現(xiàn)簡(jiǎn)單的文件數(shù)據(jù)讀取。FileInputStream類(lèi)的常用構(gòu)造方法:通過(guò)給定的File對(duì)象和文件創(chuàng)建文件字節(jié)輸入流對(duì)象。在創(chuàng)建輸入流時(shí),如果文件不存在或出現(xiàn)其他問(wèn)題,會(huì)拋出FileNotFoundException異常,所以要注意捕獲。12.3.1字節(jié)流2.文件字節(jié)輸入流類(lèi)FileInputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第24頁(yè)。設(shè)定輸入流的數(shù)據(jù)源01OPTION02OPTION03OPTION04OPTION創(chuàng)建指向這個(gè)數(shù)據(jù)源的輸入流從輸入流中讀取數(shù)據(jù)關(guān)閉輸入流字節(jié)輸入流讀數(shù)據(jù)步驟:【例12.5】從磁盤(pán)文件中讀取指定文件并顯示出來(lái)。Example12_05.java12.3.1字節(jié)流2.文件字節(jié)輸入流類(lèi)FileInputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第25頁(yè)。字節(jié)輸出流的作用是將字節(jié)數(shù)據(jù)從應(yīng)用程序(內(nèi)存)中傳送到輸出目的地,如外部設(shè)備、網(wǎng)絡(luò)等。字節(jié)輸出流OutputStream的常用方法。類(lèi)型方法名功能voidwrite(intb)將整數(shù)b的低8位寫(xiě)到輸出流voidwrite(byteb[])將字節(jié)數(shù)組中數(shù)據(jù)寫(xiě)到輸出流voidwrite(byteb[],intoff,intlen)從字節(jié)數(shù)組b的off處寫(xiě)len個(gè)字節(jié)數(shù)據(jù)到輸出流voidflush()強(qiáng)制將輸出流保存在緩沖區(qū)中的數(shù)據(jù)寫(xiě)到輸出流voidclose()關(guān)閉輸出流,釋放資源12.3.1字節(jié)流3.字節(jié)輸出流Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第26頁(yè)。

publicFileOutputStream(File

file)throwsIOExceptionpublicFileOutnputStream(String

name)throwsIOExceptionpublicFileOutputStream(File

file,boolean

append)throwsIOExceptionpublicFileOutputStream(Stringname,boolean

append)throwsIOException在進(jìn)行字節(jié)輸出流操作時(shí),經(jīng)常使用的是OutputStream類(lèi)的子類(lèi)FileOutputStream,用于將數(shù)據(jù)寫(xiě)入File或其他的輸出流。FileOutputStream類(lèi)的常用構(gòu)造方法:12.3.1字節(jié)流4.文件字節(jié)輸出流類(lèi)FileOutputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第27頁(yè)。字節(jié)輸出流寫(xiě)數(shù)據(jù)步驟:設(shè)定輸出流的目的地01OPTION02OPTION03OPTION04OPTION創(chuàng)建指向這目的地輸出向輸出流中寫(xiě)入數(shù)據(jù)關(guān)閉輸出流12.3.1字節(jié)流4.文件字節(jié)輸出流類(lèi)FileOutputStreamJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第28頁(yè)。12.3.1字節(jié)流4.文件字節(jié)輸出流類(lèi)FileOutputStream在完成寫(xiě)操作過(guò)程中,系統(tǒng)會(huì)將數(shù)據(jù)暫存到緩沖區(qū)中,緩沖區(qū)存滿(mǎn)后再一次性寫(xiě)入到輸出流中。執(zhí)行close()方法時(shí),不管緩沖區(qū)是否已滿(mǎn),都會(huì)把其中的數(shù)據(jù)寫(xiě)到輸出流?!纠?2.6】向一個(gè)磁盤(pán)文件中寫(xiě)入數(shù)據(jù),第二次寫(xiě)操作采用追加方式完成。Example12_06.javaJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第29頁(yè)。12.3.2字符流字符流通常用于文本文件的傳輸。抽象類(lèi)Reader和抽象類(lèi)Writer是所有字符流類(lèi)的根類(lèi),其他字符流類(lèi)都繼承自這兩個(gè)類(lèi)。其中一些子類(lèi)還在傳輸過(guò)程中對(duì)數(shù)據(jù)做了進(jìn)一步處理以方便用戶(hù)的使用。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第30頁(yè)。12.3.2字符流字符輸入流Reader是所有字符輸入流類(lèi)的父類(lèi),實(shí)現(xiàn)從數(shù)據(jù)源讀入字符數(shù)據(jù)。常用方法有:類(lèi)型方法名功能intread()從輸入流讀取單個(gè)字符intread(char[]

cbuf)從輸入流讀取字符保存到數(shù)組cbuf中,返回讀取的字符數(shù),如果已到達(dá)流的末尾,則返回

-1intread(char[]

cbuf,int

off,int

len)從輸入流讀取最多l(xiāng)en個(gè)字符保存到字符數(shù)組cbuf中,存放的起始位置在off處。返回:讀取的字符數(shù),如果已到達(dá)流的末尾,則返回

-11.字符輸入流ReaderJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第31頁(yè)。12.3.2字符流類(lèi)型方法名功能longskip(long

n)跳過(guò)n個(gè)字符。返回:實(shí)際跳過(guò)的字符數(shù)voidmark(int

readAheadLimit)標(biāo)記流中的當(dāng)前位置voidreset()重置該流booleanmarkSupported()判斷此流是否支持

mark()操作voidclose()關(guān)閉該流,釋放資源1.字符輸入流ReaderJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第32頁(yè)。publicFileReader(File

file)throwsFileNotFoundExceptionpublicFileReader(String

name)throwsFileNotFoundException進(jìn)行字符輸入流操作時(shí),經(jīng)常使用的是Reader類(lèi)的子類(lèi)FileReader,用于從輸入流讀取數(shù)據(jù)。FileReader類(lèi)的常用構(gòu)造方法:通過(guò)給定的File對(duì)象或文件名創(chuàng)建字符輸入流。在創(chuàng)建輸入流時(shí),如果文件不存在或出現(xiàn)其他問(wèn)題,會(huì)拋出FileNotFoundException異常。12.3.2字符流2.文件字符輸入流FileReaderJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第33頁(yè)。類(lèi)型方法名功能voidwrite(intc)將整數(shù)c的低16位寫(xiě)到輸出流voidwrite(char[]cbuf)將字符數(shù)組中數(shù)據(jù)寫(xiě)到輸出流voidwrite(cbuf[],intoff,intlen)從字符數(shù)組cbuf的off處開(kāi)始取len個(gè)字符寫(xiě)到輸出流voidwrite(String

str)將字符串寫(xiě)到輸出流voidwrite(Stringstr,intoff,intlen)從字符串str的off處開(kāi)始取len個(gè)字符數(shù)據(jù)寫(xiě)到輸出流voidflush()強(qiáng)制將輸出流保存在緩沖區(qū)中的數(shù)據(jù)寫(xiě)到輸出voidclose()關(guān)閉輸出流,釋放資源字符輸出流Writer用于將字符數(shù)據(jù)輸出到目的地。類(lèi)Writer的常用方法:12.3.2字符流3.字符輸出流類(lèi)WriterJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第34頁(yè)。FileWriter類(lèi)和字節(jié)流FileOutputStream類(lèi)相對(duì)應(yīng),實(shí)現(xiàn)字符的輸出操作,實(shí)現(xiàn)方法也基本相同。FileWriter類(lèi)的常用構(gòu)造方法:12.3.2字符流4.文件字符輸出流FileWriter類(lèi)publicFileWriter(File

file)throwsIOExceptionpublicFileWriter(String

name)throwsIOExceptionpublicFileWriter(File

file,boolean

append)throwsIOExceptionpublicFileWriter(Stringname,boolean

append)throwsIOExceptionJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第35頁(yè)。如果第二個(gè)參數(shù)為true,則將字符寫(xiě)入文件末尾處,而不是寫(xiě)入文件開(kāi)始處。如果文件不存在或出現(xiàn)其他問(wèn)題,會(huì)拋出IOException異常?!纠?2.7】利用文件流實(shí)現(xiàn)文件的復(fù)制功能。Example12_07.java12.3.2字符流4.文件字符輸出流FileWriter類(lèi)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第36頁(yè)。C目錄ONTENTS12.2File類(lèi)12.3實(shí)體流12.4裝飾流12.5NIO12.6小結(jié)12.1流的概念Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第37頁(yè)。12.4.1數(shù)據(jù)流數(shù)據(jù)流是Java提供的一種裝飾類(lèi)流。建立在實(shí)體流基礎(chǔ)上,讓程序不需考慮數(shù)據(jù)所占字節(jié)個(gè)數(shù)的情況下就能夠正確地完成讀寫(xiě)操作。DataInputStream類(lèi)和DataOutputStream類(lèi)分別為數(shù)據(jù)輸入流類(lèi)和數(shù)據(jù)輸出流類(lèi)。數(shù)據(jù)輸入流DataInputStream類(lèi)允許程序以與機(jī)器無(wú)關(guān)方式從底層輸入流中讀取基本Java數(shù)據(jù)類(lèi)型。DataInputStream類(lèi)的常用方法:Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第38頁(yè)。12.4.1.1數(shù)據(jù)輸入流類(lèi)型方法名功能DataInputStream(InputStream

in)使用指定的實(shí)體流

InputStream創(chuàng)建一個(gè)DataInputStream。booleanreadBoolean()讀取一個(gè)布爾值bytereadByte()讀取一個(gè)字節(jié)charreadChar()讀取一個(gè)字符longreadLong()讀取一個(gè)長(zhǎng)整型數(shù)intreadInt()讀取一個(gè)整數(shù)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第39頁(yè)。類(lèi)型方法名功能shortreadShort()讀取一個(gè)短整型數(shù)floatreadFloat()讀取一個(gè)Float數(shù)doublereadDouble()讀取一個(gè)Double數(shù)StringreadUTF()讀取一個(gè)UTF字符串intskipBytes(int

n)跳過(guò)并丟棄n個(gè)字節(jié),返回實(shí)際跳過(guò)的字節(jié)數(shù)12.4.1.1數(shù)據(jù)輸入流Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第40頁(yè)。12.4.1.2數(shù)據(jù)輸出流數(shù)據(jù)輸出流DataOutputStream類(lèi)允許程序以適當(dāng)方式將基本Java數(shù)據(jù)類(lèi)型寫(xiě)入輸出流中。DataOutputStream類(lèi)的常用方法:類(lèi)型方法名功能DataOuputStream(OutputStream

out)創(chuàng)建一個(gè)新的數(shù)據(jù)輸出流,將數(shù)據(jù)寫(xiě)入指定基礎(chǔ)輸出流voidwriteBoolean(Booleanv)將一個(gè)布爾值寫(xiě)出到輸出流voidwriteByte(intv)將一個(gè)字節(jié)寫(xiě)出到輸出流voidwriteBytes(String

s)將字符串按字節(jié)(每個(gè)字符的高八位丟棄)順序?qū)懗龅捷敵隽髦衯oidwriteChar(intc)將一個(gè)char值以2字節(jié)值形式寫(xiě)入輸出流中,先寫(xiě)入高字節(jié)voidwriteChars(String

s)將字符串按字符順序?qū)懗龅捷敵隽鱲oidwriteLong(longv)將一個(gè)長(zhǎng)整型數(shù)寫(xiě)出到輸出流Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第41頁(yè)。類(lèi)型方法名功能voidwriteInt(intv)將一個(gè)整數(shù)寫(xiě)出到輸出流voidwriteShort(intv)將一個(gè)短整型數(shù)寫(xiě)出到輸出流voidwriteFloat(floatv)將一個(gè)Float數(shù)寫(xiě)出到輸出流voidwriteDouble(doublev)將一個(gè)Double數(shù)寫(xiě)出到輸出流voidwriteUTF(Strings)將一個(gè)字符串用UTF_8編碼形式寫(xiě)出到輸出流intsize()返回寫(xiě)到數(shù)據(jù)輸出流中的字節(jié)數(shù)voidflush()清空輸出流,使所有緩沖中的字節(jié)被寫(xiě)出到流中12.4.1.2數(shù)據(jù)輸出流【例12.8】將幾個(gè)Java基本數(shù)據(jù)類(lèi)型的數(shù)據(jù)寫(xiě)入到一個(gè)文件中,再將之讀出來(lái)后顯示出來(lái)。Example12_08.javaJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第42頁(yè)。12.4.2緩沖流緩沖流是在實(shí)體I/O流基礎(chǔ)上增加一個(gè)緩沖區(qū),應(yīng)用程序和I/O設(shè)備之間的數(shù)據(jù)傳輸都要經(jīng)過(guò)緩沖區(qū)來(lái)進(jìn)行。緩沖流分為緩沖輸入流和緩沖輸出流。緩沖輸入流是將從輸入流讀入的字節(jié)/字符數(shù)據(jù)先存在緩沖區(qū)中,應(yīng)用程序從緩沖區(qū)而不是從輸入流讀取數(shù)據(jù);緩沖輸出流是在進(jìn)行數(shù)據(jù)輸出時(shí)先把數(shù)據(jù)存在緩沖區(qū)中,當(dāng)緩沖區(qū)滿(mǎn)時(shí)再一次性地寫(xiě)到輸出流中。使用緩沖流可以減少應(yīng)用程序與I/O設(shè)備之間的訪(fǎng)問(wèn)次數(shù),提高傳輸效率;可以對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行按需訪(fǎng)問(wèn)和預(yù)處理,增加訪(fǎng)問(wèn)的靈活性。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第43頁(yè)。12.4.2.1緩沖輸入流包括字節(jié)緩沖輸入流BufferedInputStream類(lèi)和字符緩沖輸入流BufferedReader類(lèi)。1.字節(jié)緩沖輸入流BufferedInputStream類(lèi)先通過(guò)實(shí)體輸入流(例如FileInputStream類(lèi))對(duì)象逐一讀取字節(jié)數(shù)據(jù)并存入緩沖區(qū),應(yīng)用程序則從緩沖區(qū)中讀取數(shù)據(jù)。構(gòu)造方法:

publicBufferedInputStream(InputStream

in)publicBufferedInputStream(InputStream

in,int

size)size——指定緩沖區(qū)的大小。BufferedInputStream類(lèi)繼承自InputStream,所以該類(lèi)的方法與InputStream類(lèi)的方法相同。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第44頁(yè)。12.4.2.1緩沖輸入流與字節(jié)緩沖輸入流BufferedInputStream類(lèi)在功能和實(shí)現(xiàn)上基本相同。它只適用于字符讀入。構(gòu)造方法:

publicBufferedReader(Reader

in)publicBufferedReader(Reader

in,int

sz)BufferedReader類(lèi)繼承自Reader,所以該類(lèi)的方法與Reader類(lèi)的方法相同。

新增按行讀取的方法:StringreadLine()。該方法返回值為該行不包含結(jié)束符的字符串內(nèi)容,如果已到達(dá)流末尾,則返回null。2.字符緩沖輸入流BufferedReader類(lèi)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第45頁(yè)。12.4.2.2緩沖輸出流緩沖輸出流包括字節(jié)緩沖輸出流BufferedOutputStream類(lèi)和字符緩沖輸出流BufferedWriter類(lèi)。1.字節(jié)緩沖輸出流BufferedOutputStream類(lèi)完成輸出操作時(shí),先將字節(jié)數(shù)據(jù)寫(xiě)入緩沖區(qū),當(dāng)緩沖區(qū)滿(mǎn)時(shí),再把緩沖區(qū)中的所有數(shù)據(jù)一次性寫(xiě)到底層輸出流中。構(gòu)造方法:

publicBufferedOutputStream(OutputStream

out)publicBufferedOutputStream(OutputStream

out,int

size)BufferedOutputStream類(lèi)繼承自O(shè)utputStream,所以該類(lèi)的方法與OutputStream類(lèi)的方法相同。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第46頁(yè)。12.4.2.2緩沖輸出流與字節(jié)緩沖輸出流BufferedOutputStream類(lèi)在功能和實(shí)現(xiàn)上是相同的。只適用于字符輸出。BufferedWriter類(lèi)的構(gòu)造方法:

publicBufferedWriter(Writer

out)publicBufferedWriterr(Writer

out,int

sz)BufferedWriter類(lèi)繼承自Writer,所以該類(lèi)的方法與Writer類(lèi)的方法相同。

新增寫(xiě)行分隔符的方法:StringnewLine()行分隔符字符串由系統(tǒng)屬性line.separator定義?!纠?2.9】向指定文件寫(xiě)入內(nèi)容,并重新讀取該文件內(nèi)容。Example12_09.java2.字符緩沖輸出流BufferedWriter類(lèi)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第47頁(yè)。12.4.3隨機(jī)流隨機(jī)流RandomAccessFile類(lèi)創(chuàng)建的對(duì)象既可以作為輸入流,也可以作為輸出流,因此建立一個(gè)隨機(jī)流就可以完成讀寫(xiě)操作。RandomAccessFile類(lèi)是java.lang.Object根類(lèi)的子類(lèi)。RandomAccessFile類(lèi)的實(shí)例對(duì)象支持對(duì)隨機(jī)訪(fǎng)問(wèn)文件的讀取和寫(xiě)入。隨機(jī)流可以用于多線(xiàn)程下載或多個(gè)線(xiàn)程同時(shí)寫(xiě)數(shù)據(jù)到文件,為快速完成訪(fǎng)問(wèn)提供了便利。12.4.3.1隨機(jī)流的概念Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第48頁(yè)。12.4.3.2RandomAccessFile類(lèi)該類(lèi)中既有讀操作的方法,也有寫(xiě)操作的方法。常用方法:序號(hào)類(lèi)型方法名功能1RandomAccessFile(String

name,String

mode)參數(shù)name為待訪(fǎng)問(wèn)的文件名,file待訪(fǎng)問(wèn)的文件。參數(shù)mode為讀寫(xiě)模式,常用的值有:“r”以只讀方式打開(kāi)文件,如果進(jìn)行寫(xiě)操作會(huì)產(chǎn)生異常;“rw”:以讀寫(xiě)方式打開(kāi)文件,如果文件不存在,則創(chuàng)建2RandomAccessFile(Filefile,String

mode)3intread()從文件中讀取一個(gè)數(shù)據(jù)字節(jié)并以整數(shù)形式返回此字節(jié)4intread(byte[]

b)從文件中讀取最多b.length個(gè)數(shù)據(jù)字節(jié)到b數(shù)組中,并返回實(shí)際讀取的字節(jié)數(shù)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第49頁(yè)。12.4.3.2RandomAccessFile類(lèi)序號(hào)類(lèi)型方法名功能5intread(byte[]

b,int

off,int

len)從文件中讀取len個(gè)字節(jié)數(shù)據(jù)到b數(shù)組中。off為字節(jié)在數(shù)組中存放的地址6XXXreadXXX()從文件中讀取一個(gè)XXX類(lèi)型數(shù)據(jù),XXX包括:boolean,byte,char,short,int,lang,float,double7voidwrite(intb)寫(xiě)入指定的字節(jié)8voidwrite(byte[]b)寫(xiě)入字節(jié)數(shù)組內(nèi)容到文件9voidwriteXXX(XXXv)寫(xiě)入指定類(lèi)型數(shù)據(jù)到文件,XXX包括:boolean,byte,char,short,int,lang,float,doubleJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第50頁(yè)。12.4.3.2RandomAccessFile類(lèi)序號(hào)類(lèi)型方法名功能10voidwriteChars(Strings)寫(xiě)入字符串到文件11voidwriteUTF(Strings)按UTF_8編碼形式將字符串寫(xiě)入到文件12longgetFilePointer()獲取文件的當(dāng)前偏移量13voidseek(long

pos)設(shè)置文件的指針偏移量14longlength()獲取文件的長(zhǎng)度Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第51頁(yè)。12.4.3.2RandomAccessFile類(lèi)序號(hào)類(lèi)型方法名功能15voidsetLength(long

newLength)設(shè)置此文件的長(zhǎng)度。如果

length方法返回的文件的現(xiàn)有長(zhǎng)度大于

newLength參數(shù),則該文件將被截短。超過(guò)則加大文件,多出部分沒(méi)有內(nèi)容16intskipBytes(int

n)跳過(guò)輸入的

n個(gè)字節(jié)并丟棄跳過(guò)的字節(jié)17voidclose()關(guān)閉文件流,釋放資源【例12.10】以隨機(jī)流完成文件的讀寫(xiě)操作。Example12_10.javaJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第52頁(yè)。12.4.3.3字符串亂碼的處理由于編碼格式不同當(dāng)進(jìn)行字符串讀取的時(shí)候,有時(shí)會(huì)出現(xiàn)“亂碼”的現(xiàn)象。對(duì)字符串重新進(jìn)行編碼可以解決亂碼問(wèn)題:先讀字符串:Stringstr=in.readLine();再將字符串恢復(fù)成標(biāo)準(zhǔn)字節(jié)數(shù)組:byte[]b=str.getBytes(“iso-8859-1”);最后將字節(jié)數(shù)組按當(dāng)前機(jī)器的默認(rèn)編碼重新轉(zhuǎn)化為字符串:Stringresult=newString(b);顯式地指明編碼類(lèi)型,可以直接給出編碼類(lèi)型:Stringresult=newString(b,”GB2312”);Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第53頁(yè)。12.4.4對(duì)象流對(duì)象流是在實(shí)體流基礎(chǔ)上,通過(guò)對(duì)對(duì)象數(shù)據(jù)的處理和變換,實(shí)現(xiàn)對(duì)象的永久保存和讀取。ObjectInputStream和ObjectOutputStream分別是對(duì)象輸入流類(lèi)和對(duì)象輸出流類(lèi),它們也是InputStream和OutputStream類(lèi)的子類(lèi)。通過(guò)對(duì)象輸出流,可以把對(duì)象寫(xiě)入到文件或進(jìn)行網(wǎng)絡(luò)傳輸。對(duì)象輸入流類(lèi)可以從文件或網(wǎng)絡(luò)上,把讀取的數(shù)據(jù)還原成對(duì)象。要想實(shí)現(xiàn)對(duì)象的傳輸,待傳輸?shù)膶?duì)象要先進(jìn)行序列化處理,才能保證對(duì)象能準(zhǔn)確地保存和讀取。12.4.4.1什么是對(duì)象流Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第54頁(yè)。12.4.4.2對(duì)象的序列化對(duì)象的序列化是指把對(duì)象轉(zhuǎn)換成字節(jié)序列的過(guò)程,而把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱(chēng)為對(duì)象的反序列化。一個(gè)類(lèi)如果實(shí)現(xiàn)了java.io.Serializable接口,這個(gè)類(lèi)的實(shí)例(對(duì)象)就是一個(gè)序列化的對(duì)象。Serializable接口中沒(méi)有方法。實(shí)現(xiàn)了該接口的對(duì)象進(jìn)行輸出時(shí),JVM將按照一定的格式(序列化信息)轉(zhuǎn)換成字節(jié)進(jìn)行傳輸和存儲(chǔ)到目的地。對(duì)象輸入流從文件或網(wǎng)絡(luò)上讀取對(duì)象時(shí),會(huì)先讀取對(duì)象的序列化信息,并根據(jù)這一信息創(chuàng)建對(duì)象。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第55頁(yè)。12.4.4.3對(duì)象輸入流與對(duì)象輸出流實(shí)現(xiàn)對(duì)象的輸入操作。構(gòu)造方法:1.對(duì)象輸入流ObjectInputStream類(lèi)publicObjectInputStream(InputStream

in)類(lèi)中的方法:ObjectreadObject()從ObjectInputStream流中讀取對(duì)象。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第56頁(yè)。實(shí)現(xiàn)對(duì)象的輸出操作。構(gòu)造方法:publicObjectOutputStream(OutputStream

out)類(lèi)中的方法:voidwriteObject(Objecto)將指定對(duì)象o寫(xiě)入ObjectOutputStream流中?!纠?2.11】創(chuàng)建一個(gè)可序列化類(lèi),將該類(lèi)的對(duì)象寫(xiě)入到文件中。用對(duì)象輸入流讀取并顯示對(duì)象信息。Example12_11.java12.4.4.3對(duì)象輸入流與對(duì)象輸出流2.對(duì)象輸出流ObjectOutputStream類(lèi)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第57頁(yè)。C目錄ONTENTS12.2File類(lèi)12.3實(shí)體流12.4裝飾流12.5NIO12.6小結(jié)12.1流的概念Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第58頁(yè)。12.5NIO從JDK1.4開(kāi)始,Java提供了一系列改進(jìn)的輸入/輸出處理的新特性,被統(tǒng)稱(chēng)為NIO(即NewI/O)。在1.7版本后又增加了java.nio.file類(lèi)庫(kù),用于替代java.io.Files類(lèi)的一些操作,兩者功能基本相同,但在性能上進(jìn)行了優(yōu)化和改進(jìn)。其實(shí)現(xiàn)方法與傳統(tǒng)IO流有了一定的區(qū)別,NIO使用通道和緩沖區(qū)進(jìn)行數(shù)據(jù)傳輸和存儲(chǔ),并且一個(gè)通道既可以輸入也可以輸出,增加了靈活性。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第59頁(yè)。12.5.1java.nio.file類(lèi)庫(kù)在java.nio.file類(lèi)庫(kù)中,提供了多個(gè)類(lèi)和接口用于文件和目錄的操作和處理,其中最重要的有兩個(gè):Path接口和Files類(lèi)。Path接口是javaNIO的一部分,在java.nio.file包下。Path表示文件系統(tǒng)的路徑,可以指向文件或文件夾。Path實(shí)例的創(chuàng)建:Pathpath=Paths.get("d:\\projects\\my.txt");Pathpath=Paths.get("d:\\project","projects");Pathfile=Paths.get("d:\\project","projects\\my.txt");1.Path接口Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第60頁(yè)。12.5.1java.nio.file類(lèi)庫(kù)java.nio.file.Files類(lèi)提供操作文件的相關(guān)方法。這些方法均為靜態(tài)方法,可以直接用類(lèi)名進(jìn)行調(diào)用。通常這些類(lèi)會(huì)與Path一起使用,完成對(duì)某個(gè)文件或文件夾的操作。2.Files類(lèi)Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第61頁(yè)。12.5.1java.nio.file類(lèi)庫(kù)publicstaticPathcreateDirectory(Pathdir,FileAttribute<?>...attrs)throwsIOException說(shuō)明:創(chuàng)建一個(gè)新的目錄,attrs屬性為可選項(xiàng),用于設(shè)置屬性。publicstaticPathcreateFile(Pathdir,FileAttribute<?>...attrs)throwsIOException說(shuō)明:創(chuàng)建一個(gè)新的空文件。如果該文件已存在則創(chuàng)建失敗。publicstaticbooleanexists(Pathpath,LinkOption...options)說(shuō)明:測(cè)試文件是否存在。options參數(shù)用于指示如果文件是符號(hào)鏈接的情況下如何處理。默認(rèn)為遵循符號(hào)鏈接。Files類(lèi)常用方法:Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第62頁(yè)。12.5.1java.nio.file類(lèi)庫(kù)將一個(gè)文件內(nèi)容追加到指定文件后。Example12_12.javaFiles類(lèi)應(yīng)用舉例:Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第63頁(yè)。12.5.2NIO與IO1.面向流和面向緩沖區(qū)java.io是面向流傳輸,即通過(guò)字節(jié)流或字符流進(jìn)行操作,在數(shù)據(jù)傳輸結(jié)束前不緩存在任何地方。java.nio是面向緩沖區(qū)的,傳輸?shù)臄?shù)據(jù)都存在緩沖區(qū)中。2.阻塞和非阻塞java.io傳輸是阻塞的,即在開(kāi)始讀/寫(xiě)操作之前線(xiàn)程一直處于阻塞狀態(tài),不能做其他的事情。java.nio是非阻塞的,即線(xiàn)程不需要等待數(shù)據(jù)全部傳輸結(jié)束就可以做其他的事情,但這時(shí)只能得到當(dāng)前可用的數(shù)據(jù)。java.nio和java.io區(qū)別Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第64頁(yè)。12.5.3NIO的主要組成部分緩沖區(qū)用于緩存待發(fā)送/已接收的數(shù)據(jù),其可以看作是一個(gè)數(shù)組,用于存儲(chǔ)不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)。Buffer的基本屬性有3個(gè):position(位置)、limit(限制)、capacity(容量)。java.nio是非阻塞的,即線(xiàn)程不需要等待數(shù)據(jù)全部傳輸結(jié)束就可以做其他的事情,但這時(shí)只能得到當(dāng)前可用的數(shù)據(jù)。1.緩沖區(qū)BuffersJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第65頁(yè)。12.5.3NIO的主要組成部分Buffer屬性說(shuō)明:position:指向要讀/寫(xiě)的數(shù)據(jù)位置,可以從0開(kāi)始。該值不能大于limit。limit:限制用戶(hù)不可以讀/寫(xiě)的數(shù)據(jù)起始位置。該值不能大于capacity。capacity:緩沖區(qū)總?cè)萘浚坏┰O(shè)定不能修改。三者的大小關(guān)系:0≤position≤limit≤capacity1.緩沖區(qū)BuffersJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第66頁(yè)。12.5.3NIO的主要組成部分通道Channels用于創(chuàng)建緩沖區(qū)與外部數(shù)據(jù)源的連接通道,并實(shí)現(xiàn)數(shù)據(jù)傳輸。常用的Channel類(lèi)有:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel。通過(guò)通道類(lèi),可以實(shí)現(xiàn)文件的傳輸,也可以實(shí)現(xiàn)網(wǎng)絡(luò)TCP、UDP數(shù)據(jù)報(bào)的傳輸。2.通道ChannelsJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第67頁(yè)。12.5.3NIO的主要組成部分選擇器selector可以讓一個(gè)單線(xiàn)程處理多個(gè)Channel。要使用Selector,首先Selector注冊(cè)Channel。然后調(diào)用它的select()方法。這個(gè)方法會(huì)一直阻塞到某個(gè)注冊(cè)的通道有事件就緒。一旦這個(gè)方法返回,線(xiàn)程就可以處理這些事件,如讀入新數(shù)據(jù)等。關(guān)于Selector,我們將放在第14章進(jìn)行介紹。3.選擇器selectorJava程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第68頁(yè)。12.5.4Buffers類(lèi)Buffers緩沖區(qū)類(lèi)都放在java.nio包下面。一共有10個(gè)類(lèi),其中Buffer類(lèi)是其他類(lèi)的父類(lèi)。這里只介紹兩個(gè)類(lèi)Buffer和ByteBuffer,其他類(lèi)用法基本相同。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第69頁(yè)。12.5.4Buffers類(lèi)Buffer類(lèi)是緩沖區(qū)類(lèi)的根類(lèi),重點(diǎn)定義了緩沖區(qū)的結(jié)構(gòu)和基本方法。緩沖區(qū)既可以讀也可以寫(xiě),靈活方便。Buffer類(lèi)的主要方法:1.Buffer類(lèi)publicfinalintcapacity()說(shuō)明:返回此緩沖區(qū)的容量。當(dāng)創(chuàng)建一個(gè)緩沖區(qū)后,其容量就固定不變了。publicfinalintposition()說(shuō)明:返回此緩沖區(qū)的position指針位置。該值表示下一個(gè)可處理的數(shù)據(jù)位置。該值初始為0,隨著讀寫(xiě)操作自動(dòng)后移。publicfinalintlimit()說(shuō)明:返回緩沖區(qū)的limit限制值。該值表示當(dāng)前讀/寫(xiě)操作的最大緩沖區(qū)范圍。通常寫(xiě)操作時(shí),該值等于容量。讀操作時(shí)指向最后一個(gè)數(shù)值的后面。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第70頁(yè)。12.5.4Buffers類(lèi)publicfinalBufferclear()說(shuō)明:清除此緩沖區(qū)。在通道準(zhǔn)備讀取數(shù)據(jù)到緩沖區(qū)時(shí)先行調(diào)用。這時(shí),position值設(shè)為0,limit值設(shè)為capacity,等待將讀取的數(shù)據(jù)存入緩沖區(qū)。Buffer類(lèi)的主要方法:publicfinalBufferflip()說(shuō)明:反轉(zhuǎn)此緩沖區(qū)。該方法通常在準(zhǔn)備將緩沖區(qū)中的數(shù)據(jù)寫(xiě)入到通道時(shí)先行調(diào)用。這時(shí),將limit值設(shè)為當(dāng)前position值,指向當(dāng)前緩沖區(qū)中的最后一個(gè)有效數(shù)據(jù);然后將position設(shè)為0,指向首個(gè)要輸出的數(shù)據(jù)。如果已定義了標(biāo)記,則丟棄該標(biāo)記。publicfinalBufferrewind()說(shuō)明:重置此緩沖區(qū)。該方法通常用于重新完成讀/寫(xiě)操作。其將position值重設(shè)為0,其他屬性值不變。并丟棄標(biāo)記。Java程序設(shè)計(jì)教程-第2版-第12章-輸入輸出流全文共78頁(yè),當(dāng)前為第71頁(yè)。12.5.4Buffers類(lèi)ByteBuffer類(lèi)用于定義一個(gè)以字節(jié)為單位的緩沖區(qū),實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和訪(fǎng)問(wèn)。2.ByteBuffer類(lèi)返回類(lèi)型方法名方法功能staticByteBufferallocate(intcapacity)分配一個(gè)新的字節(jié)緩沖區(qū)。staticByteBufferallocateDirect(intcapacity)分配一個(gè)新的直接字節(jié)緩沖區(qū)CharBufferasCharBuffer()創(chuàng)建一個(gè)字節(jié)緩沖區(qū)作為char緩沖區(qū)的視圖。ByteBufferasReadOnlyBuffer()創(chuàng)建一個(gè)新的只讀字節(jié)緩沖區(qū),共享此緩沖區(qū)的內(nèi)容。ByteBuff

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論