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

下載本文檔

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

文檔簡介

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

文件對(duì)象與文件屬性類型方法名功能File(String

filename)在當(dāng)前路徑下,創(chuàng)建一個(gè)名字為filename的文件File(Stringpath,Stringfilename)在給定的path路徑下,創(chuàng)建一個(gè)名字為filename的文件StringgetName()獲取此文件(目錄)的名稱StringgetPath()獲取路徑名字符串StringgetAbsolutePath()獲取路徑名的絕對(duì)路徑名字符串longlength()獲取文件的長度。如果表示目錄,則返回值不確定booleancanRead()判斷文件是否可讀文件用文件類的對(duì)象表示,有了文件對(duì)象就可以獲取文件的屬性。12.2.1文件對(duì)象與文件屬性【例12.1】讀取給定文件的相關(guān)屬性,如果該文件不存在則創(chuàng)建該文件。Example12_01.java類型方法名功能booleancanWrite()判斷文件是否可寫booleancanExecute()判斷文件是否執(zhí)行booleanexists()判斷文件(目錄)是否存在booleanisFile()判斷文件是否是一個(gè)標(biāo)準(zhǔn)文件booleanisDirectory()判斷文件是否是一個(gè)目錄booleanisHidden()判讀文件是否是一個(gè)隱藏文件longlastModified()獲取文件最后一次被修改的時(shí)間12.2.2目錄類型方法名功能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)獲取滿足指定過濾器條件的字符串表示形式的文件名和目錄名Java把目錄作為一種特殊的文件進(jìn)行處理,它除了具備文件的基本屬性如文件名、所在路徑等信息以外,同時(shí)也提供了專用于目錄的一些操作方法。12.2.2目錄類型方法名功能File[]listFiles()獲取目錄下文件類型表示形式的文件名和目錄名File[]listFiles(FileFilter

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

filter)獲取滿足指定過濾器路徑和文件條件的文件表示形式的文件名和目錄名【例12.2】列出給定目錄下的所有文件名,并列出給定擴(kuò)展名的所有文件名。Example12_02.java12.2.3

文件的操作1.創(chuàng)建文件File類的方法:

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

Filefile=newFile(“D:\\”,”hello.txt”);然后使用語句:file.createNewFile();就可以創(chuàng)建文件。

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

file.delete();刪除。12.2.3

文件的操作2.刪除文件File類中的方法:

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

Processexec(Stringcommand);需要使用java.lang.Runtime類。首先利用Runtime類的靜態(tài)方法創(chuàng)建一個(gè)Runtime對(duì)象:方法執(zhí)行本地的命令,參數(shù)command為指定的系統(tǒng)命令。12.2.3

文件的操作3.運(yùn)行可執(zhí)行文件【例12.3】調(diào)用記事本命令,打開一個(gè)新記事本。Example12_03.java12.2.4Scanner類與文件

