基于任務(wù)驅(qū)動模式的Java程序設(shè)計(左國才 西電版)第九章 輸入輸出處理_第1頁
基于任務(wù)驅(qū)動模式的Java程序設(shè)計(左國才 西電版)第九章 輸入輸出處理_第2頁
基于任務(wù)驅(qū)動模式的Java程序設(shè)計(左國才 西電版)第九章 輸入輸出處理_第3頁
基于任務(wù)驅(qū)動模式的Java程序設(shè)計(左國才 西電版)第九章 輸入輸出處理_第4頁
基于任務(wù)驅(qū)動模式的Java程序設(shè)計(左國才 西電版)第九章 輸入輸出處理_第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

掌握J(rèn)ava語言的根本語法成分及其語法結(jié)構(gòu)是進(jìn)行Java程序設(shè)計的前提條件。本章主要介紹標(biāo)識符、數(shù)據(jù)類型、運算符、表達(dá)式、Java編碼標(biāo)準(zhǔn)和格式等內(nèi)容。第九章輸入/輸出處理一、輸入/輸出流的概述二、輸入/輸出流的分類三、字節(jié)流四、字符流五、InputStream與Reader的差異以及OutputStream與Writer的差異第一節(jié)輸入/輸出流的概述Java中I/O操作主要是指使用Java進(jìn)行輸入/輸出操作。Java所有的I/O機制都是基于數(shù)據(jù)流進(jìn)行輸入/輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動序列。Java的I/O流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法。任何Java中表示數(shù)據(jù)源的對象都會提供以數(shù)據(jù)流的方式讀寫數(shù)據(jù)的方法。數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合,就像水管里的水流,即數(shù)據(jù)可以分段輸入,從而按先后順序形成一個長的數(shù)據(jù)流。對讀取程序來說,看不到數(shù)據(jù)流在輸入時的分段情況,每次只可以按次序讀取其中的數(shù)據(jù),不管輸入時是將數(shù)據(jù)分屢次輸入,還是一次輸入,讀取時的效果都是完全一樣的。第一節(jié)輸入/輸出流的概述輸入/輸出流的概述一、輸入/輸出流的概念Jdk提供了包java.io,其中包括一系列的類來實現(xiàn)輸入/輸出處理。Java語言中定義了兩種類型的流:字節(jié)類和字符類。字節(jié)流(ByteStream)為字節(jié)的輸入和輸出處理提供了方法。例如,使用字節(jié)流來讀取或書寫二進(jìn)制數(shù)據(jù)。字符流(CharacterStream)為字符的輸入和輸出處理提供了方便。第一節(jié)輸入/輸出流的概述二、輸入/輸出類層次從InputStream和OutputStream派生出來的一系列類。這類流以字節(jié)(Byte)為根本處理單位。(1)?InputStream類。InputStream類可以完成最根本的從輸入流讀取數(shù)據(jù)的功能,是所有字節(jié)輸入流的父類,它的多個子類可查看9.2節(jié)。根據(jù)輸入數(shù)據(jù)的不同形式,可以創(chuàng)立一個適當(dāng)?shù)腎nputStream的子類對象來完成輸入。這些子類對象也繼承了InputStream類的方法,其中常用的方法如下:①讀數(shù)據(jù)的方法。intread():從輸入流中讀取一個字節(jié),并返回此字節(jié)的ASCII碼值,范圍在0~255之間,該方法的屬性為abstract,必須被子類實現(xiàn)。第一節(jié)輸入/輸出流的概述1.字節(jié)流intread(byte[]b):從輸入流中讀取長度為b.length的數(shù)據(jù),寫入字節(jié)數(shù)組b中,并返回讀取的字節(jié)數(shù)。intread(byte[]b,intoff,intlen):從輸入流中讀取長度為len的數(shù)據(jù),寫入字節(jié)數(shù)組b中,并從索引off開始的位置返回讀取的字節(jié)數(shù)。intavailable():返回從輸入流中可以讀取的字節(jié)數(shù)。longskip(longn):從輸入流當(dāng)前讀取位置向前移動n個字節(jié),并返回實際跳過的字節(jié)數(shù)。第一節(jié)輸入/輸出流的概述②標(biāo)記流的方法。voidmark(intreadlimit):在輸入流的當(dāng)前讀取位置作標(biāo)記。從該位置開始讀取由readlimit指定的數(shù)據(jù)后,標(biāo)記失效。voidreset():重置輸入流的讀取位置為mark()所標(biāo)記的位置。booleanmarkSuppposed():判斷輸入流是否支持mark()和reset()。voidclose():關(guān)閉并釋放與該流相關(guān)的系統(tǒng)資源。第一節(jié)輸入/輸出流的概述(2)?OutputStream類。OutputStream類可以完成最根本的輸出數(shù)據(jù)的功能,是所有字節(jié)輸出流的父類,它的多個子類可查看9.2節(jié)。根據(jù)輸出數(shù)據(jù)的不同形式,可以創(chuàng)立一個適當(dāng)?shù)腛utputStream的子類對象來完成輸出。這些子類對象也繼承了OutputStream類的方法,其中常用的方法如下:①輸出數(shù)據(jù)的方法。voidwrite(intb):將指定的字節(jié)b寫入輸出流。該方法的屬性為abstract,必須被子類所實現(xiàn)。參數(shù)中的b為int類型,如果b的值大于255,那么只輸出它的低位字節(jié)所表示的值。intwrite(byte[]b):把字節(jié)數(shù)組b中的b.length個字節(jié)寫入輸出流。intwrite(byte[]b,intoff,intlen):把字節(jié)數(shù)組b中從索引off開始的len個字節(jié)寫入輸出流。第一節(jié)輸入/輸出流的概述②刷新和關(guān)閉流的方法。flush():刷新輸出流,并輸出所有被緩存的字節(jié)。close():關(guān)閉輸出流,也可以由運行時系統(tǒng)在對流對象進(jìn)行垃圾收集時隱式關(guān)閉輸出流。第一節(jié)輸入/輸出流的概述從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為根本處理單位。(1)?Reader類。Reader類中包含了許多字符輸入流的常用方法,是所有字符輸入流的父類,根據(jù)需要輸入的數(shù)據(jù)類型的不同,可以創(chuàng)立適當(dāng)?shù)腞eader類的子類對象來完成輸入操作。第一節(jié)輸入/輸出流的概述2.字符流這些子類也繼承了Reader類的方法,其中常用的方法如下:①讀取數(shù)據(jù)的方法。intread():讀取一個字符。intread(charcbuf[]):讀取一系列字符到數(shù)組cbuf[]中。intread(charch[],intoff,intlen):讀取len個字符,從數(shù)組ch[]的下標(biāo)off處開始存放,該方法必須由子類實現(xiàn)。②標(biāo)記和關(guān)閉流的方法與InputStream類相同。第一節(jié)輸入/輸出流的概述(2)?Writer類。Writer類中包含了一系列字符輸出流需要的方法,可以完成最根本的輸出數(shù)據(jù)到輸出流的功能,是所有字符輸出流的父類。根據(jù)輸出的數(shù)據(jù)類型的不同,可以創(chuàng)立適當(dāng)?shù)腤riter類的子類對象來完成數(shù)據(jù)的輸出。這些子類也繼承了Writer類的方法,其中常用的方法如下:①輸出數(shù)據(jù)的方法。voidwrite(intc):將指定的整型值c的低16位寫入輸出流。voidwrite(charch[]):將字符數(shù)組ch[]中的ch.length個字符寫入輸出流。第一節(jié)輸入/輸出流的概述voidwrite(charch[],intoff,intlen):將字符數(shù)組ch[]中的從索引off開始的len個字符寫入輸出流。voidwrite(Stringstr):將字符串str中的字符寫入輸出流。voidwrite(Stringstr,intoff,intlen):將字符串str中從索引off處開始的len個字符寫入輸出流。②刷新和關(guān)閉流的方法與OutputStream類相似。第一節(jié)輸入/輸出流的概述Java程序可通過命令行參數(shù)與外界進(jìn)行簡短的信息交換,同時,也規(guī)定了與標(biāo)準(zhǔn)輸入/輸出設(shè)備,如鍵盤、顯示器進(jìn)行信息交換的方式。通過文件可以與外界進(jìn)行任意數(shù)據(jù)形式的信息交換。第一節(jié)輸入/輸出流的概述三、標(biāo)準(zhǔn)輸入/輸出System.out向標(biāo)準(zhǔn)輸出設(shè)備輸出數(shù)據(jù),其數(shù)據(jù)類型為PrintStream。標(biāo)準(zhǔn)輸出流中的常用方法有:Voidprint(參數(shù))和Voidprintln(參數(shù))。第一節(jié)輸入/輸出流的概述1.標(biāo)準(zhǔn)輸出流System.outSystem.in讀取標(biāo)準(zhǔn)輸入設(shè)備數(shù)據(jù)(從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù),一般是鍵盤),其數(shù)據(jù)類型為InputStream。標(biāo)準(zhǔn)輸入流中的常用方法如下:intread():返回ASCII碼。假設(shè)返回值=-1,那么說明沒有讀取到任何字節(jié),讀取工作結(jié)束。intread(byte[]b):讀入多個字節(jié)到緩沖區(qū)b中,返回值是讀入的字節(jié)數(shù)。第一節(jié)輸入/輸出流的概述2.標(biāo)準(zhǔn)輸入流System.in【例如9.1】從鍵盤輸入字符串并輸出。importjava.io.*;publicclassStandardInputOutput{publicstaticvoidmain(Stringargs[]){intb;try{System.out.println("pleaseInput:");while((b=System.in.read())!=-1){第一節(jié)輸入/輸出流的概述System.out.print((char)b);}}catch(IOExceptione){System.out.println(e.toString());}}}等待鍵盤輸入,鍵盤輸入什么就打印出什么,程序如下:pleaseinput:asdfghjasdfghj第一節(jié)輸入/輸出流的概述System.err輸出標(biāo)準(zhǔn)錯誤,其數(shù)據(jù)類型為PrintStream,可查閱API獲得詳細(xì)說明。標(biāo)準(zhǔn)輸出通過System.out調(diào)用println方法輸出參數(shù)并換行,而print方法輸出參數(shù)但不換行。println或print方法都通過重載實現(xiàn)了輸出根本數(shù)據(jù)類型的多個方法,包括輸出參數(shù)類型為boolean、char、int、long、float和double的方法。同時,也重載實現(xiàn)了輸出參數(shù)類型為char[]、String和Object的方法。其中,print(Object)和println(Object)方法在運行時將調(diào)用參數(shù)Object的toString方法。第一節(jié)輸入/輸出流的概述3.標(biāo)準(zhǔn)錯誤流【例如9.2】創(chuàng)立緩沖區(qū)閱讀器,從鍵盤逐行讀入數(shù)據(jù)。importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;

