Java程序設計教程課件_第1頁
Java程序設計教程課件_第2頁
Java程序設計教程課件_第3頁
Java程序設計教程課件_第4頁
Java程序設計教程課件_第5頁
已閱讀5頁,還剩74頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

filename)在當前路徑下,創建一個名字為filename的文件File(Stringpath,Stringfilename)在給定的path路徑下,創建一個名字為filename的文件StringgetName()獲取此文件(目錄)的名稱StringgetPath()獲取路徑名字符串StringgetAbsolutePath()獲取路徑名的絕對路徑名字符串longlength()獲取文件的長度。如果表示目錄,則返回值不確定booleancanRead()判斷文件是否可讀文件用文件類的對象表示,有了文件對象就可以獲取文件的屬性。12.2.1文件對象與文件屬性【例12.1】讀取給定文件的相關屬性,如果該文件不存在則創建該文件。Example12_01.java類型方法名功能booleancanWrite()判斷文件是否可寫booleancanExecute()判斷文件是否執行booleanexists()判斷文件(目錄)是否存在booleanisFile()判斷文件是否是一個標準文件booleanisDirectory()判斷文件是否是一個目錄booleanisHidden()判讀文件是否是一個隱藏文件longlastModified()獲取文件最后一次被修改的時間12.2.2目錄類型方法名功能booleanmkdir()創建一個目錄,并返回創建結果。成功返回true,失敗(目錄已存在)返回falsebooleanmkdirs()創建一個包括父目錄在內的目錄。創建所有目錄成功返回true,如果失敗返回false,但要注意的是有可能部分目錄已創建成功String[]list()獲取目錄下字符串表示形式的文件名和目錄名String[]list(FilenameFilter

filter)獲取滿足指定過濾器條件的字符串表示形式的文件名和目錄名Java把目錄作為一種特殊的文件進行處理,它除了具備文件的基本屬性如文件名、所在路徑等信息以外,同時也提供了專用于目錄的一些操作方法。12.2.2目錄類型方法名功能File[]listFiles()獲取目錄下文件類型表示形式的文件名和目錄名File[]listFiles(FileFilter

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

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

文件的操作1.創建文件File類的方法:

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

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

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

file.delete();刪除。12.2.3

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

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

Processexec(Stringcommand);需要使用java.lang.Runtime類。首先利用Runtime類的靜態方法創建一個Runtime對象:方法執行本地的命令,參數command為指定的系統命令。12.2.3

文件的操作3.運行可執行文件【例12.3】調用記事本命令,打開一個新記事本。Example12_03.java12.2.4Scanner類與文件

Scannerinput=newScanner(文件類對象);創建的Scanner類的對象使用read()方法即可從文件中讀數據。讀數據時默認以空格作為數據的分隔標記。利用Scanner類的對象,可以從文件中讀取數據:【例12.4】有一個購物清單:電視機3200.00元,智能手機2200.00元,筆記本4200.00元,午餐120.25元。統計該次購物共花費多少?該購物清單存放在一個文件record.txt中。Example12_04.javaC目錄ONTENTS12.2File類12.3實體流12.4裝飾流12.5NIO12.6小結12.1流的概念12.3.1字節流抽象類InputStream和抽象類OutputStream是所有字節流類的根類,其他字節流類都繼承自這兩個類。字節輸入流的作用是從數據輸入源(例如從磁盤、網絡等)獲取字節數據到應用程序(內存)中。1.字節輸入流InputStream類型方法名功能intread()從輸入流中讀取下一個字節,返回讀入的字節數據;如果讀到末尾,返回-1intread(byteb[])從輸入流中讀取一定數量的字節保存到字節數組中,并返回實際讀取的字節數intread(byteb[],intoff,intlen)從輸入流中讀取最多len個字節,保存到數組b中從off開始的位置,并返回實際讀入的字節數;如果off+len大于b.length,或者off和len中有一個是負數,那么會拋出IndexOutOfBoundsException異常longskip(longn)從輸入流中跳過并丟棄n個字節,并返回實際跳過的字節數12.3.1字節流1.字節輸入流InputStream類型方法名功能voidclose()關閉輸入流,釋放資源。對流的讀取完畢后調用該方法以釋放資源intavailable()返回此輸入流可以讀取(或跳過)的估計字節數voidmark(int

readlimit)在輸入流中標記當前的位置。參數readlimit為標記失效前最多讀取的字節數。如果讀取的字節數超出此范圍則標記失效voidreset()將輸入流重新定位到最后一次調用mark方法時的位置booleanmarkSupported()測試此輸入流是否支持mark和reset方法。只有帶緩存的輸入流支持標記功能12.3.1字節流1.字節輸入流InputStreampublicFileInputStream(File

file)throwsFileNotFoundExceptionpublicFileInputStream(String

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

publicFileOutputStream(File

file)throwsIOExceptionpublicFileOutnputStream(String

name)throwsIOExceptionpublicFileOutputStream(File

file,boolean

append)throwsIOExceptionpublicFileOutputStream(Stringname,boolean

append)throwsIOException在進行字節輸出流操作時,經常使用的是OutputStream類的子類FileOutputStream,用于將數據寫入File或其他的輸出流。FileOutputStream類的常用構造方法:12.3.1字節流4.文件字節輸出流類FileOutputStream字節輸出流寫數據步驟:設定輸出流的目的地01OPTION02OPTION03OPTION04OPTION創建指向這目的地輸出向輸出流中寫入數據關閉輸出流12.3.1字節流4.文件字節輸出流類FileOutputStream12.3.1字節流4.文件字節輸出流類FileOutputStream在完成寫操作過程中,系統會將數據暫存到緩沖區中,緩沖區存滿后再一次性寫入到輸出流中。執行close()方法時,不管緩沖區是否已滿,都會把其中的數據寫到輸出流。【例12.6】向一個磁盤文件中寫入數據,第二次寫操作采用追加方式完成。Example12_06.java12.3.2字符流字符流通常用于文本文件的傳輸。抽象類Reader和抽象類Writer是所有字符流類的根類,其他字符流類都繼承自這兩個類。其中一些子類還在傳輸過程中對數據做了進一步處理以方便用戶的使用。12.3.2字符流字符輸入流Reader是所有字符輸入流類的父類,實現從數據源讀入字符數據。常用方法有:類型方法名功能intread()從輸入流讀取單個字符intread(char[]

cbuf)從輸入流讀取字符保存到數組cbuf中,返回讀取的字符數,如果已到達流的末尾,則返回-1intread(char[]

cbuf,int

off,int

len)從輸入流讀取最多len個字符保存到字符數組cbuf中,存放的起始位置在off處。返回:讀取的字符數,如果已到達流的末尾,則返回-11.字符輸入流Reader12.3.2字符流類型方法名功能longskip(long

n)跳過n個字符。返回:實際跳過的字符數voidmark(int

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

file)throwsFileNotFoundExceptionpublicFileReader(String

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

str)將字符串寫到輸出流voidwrite(Stringstr,intoff,intlen)從字符串str的off處開始取len個字符數據寫到輸出流voidflush()強制將輸出流保存在緩沖區中的數據寫到輸出voidclose()關閉輸出流,釋放資源字符輸出流Writer用于將字符數據輸出到目的地。類Writer的常用方法:12.3.2字符流3.字符輸出流類WriterFileWriter類和字節流FileOutputStream類相對應,實現字符的輸出操作,實現方法也基本相同。FileWriter類的常用構造方法:12.3.2字符流4.文件字符輸出流FileWriter類publicFileWriter(File

file)throwsIOExceptionpublicFileWriter(String

name)throwsIOExceptionpublicFileWriter(File

file,boolean

append)throwsIOExceptionpublicFileWriter(Stringname,boolean

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

數據輸入流類型方法名功能DataInputStream(InputStream

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

n)跳過并丟棄n個字節,返回實際跳過的字節數

數據輸入流

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

out)創建一個新的數據輸出流,將數據寫入指定基礎輸出流voidwriteBoolean(Booleanv)將一個布爾值寫出到輸出流voidwriteByte(intv)將一個字節寫出到輸出流voidwriteBytes(String

s)將字符串按字節(每個字符的高八位丟棄)順序寫出到輸出流中voidwriteChar(intc)將一個char值以2字節值形式寫入輸出流中,先寫入高字節voidwriteChars(String

s)將字符串按字符順序寫出到輸出流voidwriteLong(longv)將一個長整型數寫出到輸出流類型方法名功能voidwriteInt(intv)將一個整數寫出到輸出流voidwriteShort(intv)將一個短整型數寫出到輸出流voidwriteFloat(floatv)將一個Float數寫出到輸出流voidwriteDouble(doublev)將一個Double數寫出到輸出流voidwriteUTF(Strings)將一個字符串用UTF_8編碼形式寫出到輸出流intsize()返回寫到數據輸出流中的字節數voidflush()清空輸出流,使所有緩沖中的字節被寫出到流中

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

緩沖輸入流包括字節緩沖輸入流BufferedInputStream類和字符緩沖輸入流BufferedReader類。1.字節緩沖輸入流BufferedInputStream類先通過實體輸入流(例如FileInputStream類)對象逐一讀取字節數據并存入緩沖區,應用程序則從緩沖區中讀取數據。構造方法:

publicBufferedInputStream(InputStream

in)publicBufferedInputStream(InputStream

in,int

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

緩沖輸入流與字節緩沖輸入流BufferedInputStream類在功能和實現上基本相同。它只適用于字符讀入。構造方法:

publicBufferedReader(Reader

in)publicBufferedReader(Reader

in,int

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

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

緩沖輸出流緩沖輸出流包括字節緩沖輸出流BufferedOutputStream類和字符緩沖輸出流BufferedWriter類。1.字節緩沖輸出流BufferedOutputStream類完成輸出操作時,先將字節數據寫入緩沖區,當緩沖區滿時,再把緩沖區中的所有數據一次性寫到底層輸出流中。構造方法:

publicBufferedOutputStream(OutputStream

out)publicBufferedOutputStream(OutputStream

out,int

size)BufferedOutputStream類繼承自OutputStream,所以該類的方法與OutputStream類的方法相同。

緩沖輸出流與字節緩沖輸出流BufferedOutputStream類在功能和實現上是相同的。只適用于字符輸出。BufferedWriter類的構造方法:

publicBufferedWriter(Writer

out)publicBufferedWriterr(Writer

out,int

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

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

隨機流的概念

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

name,String

mode)參數name為待訪問的文件名,file待訪問的文件。參數mode為讀寫模式,常用的值有:“r”以只讀方式打開文件,如果進行寫操作會產生異常;“rw”:以讀寫方式打開文件,如果文件不存在,則創建2RandomAccessFile(Filefile,String

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

b)從文件中讀取最多b.length個數據字節到b數組中,并返回實際讀取的字節數

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

b,int

off,int

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

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

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

RandomAccessFile類序號類型方法名功能15voidsetLength(long

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

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

字符串亂碼的處理由于編碼格式不同當進行字符串讀取的時候,有時會出現“亂碼”的現象。對字符串重新進行編碼可以解決亂碼問題:先讀字符串:Stringstr=in.readLine();再將字符串恢復成標準字節數組:byte[]b=str.getBytes(“iso-8859-1”);最后將字節數組按當前機器的默認編碼重新轉化為字符串:Stringresult=newString(b);顯式地指明編碼類型,可以直接給出編碼類型:Stringresult=newString(b,”GB2312”);12.4.4對象流對象流是在實體流基礎上,通過對對象數據的處理和變換,實現對象的永久保存和讀取。ObjectInputStream和ObjectOutputStream分別是對象輸入流類和對象輸出流類,它們也是InputStream和OutputStream類的子類。通過對象輸出流,可以把對象寫入到文件或進行網絡傳輸。對象輸入流類可以從文件或網絡上,把讀取的數據還原成對象。要想實現對象的傳輸,待傳輸的對象要先進行序列化處理,才能保證對象能準確地保存和讀取。

什么是對象流

對象的序列化對象的序列化是指把對象轉換成字節序列的過程,而把字節序列恢復為對象的過程稱為對象的反序列化。一個類如果實現了java.io.Serializable接口,這個類的實例(對象)就是一個序列化的對象。Serializable接口中沒有方法。實現了該接口的對象進行輸出時,JVM將按照一定的格式(序列化信息)轉換成字節進行傳輸和存儲到目的地。對象輸入流從文件或網絡上讀取對象時,會先讀取對象的序列化信息,并根據這一信息創建對象。

對象輸入流與對象輸出流實現對象的輸入操作。構造方法:1.對象輸入流ObjectInputStream類publicObjectInputStream(InputStream

in)類中的方法:ObjectreadObject()從ObjectInputStream流中讀取對象。實現對象的輸出操作。構造方法:publicObjectOutputStream(OutputStream

out)類中的方法:voidwriteObject(Objecto)將指定對象o寫入ObjectOutputStream流中。【例12.11】創建一個可序列化類,將該類的對象寫入到文件中。用對象輸入流讀取并顯示對象信息。Example12_11.java

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

溫馨提示

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

評論

0/150

提交評論