Scannerinput=newScanner(文件類對(duì)象);創(chuàng)建的Scanner類的對(duì)象使用read()方法即可從文件中讀數(shù)據(jù)。讀數(shù)據(jù)時(shí)默認(rèn)以空格作為數(shù)據(jù)的分隔標(biāo)記。利用Scanner類的對(duì)象,可以從文件中讀取數(shù)據(jù):【例12.4】有一個(gè)購物清單:電視機(jī)3200.00元,智能手機(jī)2200.00元,筆記本4200.00元,午餐120.25元。統(tǒng)計(jì)該次購物共花費(fèi)多少?該購物清單存放在一個(gè)文件record.txt中。Example12_04.javaC目錄ONTENTS12.2File類12.3實(shí)體流12.4裝飾流12.5NIO12.6小結(jié)12.1流的概念12.3.1字節(jié)流抽象類InputStream和抽象類OutputStream是所有字節(jié)流類的根類,其他字節(jié)流類都繼承自這兩個(gè)類。字節(jié)輸入流的作用是從數(shù)據(jù)輸入源(例如從磁盤、網(wǎng)絡(luò)等)獲取字節(jié)數(shù)據(jù)到應(yīng)用程序(內(nèi)存)中。1.字節(jié)輸入流InputStream類型方法名功能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開始的位置,并返回實(shí)際讀入的字節(jié)數(shù);如果off+len大于b.length,或者off和len中有一個(gè)是負(fù)數(shù),那么會(huì)拋出IndexOutOfBoundsException異常longskip(longn)從輸入流中跳過并丟棄n個(gè)字節(jié),并返回實(shí)際跳過的字節(jié)數(shù)12.3.1字節(jié)流1.字節(jié)輸入流InputStream類型方法名功能voidclose()關(guān)閉輸入流,釋放資源。對(duì)流的讀取完畢后調(diào)用該方法以釋放資源intavailable()返回此輸入流可以讀取(或跳過)的估計(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()測試此輸入流是否支持mark和reset方法。只有帶緩存的輸入流支持標(biāo)記功能12.3.1字節(jié)流1.字節(jié)輸入流InputStreampublicFileInputStream(File

file)throwsFileNotFoundExceptionpublicFileInputStream(String

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

publicFileOutputStream(File

file)throwsIOExceptionpublicFileOutnputStream(String

name)throwsIOExceptionpublicFileOutputStream(File

file,boolean

append)throwsIOExceptionpublicFileOutputStream(Stringname,boolean

append)throwsIOException在進(jìn)行字節(jié)輸出流操作時(shí),經(jīng)常使用的是OutputStream類的子類FileOutputStream,用于將數(shù)據(jù)寫入File或其他的輸出流。FileOutputStream類的常用構(gòu)造方法:12.3.1字節(jié)流4.文件字節(jié)輸出流類FileOutputStream字節(jié)輸出流寫數(shù)據(jù)步驟:設(shè)定輸出流的目的地01OPTION02OPTION03OPTION04OPTION創(chuàng)建指向這目的地輸出向輸出流中寫入數(shù)據(jù)關(guān)閉輸出流12.3.1字節(jié)流4.文件字節(jié)輸出流類FileOutputStream12.3.1字節(jié)流4.文件字節(jié)輸出流類FileOutputStream在完成寫操作過程中,系統(tǒng)會(huì)將數(shù)據(jù)暫存到緩沖區(qū)中,緩沖區(qū)存滿后再一次性寫入到輸出流中。執(zhí)行close()方法時(shí),不管緩沖區(qū)是否已滿,都會(huì)把其中的數(shù)據(jù)寫到輸出流?!纠?2.6】向一個(gè)磁盤文件中寫入數(shù)據(jù),第二次寫操作采用追加方式完成。Example12_06.java12.3.2字符流字符流通常用于文本文件的傳輸。抽象類Reader和抽象類Writer是所有字符流類的根類,其他字符流類都繼承自這兩個(gè)類。其中一些子類還在傳輸過程中對(duì)數(shù)據(jù)做了進(jìn)一步處理以方便用戶的使用。12.3.2字符流字符輸入流Reader是所有字符輸入流類的父類,實(shí)現(xiàn)從數(shù)據(jù)源讀入字符數(shù)據(jù)。常用方法有:類型方法名功能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.字符輸入流Reader12.3.2字符流類型方法名功能longskip(long

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

readAheadLimit)標(biāo)記流中的當(dāng)前位置voidreset()重置該流booleanmarkSupported()判斷此流是否支持mark()操作voidclose()關(guān)閉該流,釋放資源1.字符輸入流ReaderpublicFileReader(File

file)throwsFileNotFoundExceptionpublicFileReader(String

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

str)將字符串寫到輸出流voidwrite(Stringstr,intoff,intlen)從字符串str的off處開始取len個(gè)字符數(shù)據(jù)寫到輸出流voidflush()強(qiáng)制將輸出流保存在緩沖區(qū)中的數(shù)據(jù)寫到輸出voidclose()關(guān)閉輸出流,釋放資源字符輸出流Writer用于將字符數(shù)據(jù)輸出到目的地。類Writer的常用方法:12.3.2字符流3.字符輸出流類WriterFileWriter類和字節(jié)流FileOutputStream類相對(duì)應(yīng),實(shí)現(xiàn)字符的輸出操作,實(shí)現(xiàn)方法也基本相同。FileWriter類的常用構(gòu)造方法:12.3.2字符流4.文件字符輸出流FileWriter類publicFileWriter(File

file)throwsIOExceptionpublicFileWriter(String

name)throwsIOExceptionpublicFileWriter(File

file,boolean

append)throwsIOExceptionpublicFileWriter(Stringname,boolean

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

數(shù)據(jù)輸入流類型方法名功能DataInputStream(InputStream

in)使用指定的實(shí)體流InputStream創(chuàng)建一個(gè)DataInputStream。booleanreadBoolean()讀取一個(gè)布爾值bytereadByte()讀取一個(gè)字節(jié)charreadChar()讀取一個(gè)字符longreadLong()讀取一個(gè)長整型數(shù)intreadInt()讀取一個(gè)整數(shù)類型方法名功能shortreadShort()讀取一個(gè)短整型數(shù)floatreadFloat()讀取一個(gè)Float數(shù)doublereadDouble()讀取一個(gè)Double數(shù)StringreadUTF()讀取一個(gè)UTF字符串intskipBytes(int

n)跳過并丟棄n個(gè)字節(jié),返回實(shí)際跳過的字節(jié)數(shù)

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

數(shù)據(jù)輸出流數(shù)據(jù)輸出流DataOutputStream類允許程序以適當(dāng)方式將基本Java數(shù)據(jù)類型寫入輸出流中。DataOutputStream類的常用方法:類型方法名功能DataOuputStream(OutputStream

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

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

s)將字符串按字符順序?qū)懗龅捷敵隽鱲oidwriteLong(longv)將一個(gè)長整型數(shù)寫出到輸出流類型方法名功能voidwriteInt(intv)將一個(gè)整數(shù)寫出到輸出流voidwriteShort(intv)將一個(gè)短整型數(shù)寫出到輸出流voidwriteFloat(floatv)將一個(gè)Float數(shù)寫出到輸出流voidwriteDouble(doublev)將一個(gè)Double數(shù)寫出到輸出流voidwriteUTF(Strings)將一個(gè)字符串用UTF_8編碼形式寫出到輸出流intsize()返回寫到數(shù)據(jù)輸出流中的字節(jié)數(shù)voidflush()清空輸出流,使所有緩沖中的字節(jié)被寫出到流中

數(shù)據(jù)輸出流【例12.8】將幾個(gè)Java基本數(shù)據(jù)類型的數(shù)據(jù)寫入到一個(gè)文件中,再將之讀出來后顯示出來。Example12_08.java12.4.2緩沖流緩沖流是在實(shí)體I/O流基礎(chǔ)上增加一個(gè)緩沖區(qū),應(yīng)用程序和I/O設(shè)備之間的數(shù)據(jù)傳輸都要經(jīng)過緩沖區(qū)來進(jìn)行。緩沖流分為緩沖輸入流和緩沖輸出流。緩沖輸入流是將從輸入流讀入的字節(jié)/字符數(shù)據(jù)先存在緩沖區(qū)中,應(yīng)用程序從緩沖區(qū)而不是從輸入流讀取數(shù)據(jù);緩沖輸出流是在進(jìn)行數(shù)據(jù)輸出時(shí)先把數(shù)據(jù)存在緩沖區(qū)中,當(dāng)緩沖區(qū)滿時(shí)再一次性地寫到輸出流中。使用緩沖流可以減少應(yīng)用程序與I/O設(shè)備之間的訪問次數(shù),提高傳輸效率;可以對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行按需訪問和預(yù)處理,增加訪問的靈活性。

緩沖輸入流包括字節(jié)緩沖輸入流BufferedInputStream類和字符緩沖輸入流BufferedReader類。1.字節(jié)緩沖輸入流BufferedInputStream類先通過實(shí)體輸入流(例如FileInputStream類)對(duì)象逐一讀取字節(jié)數(shù)據(jù)并存入緩沖區(qū),應(yīng)用程序則從緩沖區(qū)中讀取數(shù)據(jù)。構(gòu)造方法:

publicBufferedInputStream(InputStream

in)publicBufferedInputStream(InputStream

in,int

size)size——指定緩沖區(qū)的大小。BufferedInputStream類繼承自InputStream,所以該類的方法與InputStream類的方法相同。

緩沖輸入流與字節(jié)緩沖輸入流BufferedInputStream類在功能和實(shí)現(xiàn)上基本相同。它只適用于字符讀入。構(gòu)造方法:

publicBufferedReader(Reader

in)publicBufferedReader(Reader

in,int

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

新增按行讀取的方法:StringreadLine()。該方法返回值為該行不包含結(jié)束符的字符串內(nèi)容,如果已到達(dá)流末尾,則返回null。2.字符緩沖輸入流BufferedReader類

緩沖輸出流緩沖輸出流包括字節(jié)緩沖輸出流BufferedOutputStream類和字符緩沖輸出流BufferedWriter類。1.字節(jié)緩沖輸出流BufferedOutputStream類完成輸出操作時(shí),先將字節(jié)數(shù)據(jù)寫入緩沖區(qū),當(dāng)緩沖區(qū)滿時(shí),再把緩沖區(qū)中的所有數(shù)據(jù)一次性寫到底層輸出流中。構(gòu)造方法:

publicBufferedOutputStream(OutputStream

out)publicBufferedOutputStream(OutputStream

out,int

size)BufferedOutputStream類繼承自O(shè)utputStream,所以該類的方法與OutputStream類的方法相同。

緩沖輸出流與字節(jié)緩沖輸出流BufferedOutputStream類在功能和實(shí)現(xiàn)上是相同的。只適用于字符輸出。BufferedWriter類的構(gòu)造方法:

publicBufferedWriter(Writer

out)publicBufferedWriterr(Writer

out,int

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

新增寫行分隔符的方法:StringnewLine()行分隔符字符串由系統(tǒng)屬性line.separator定義。【例12.9】向指定文件寫入內(nèi)容,并重新讀取該文件內(nèi)容。Example12_09.java2.字符緩沖輸出流BufferedWriter類12.4.3隨機(jī)流隨機(jī)流RandomAccessFile類創(chuàng)建的對(duì)象既可以作為輸入流,也可以作為輸出流,因此建立一個(gè)隨機(jī)流就可以完成讀寫操作。RandomAccessFile類是java.lang.Object根類的子類。RandomAccessFile類的實(shí)例對(duì)象支持對(duì)隨機(jī)訪問文件的讀取和寫入。隨機(jī)流可以用于多線程下載或多個(gè)線程同時(shí)寫數(shù)據(jù)到文件,為快速完成訪問提供了便利。

隨機(jī)流的概念

RandomAccessFile類該類中既有讀操作的方法,也有寫操作的方法。常用方法:序號(hào)類型方法名功能1RandomAccessFile(String

name,String

mode)參數(shù)name為待訪問的文件名,file待訪問的文件。參數(shù)mode為讀寫模式,常用的值有:“r”以只讀方式打開文件,如果進(jìn)行寫操作會(huì)產(chǎn)生異常;“rw”:以讀寫方式打開文件,如果文件不存在,則創(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ù)

RandomAccessFile類序號(hào)類型方法名功能5intread(byte[]

b,int

off,int

len)從文件中讀取len個(gè)字節(jié)數(shù)據(jù)到b數(shù)組中。off為字節(jié)在數(shù)組中存放的地址6XXXreadXXX()從文件中讀取一個(gè)XXX類型數(shù)據(jù),XXX包括:boolean,byte,char,short,int,lang,float,double7voidwrite(intb)寫入指定的字節(jié)8voidwrite(byte[]b)寫入字節(jié)數(shù)組內(nèi)容到文件9voidwriteXXX(XXXv)寫入指定類型數(shù)據(jù)到文件,XXX包括:boolean,byte,char,short,int,lang,float,double

RandomAccessFile類序號(hào)類型方法名功能10voidwriteChars(Strings)寫入字符串到文件11voidwriteUTF(Strings)按UTF_8編碼形式將字符串寫入到文件12longgetFilePointer()獲取文件的當(dāng)前偏移量13voidseek(long

pos)設(shè)置文件的指針偏移量14longlength()獲取文件的長度

RandomAccessFile類序號(hào)類型方法名功能15voidsetLength(long

newLength)設(shè)置此文件的長度。如果length方法返回的文件的現(xiàn)有長度大于newLength參數(shù),則該文件將被截短。超過則加大文件,多出部分沒有內(nèi)容16intskipBytes(int

n)跳過輸入的n個(gè)字節(jié)并丟棄跳過的字節(jié)17voidclose()關(guān)閉文件流,釋放資源【例12.10】以隨機(jī)流完成文件的讀寫操作。Example12_10.java

字符串亂碼的處理由于編碼格式不同當(dāng)進(jìn)行字符串讀取的時(shí)候,有時(shí)會(huì)出現(xiàn)“亂碼”的現(xiàn)象。對(duì)字符串重新進(jì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);顯式地指明編碼類型,可以直接給出編碼類型:Stringresult=newString(b,”GB2312”);12.4.4對(duì)象流對(duì)象流是在實(shí)體流基礎(chǔ)上,通過對(duì)對(duì)象數(shù)據(jù)的處理和變換,實(shí)現(xiàn)對(duì)象的永久保存和讀取。ObjectInputStream和ObjectOutputStream分別是對(duì)象輸入流類和對(duì)象輸出流類,它們也是InputStream和OutputStream類的子類。通過對(duì)象輸出流,可以把對(duì)象寫入到文件或進(jìn)行網(wǎng)絡(luò)傳輸。對(duì)象輸入流類可以從文件或網(wǎng)絡(luò)上,把讀取的數(shù)據(jù)還原成對(duì)象。要想實(shí)現(xiàn)對(duì)象的傳輸,待傳輸?shù)膶?duì)象要先進(jìn)行序列化處理,才能保證對(duì)象能準(zhǔn)確地保存和讀取。

什么是對(duì)象流

對(duì)象的序列化對(duì)象的序列化是指把對(duì)象轉(zhuǎn)換成字節(jié)序列的過程,而把字節(jié)序列恢復(fù)為對(duì)象的過程稱為對(duì)象的反序列化。一個(gè)類如果實(shí)現(xiàn)了java.io.Serializable接口,這個(gè)類的實(shí)例(對(duì)象)就是一個(gè)序列化的對(duì)象。Serializable接口中沒有方法。實(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ì)象。

對(duì)象輸入流與對(duì)象輸出流實(shí)現(xiàn)對(duì)象的輸入操作。構(gòu)造方法:1.對(duì)象輸入流ObjectInputStream類publicObjectInputStream(InputStream

in)類中的方法:ObjectreadObject()從ObjectInputStream流中讀取對(duì)象。實(shí)現(xiàn)對(duì)象的輸出操作。構(gòu)造方法:publicObjectOutputStream(OutputStream

out)類中的方法:voidwriteObject(Objecto)將指定對(duì)象o寫入ObjectOutputStream流中?!纠?2.11】創(chuàng)建一個(gè)可序列化類,將該類的對(duì)象寫入到文件中。用對(duì)象輸入流讀取并顯示對(duì)象信息。Example12_11.java

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

溫馨提示

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