publicclassStandardInputOutput{publicstaticvoidmain(Stringargs[]){Strings;第一節(jié)輸入/輸出流的概述//創(chuàng)立緩沖區(qū)閱讀器,從鍵盤逐行讀入數(shù)據(jù)InputStreamReaderir=newInputStreamReader(System.in);BufferedReaderin=newBufferedReader(ir);System.out.println("Unix系統(tǒng):ctrl-d或ctrl-c退出"+"\nWindows系統(tǒng):ctrl-z退出");try{//讀一行數(shù)據(jù),并標(biāo)準(zhǔn)輸出至顯示器s=in.readLine();//readLine()方法運行時假設(shè)發(fā)生I/O錯誤,將拋出IOException異常while(s!=null){第一節(jié)輸入/輸出流的概述System.out.println("Read:"+s);s=in.readLine();}//關(guān)閉緩沖閱讀器

in.close();}catch(IOExceptione){//CatchanyIOexceptions.e.printStackTrace();}}}第一節(jié)輸入/輸出流的概述第二節(jié)Java語言概述第二節(jié)輸入/輸出流的分類java.io包中包含了I/O流所需要的所有類。在java.io包中有四個根本類:InputStream、OutputStream、Reader及Writer類,它們分別處理字節(jié)流和字符流,如表9.1所示。第二節(jié)輸入/輸出流的分類輸入/輸出流的分類一、I/O流的四個根本類表9.1根本數(shù)據(jù)流的I/O輸入/輸出字節(jié)流字符流輸入流InputstreamReader輸出流OutputStreamWriterJava中其他多種多樣變化的流均是由它們派生出來的,如圖9.1~圖9.4所示。第二節(jié)輸入/輸出流的分類圖9.1InputStream類子類結(jié)構(gòu)圖9.2OutputStream類子類結(jié)構(gòu)圖9.3Reader類子類結(jié)構(gòu)圖9.4Writer類子類結(jié)構(gòu)在java.io包中,java.io.InputStream表示字節(jié)輸入流,表示字節(jié)輸出流,處于java.io包最頂層。這兩個類均為抽象類,也就是說,它們不能被實例化,必須生成子類之后才能實現(xiàn)一定的功能。第二節(jié)輸入/輸出流的分類1)?Memory(1)從/向內(nèi)存數(shù)組讀寫數(shù)據(jù):CharArrayReader、CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream。(2)從/向內(nèi)存字符串讀寫數(shù)據(jù):StringReader、StringWriter、StringBufferInputStream。第二節(jié)輸入/輸出流的分類二、I/O流的具體分類1.按類型分類2)?Pipe管道實現(xiàn)管道的輸入和輸出(進(jìn)程間通信):PipedReader、PipedWriter、PipedInputStream、PipedOutputStream。3)?File文件流對文件進(jìn)行讀、寫操作:FileReader、FileWriter、FileInputStream、FileOutputStream。4)?ObjectSerialization對象輸入、輸出:ObjectInputStream、ObjectOutputStream。5)?DataConversion數(shù)據(jù)流按根本數(shù)據(jù)類型讀、寫(處理的數(shù)據(jù)是Java的根本類型(如布爾型、字節(jié)、整數(shù)和浮點數(shù))):DataInputStream、DataOutputStream第二節(jié)輸入/輸出流的分類6)?Printing包含方便的打印方法:PrintWriter、PrintStream。7)?Buffering緩沖在讀入或?qū)懗鰰r,對數(shù)據(jù)進(jìn)行緩存,以減少I/O的次數(shù):BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream。8)?Filtering濾流在數(shù)據(jù)進(jìn)行讀或?qū)憰r進(jìn)行過濾:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream。9)?Concatenation合并輸入并把多個輸入流連接成一個輸入流SequenceInputStream。第二節(jié)輸入/輸出流的分類10)?Counting計數(shù)在讀入數(shù)據(jù)時對行記數(shù):LineNumberReader、LineNumberInputStream。11)?PeekingAhead通過緩存機制,進(jìn)行預(yù)讀:PushbackReader、PushbackInputStream。12)?ConvertingbetweenBytesandCharacters按照一定的編碼/解碼標(biāo)準(zhǔn)將字節(jié)流轉(zhuǎn)換為字符流,或進(jìn)行反向轉(zhuǎn)換(Stream到Reader、Writer的轉(zhuǎn)換類):InputStreamReader、OutputStreamWriter。第二節(jié)輸入/輸出流的分類(1)?File(文件):FileInputStream、FileOutputStream、FileReader、FileWriter。(2)?byte[]:ByteArrayInputStream、ByteArrayOutputStream。(3)?Char[]:CharArrayReader、CharArrayWriter。(4)?String:StringBufferInputStream、StringReader、StringWriter。(5)?網(wǎng)絡(luò)數(shù)據(jù)流:InputStream、OutputStream、Reader、Writer。第二節(jié)輸入/輸出流的分類2.按數(shù)據(jù)來源(去向)分類第三節(jié)Java語言概述第三節(jié)字節(jié)流InputStream為字節(jié)輸入流,它本身為一個抽象類,必須依靠其子類實現(xiàn)各種功能,此抽象類是表示字節(jié)輸入流的所有類的超類。繼承自InputStream的流都是向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位為字節(jié)(8個bit);InputStream是輸入字節(jié)數(shù)據(jù)用的類,所以InputStream類提供了三種重載的read方法。InputStream類中的常用方法如下:第三節(jié)字節(jié)流字節(jié)流一、InputStream抽象類(1)?publicabstractintread():讀取一個byte的數(shù)據(jù),返回值是高位補0的int類型值。假設(shè)返回值=-1,說明沒有讀取到任何字節(jié),讀取工作結(jié)束。(2)?publicintread(byteb[]):讀取b.length個字節(jié)的數(shù)據(jù)放到b數(shù)組中,返回值是讀取的字節(jié)數(shù)。該方法實際上是調(diào)用下一個方法來實現(xiàn)的。(3)?publicintread(byteb[],intoff,intlen):從輸入流中最多讀取len個字節(jié)的數(shù)據(jù),存放到偏移量為off的b數(shù)組中。(4)?publicintavailable():返回輸入流中可以讀取的字節(jié)數(shù)。注意:假設(shè)輸入阻塞,當(dāng)前線程將被掛起;如果InputStream對象調(diào)用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調(diào)用才有用。(5)?publiclongskip(longn):忽略輸入流中的n個字節(jié),返回值是實際忽略的字節(jié)數(shù),跳過一些字節(jié)來讀取。第三節(jié)字節(jié)流(6)?publicintclose():我們在使用完后,必須對我們翻開的流進(jìn)行關(guān)閉。InputStream類主要的子類如下:(1)?FileInputStream:把一個文件作為InputStream,實現(xiàn)對文件的讀取操作。(2)?ByteArrayInputStream:把內(nèi)存中的一個緩沖區(qū)作為InputStream使用。(3)?StringBufferInputStream:把一個String對象作為InputStream使用。(4)?PipedInputStream:實現(xiàn)了Pipe的概念,主要在線程中使用。(5)?SequenceInputStream:把多個InputStream合并為一個InputStream。第三節(jié)字節(jié)流OutputStream提供了三個write方法來做數(shù)據(jù)的輸出,這個是和InputStream相對應(yīng)的。OutputStream類中的常用方法如下:(1)?publicvoidwrite(byteb[]):將參數(shù)b中的字節(jié)寫入輸出流中。(2)?publicvoidwrite(byteb[],intoff,intlen):將參數(shù)b中的從偏移量off開始的len個字節(jié)寫入輸出流中。第三節(jié)字節(jié)流二、OutputStream抽象類(3)?publicabstractvoidwrite(intb):先將int轉(zhuǎn)換為byte類型,把低字節(jié)寫入輸出流中。(4)?publicvoidflush():將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū)。(5)?publicvoidclose():關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源。第三節(jié)字節(jié)流OutputStream類主要的子類如下:(1)?ByteArrayOutputStream:把信息存入內(nèi)存中的一個緩沖區(qū)中。(2)?FileOutputStream:把信息存入文件中。(3)?PipedOutputStream:實現(xiàn)了Pipe的概念,主要在線程中使用。(4)?SequenceOutputStream:把多個OutStream合并為一個OutStream。流結(jié)束的判斷:方法read()的返回值為-1時,readLine()的返回值為null時。第三節(jié)字節(jié)流FileInputStream類可以使用read()方法一次讀入一個字節(jié),并以int類型返回,或者是使用read()方法時讀入一個byte數(shù)組,byte數(shù)組的元素有多少個,就讀入多少個字節(jié)。在將整個文件讀取完成或?qū)懭胪戤叺倪^程中,這么一個byte數(shù)組通常被當(dāng)作緩沖區(qū),因為其通常扮演承接數(shù)據(jù)的中間角色。第三節(jié)字節(jié)流三、文件輸入流(FileInputStream)FileInputStream流傳輸從文件到內(nèi)存如圖9.5所示。作用:用來處理以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流;或者是翻開文件,從文件到內(nèi)存的類讀取數(shù)據(jù)。創(chuàng)立一個FileInputStream對象有如下兩種方法:(1)首先使用文件路徑構(gòu)造一個File對象,再用這個File類去構(gòu)造一個FileInputStream對象。第三節(jié)字節(jié)流Filefin=newFile("d:/abc.txt");和FileInputStreamin=newFileInputStream(fin);(2)直接使用文件路徑構(gòu)造一個FileInputStream對象。FileInputStreamin=newFileInputStream(“d:/abc.txt〞);第三節(jié)字節(jié)流【例如9.3】如圖9.6所示,將InputFromFile.java的程序內(nèi)容顯示在顯示器上。importjava.io.IOException;importjava.io.FileInputStream;;publicclassTestFile{第三節(jié)字節(jié)流publicstaticvoidmain(Stringargs[])throwsIOException{try{FileInputStreamrf=newFileInputStream("InputFromFile.java");intn=512;bytebuffer[]=newbyte[n];while((rf.read(buffer,0,n)!=-1)&&(n>0)){System.out.println(newString(buffer));}System.out.println();第三節(jié)字節(jié)流rf.close();}catch(IOExceptionIOe){System.out.println(IOe.toString());}}}第三節(jié)字節(jié)流作用:用來處理以文件作為數(shù)據(jù)輸出目的數(shù)據(jù)流,或者是從內(nèi)存區(qū)到文件讀取數(shù)據(jù)。FileOutputStream類用來處理以文件作為數(shù)據(jù)輸出目的數(shù)據(jù)流;可以表示文件名的字符串,也可以是File或FileDescriptor對象。創(chuàng)立一個FileOutputStream對象有如下四種方法:(1)首先使用文件路徑構(gòu)造一個File對象,再用這個File類去構(gòu)造一個FileOutputStream對象。Filef=newFile(“d:/myjava/write.txt");FileOutputStreamout=newFileOutputStream(f);第三節(jié)字節(jié)流四、文件輸出流(FileOutputStream)(2)直接使用文件路徑構(gòu)造一個FileOutputStream對象。FileOutputStreamout=newFileOutputStream(“d:/myjava/write.txt");(3)構(gòu)造函數(shù)將FileDescriptor()對象作為其參數(shù)。FileDescriptor()fd=newFileDescriptor();FileOutputStreamf2=newFileOutputStream(fd);(4)構(gòu)造函數(shù)將文件名作為其第一參數(shù),將布爾值作為第二參數(shù)。FileOutputStreamf=newFileOutputStream("d:/abc.txt",true);注意:(1)文件中寫數(shù)據(jù)時,假設(shè)文件已經(jīng)存在,那么覆蓋存在的文件。(2)讀/寫操作結(jié)束時,應(yīng)調(diào)用close方法關(guān)閉流。第三節(jié)字節(jié)流【例如9.5】利用程序?qū)⑽募ile1.txt復(fù)制到file2.txt中。importjava.io.File;importjava.io.IOException;importjava.io.FileOutputStream;importjava.io.FileInputStream;publicclassTestFile{publicstaticvoidmain(Stringargs[])throwsIOException{try{第三節(jié)字節(jié)流五、FileInputStream和FileOutputStream的應(yīng)用FileinFile=newFile("copy.java");FileoutFile=newFile("copy2.java");FileInputStreamfinS=newFileInputStream(inFile);FileOutputStreamfoutS=newFileOutputStream(outFile);intc;while((c=finS.read())!=-1){foutS.write(c);}第三節(jié)字節(jié)流finS.close();foutS.close();}catch(IOExceptione){System.err.println("FileStreamsTest:"+e);}}}第三節(jié)字節(jié)流計算機訪問外部設(shè)備非常耗時,即訪問外存的頻率越高,造成CPU閑置的概率就越大。為了減少訪問外存的次數(shù),應(yīng)該在一次對外部設(shè)備的訪問中,讀寫更多的數(shù)據(jù)。為此,除了程序和流節(jié)點間交換數(shù)據(jù)必需的讀寫機制外,還應(yīng)該增加緩沖機制。緩沖流就是每一個數(shù)據(jù)流分配一個緩沖區(qū),一個緩沖區(qū)就是一個臨時存儲數(shù)據(jù)的內(nèi)存。這樣可以減少訪問硬盤的次數(shù),提高傳輸效率。第三節(jié)字節(jié)流六、緩沖輸入/輸出流(BufferedInputStream/BufferedOutputStream)BufferedInputStream:當(dāng)向緩沖流寫入數(shù)據(jù)的時候,數(shù)據(jù)先存放到緩沖區(qū),待緩沖區(qū)滿后,系統(tǒng)一次性將數(shù)據(jù)發(fā)送給輸出設(shè)備。BufferedOutputStream:當(dāng)向緩沖流讀取數(shù)據(jù)的時候,系統(tǒng)先從緩沖區(qū)讀出數(shù)據(jù),待緩沖區(qū)為空時,系統(tǒng)再從輸入設(shè)備到緩沖區(qū)讀取數(shù)據(jù)。第三節(jié)字節(jié)流(1)將文件讀入內(nèi)存:將BufferedInputStream與FileInputStream相接。FileInputStreamin=newFileInputStream(“file1.txt〞);BufferedInputStreambin=newBufferedInputStream(in);(2)將內(nèi)存寫入文件:將BufferedOutputStream與FileOutputStream相接。FileOutputStreamout=newFileOutputStream(“file1.txt〞);BufferedOutputStreambin=newBufferedInputStream(out);(3)將鍵盤輸入流讀入內(nèi)存:將BufferedReader與標(biāo)準(zhǔn)的數(shù)據(jù)流相接。InputStreamReadersin=newInputStreamReader(System.in);BufferedReaderbin=newBufferedReader(sin);第三節(jié)字節(jié)流第四節(jié)Java語言概述第四節(jié)字符流Reader抽象類用于讀取字符流,其子類必須實現(xiàn)的方法只有read(char[],int,int)和close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。其子類如下:(1)?FileReader:與FileInputStream對應(yīng),主要用來讀取字符文件,使用缺省的字符編碼,有三種構(gòu)造函數(shù)。①將文件名作為字符串:FileReaderf=newFileReader("c:/temp.txt");②構(gòu)造函數(shù)將File對象作為其參數(shù)。Filef=newfile("c:/temp.txt");FileReaderf1=newFileReader(f);第四節(jié)字符流字符流一、Reader抽象類③構(gòu)造函數(shù)將FileDescriptor對象作為參數(shù)FileDescriptor()fd=newFileDescriptor()FileReaderf2=newFileReader(fd);(2)?CharArrayReader:與ByteArrayInputStream對應(yīng)。①用指定字符數(shù)組作為參數(shù):CharArrayReader(char[])。②將字符數(shù)組作為輸入流:CharArrayReader(char[],int,int)。第四節(jié)字符流(3)?StringReader:與StringBufferInputStream對應(yīng),主要用來讀取字符串。publicStringReader(Strings);(4)?InputStreamReader:從輸入流讀取字節(jié),再將它們轉(zhuǎn)換成字符。PublicInputStreamReader(InputStreamis);(5)?FilterReader:允許過濾字符流。protectedFilterReader(Readerr);第四節(jié)字符流(6)?BufferReader:接受Reader對象作為參數(shù),并對其添加字符緩沖器,使用readline()方法可以讀取一行。PublicBufferReader(Readerr);Reader抽象類的主要方法如下:

publicintread()throwsIOException;//讀取一個字符,返回值為讀取的字符

publicintread(charcbuf[])throwsIOException;/*讀取一系列字符到數(shù)組cbuf[]中,返回值為實際讀取的字符的數(shù)量*/?publicabstractintread(charcbuf[],intoff,intlen)throwsIOException;/*讀取len個字符,從數(shù)組cbuf[]的下標(biāo)off處開始存放,返回值為實際讀取的字符數(shù)量,該方法必須由子類實現(xiàn)*/第四節(jié)字符流Write抽象類用于寫入字符流,其子類必須實現(xiàn)的方法僅有write(char[],int,int)、flush()和close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。其子類如下:(1)?FileWrite:與FileOutputStream對應(yīng),主要用來將字符類型數(shù)據(jù)寫入文件,使用缺省字符編碼和緩沖器大小。PublicFileWrite(filef);第四節(jié)字符流二、Writer抽象類(2)?CharArrayWrite:與ByteArrayOutputStream對應(yīng),將字符緩沖器用作輸出。PublicCharArrayWrite();(3)?PrintWrite:生成格式化輸出。publicPrintWriter(outputstreamos);(4)?FilterWriter:用于寫入過濾字符流。protectedFilterWriter(Writerw);(5)?PipedWriter:與PipedOutputStream對應(yīng)。(6)?StringWriter:無與之對應(yīng)的以字節(jié)為導(dǎo)向的stream。第四節(jié)字符流Writer抽象類的主要方法如下:

publicvoidwrite(intc)throwsIOException;//將整型值c的低16位寫入輸出流

publicvoidwrite(charcbuf[])throwsIOException;//將字符數(shù)組cbuf[]寫入輸出流

publicabstractvoidwrite(charcbuf[],intoff,intlen)throwsIOException;//將字符數(shù)組cbuf[]中的從索引為off的位置處開始的len個字符寫入輸出流

publicvoidwrite(Stringstr)throwsIOException;//將字符串str中的字符寫入輸出流

publicvoidwrite(Stringstr,intoff,intlen)throwsIOException;//將字符串str中從索引off開始處的len個字符寫入輸出流

flush();//刷新輸出流,并輸出所有被緩存的字節(jié)

close();//關(guān)閉流publicabstractvoidclose()throwsIOException第四節(jié)字符流第五節(jié)Java語言概述第五節(jié)InputStream與Reader的差異以及?OutputStream與Writer的差異InputStream和OutputStream類處理的是字節(jié)流,數(shù)據(jù)流中的最小單位是字節(jié)(8個bit)。Reader與Writer處理的是字符流,在處理字符流時涉及了字符編碼的轉(zhuǎn)換問題。【例如9.7】如圖9.8所示的Reader類和Writer類。importjava.io.*;publicclassEncodeTest{privatestaticvoidreadBuff(byte[]buff)throwsIOException{ByteArrayInputStreamin=newByteArrayInputStream(buff);intdata;第五節(jié)InputStream與Reader的差異以及OutputStream與Writer的差異InputStream與Reader的差異以及?OutputStream與Writer的差異while((data=in.read())!=-1)System.out.print(data+"");System.out.println();in.close();}

publicstaticvoidmain(Stringargs[])throwsIOException{System.out.println("內(nèi)存中采用Unicode字符編碼:");charc='好';intlowBit=c&0xFF;inthighBit=(c&0xFF00)>>8;System.out.println(""+lowBit+""+highBit);Strings="好";第五節(jié)InputStream與Reader的差異以及OutputStream與Writer的差異System.out.println("本地操作系統(tǒng)默認(rèn)字符編碼:");readBuff(s.getBytes());System.out.println("采用GBK字符編碼:");readBuff(s.getBytes("GBK"));System.out.println("采用UTF-8字符編碼:");readBuff(s.getBytes("UTF-8"));}}第五節(jié)InputStream與Reader的差異以及OutputStream與Writer的差異圖9.8Reader類和Writer類第五節(jié)InputStream與Reader的差異以及OutputStream與Writer的差異Reader類能夠?qū)⑤斎肓髦胁捎闷渌幋a類型的字符轉(zhuǎn)換為Unicode字符,然后在內(nèi)存中為其分配內(nèi)存。Writer類能夠?qū)?nèi)存中的Unicode字符轉(zhuǎn)換為其他編碼類型的字符,再寫入輸出流中。第五節(jié)InputStream與Reader的差異以及OutputStream與Writer的差異

第六節(jié)Java語言概述第六節(jié)綜合實例【例如9.8】輸入/輸出綜合實例。packagejavaio;importjava.io.*;publicclassIOStreamDemo{publicstaticvoidmain(String[]args)throwsIOException{//1.按行輸入BufferedReaderin=第六節(jié)綜合實例綜合實例newBufferedReader(newFileReader("IOStreamDemo.java"));Strings,s2=newString();while((s=in.readLine())!=null)s2+=s+"\n";in.close();//2.按行從標(biāo)準(zhǔn)輸入讀入

BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));System.out.print("Enteraline:");System.out.println(stdin.readLine());第六節(jié)綜合實例//3.從內(nèi)存中讀入

StringReaderin2=newStringReader(s2);intc;while((c=in2.read())!=-1)System.out.print((char)c);第六節(jié)綜合實例//4.從內(nèi)存中取得格式化輸入

try{DataInputStreamin3=newDataInputStream(newByteArrayInputStream(s2.getBytes(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論