版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
學(xué)IT有疑問,就找千問千知千里尋他眾百度,鋒自苦寒磨礪出千鋒教育Java語言程序設(shè)計(jì)(第2版)教學(xué)設(shè)計(jì)課程名稱:Java語言程序設(shè)計(jì)(第2版)_______授課年級(jí):___________________________授課學(xué)期:___________________________教師姓名:___________________________2020年03月01日課程名稱第9章I/O(輸入/輸出)流計(jì)劃學(xué)時(shí)4學(xué)時(shí)內(nèi)容分析本章主要介紹流概述、字節(jié)流、字符流、其他I/O流、File類、RandomAccessFile、字符編碼、NIO教學(xué)目標(biāo)與教學(xué)要求要求學(xué)生熟練掌握操作字節(jié)流和字符流讀寫文件、了解其他I/O流、熟練掌握File類及其用法、了解NI/O的概念及其用法、了解常見字符編碼教學(xué)重點(diǎn)字節(jié)流、字符流、其他I/O流、File類、RandomAccessFile、字符編碼、NIO教學(xué)難點(diǎn)字節(jié)流、字符流、其他I/O流、File類、RandomAccessFile、字符編碼、NIO教學(xué)方式課堂講解及ppt演示教學(xué)過程第一課時(shí)(流概述、字節(jié)流、字符流、其他I/O流)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時(shí)主題。上節(jié)已經(jīng)介紹了集合類,程序的主要任務(wù)是操作數(shù)據(jù)。在程序運(yùn)行時(shí),這些數(shù)據(jù)都必須位于內(nèi)存中,并且屬于特定的類型,程序才能操作它們。JavaI/O系統(tǒng)負(fù)責(zé)處理程序的輸入和輸出,I/O類庫(kù)位于java.io包中,它對(duì)各種常見的輸入流和輸出流進(jìn)行了抽象。本章將對(duì)I/O流進(jìn)行詳細(xì)講解。明確學(xué)習(xí)目標(biāo)能夠掌握流概述能夠掌握字節(jié)流的概念能夠掌握字節(jié)流讀寫文件能夠掌握文件的復(fù)制能夠掌握字節(jié)流的緩沖區(qū)能夠掌握裝飾設(shè)計(jì)模式能夠掌握字節(jié)緩沖流能夠掌握字符流定義及基本用法能夠掌握字符流操作文件能夠掌握字符流的緩沖區(qū)能夠掌握LineNumberReader能夠掌握轉(zhuǎn)換流能夠掌握ObjectInputStream和ObjectOutputStream能夠掌握DataInputStream和DataOutputStream能夠掌握PrintStream能夠掌握標(biāo)準(zhǔn)輸入輸出流能夠掌握PipedInputStream和PipedOutputStream知識(shí)講解流概述流就是字節(jié)序列的抽象概念,能被連續(xù)讀取數(shù)據(jù)的數(shù)據(jù)源和能被連續(xù)寫入數(shù)據(jù)的接收端就是流,流機(jī)制是Java及C++中的一個(gè)重要機(jī)制,通過流開發(fā)人員可以自由控制文件、內(nèi)存、I/O設(shè)備等數(shù)據(jù)的流向。而I/O流就是用于處理設(shè)備上的數(shù)據(jù),如硬盤、內(nèi)存、鍵盤錄入等,就好像管道,將兩個(gè)容器連接起來,如圖所示。字節(jié)流的概念在計(jì)算機(jī)中,所有的文件都能以二進(jìn)制(字節(jié))形式存在,Java的I/O中針對(duì)字節(jié)傳輸操作提供了一系列流,統(tǒng)稱為字節(jié)流。字節(jié)流有兩個(gè)抽象基類InputStream和OutputStream,分別處理字節(jié)流的輸入和輸出,所有的字節(jié)輸入流都繼承自InputStream類,所有的字節(jié)輸出流都繼承自O(shè)utputStream類。在這里,輸入和輸出的概念要有一個(gè)參照物,是站在程序的角度來理解這兩個(gè)概念,如圖所示。在圖中,從程序到文件是輸出流(OutputStream),將數(shù)據(jù)從程序輸出到文件。從文件到程序是輸入流(InputStream),通過程序讀取文件中的數(shù)據(jù)。這樣就實(shí)現(xiàn)了數(shù)據(jù)的傳輸。字節(jié)流讀寫文件9.2.1節(jié)介紹了InputStream和OutputStream的眾多子類,其中,F(xiàn)ileInputStream和FileOutputStream是兩個(gè)很常用的子類,F(xiàn)ileInputStream用來從文件中讀取數(shù)據(jù),操作文件的字節(jié)輸入流,接下來通過一個(gè)案例來演示如何從文件中讀取數(shù)據(jù)。首先在D盤根目錄下新建一個(gè)文本文件read.txt,文件內(nèi)容如下。文件的復(fù)制在9.2.2節(jié)中詳細(xì)講解了文件輸入流和文件輸出流,實(shí)際開發(fā)中,往往都是二者結(jié)合使用,比如文件的復(fù)制。接下來通過一個(gè)案例來演示如何通過輸入輸出流實(shí)現(xiàn)文件的復(fù)制,首先在當(dāng)前目錄新建文件夾src和tar,將一張圖片test.jpg存入src中,然后開始編寫代碼,如例所示。字節(jié)流的緩沖區(qū)在9.2.3節(jié)中講解了如何復(fù)制文件,但復(fù)制的方式是一個(gè)字節(jié)一個(gè)字節(jié)地復(fù)制,頻繁操作文件,效率非常低,利用字節(jié)流的緩沖區(qū)可以解決這一問題,提高效率。緩沖區(qū)可以存放一些數(shù)據(jù),例如,某出版社要從北京往西安運(yùn)送教材,如果有一千本教材,每次只運(yùn)送一本教材,就需要運(yùn)輸一千次,為了減少運(yùn)輸次數(shù),可以先把一批教材裝在車廂中,這樣就可以成批地運(yùn)送教材,這時(shí)的車廂就相當(dāng)于一個(gè)臨時(shí)緩沖區(qū)。當(dāng)通過流的方式復(fù)制文件時(shí),為了提高效率也可以定義一個(gè)字節(jié)數(shù)組作為緩沖區(qū),將多個(gè)字節(jié)讀到緩沖區(qū),然后一次性輸出到文件,這樣會(huì)大大提高效率。接下來通過一個(gè)案例來演示如何在復(fù)制文件時(shí)應(yīng)用緩沖區(qū)提高效率。如例所示。裝飾設(shè)計(jì)模式裝飾模式是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的對(duì)象。例如,在北京買了一套房,冬天天氣很冷,想在房子的客廳安裝一臺(tái)空調(diào),這就相當(dāng)于為這套新房填加了新的功能。裝飾對(duì)象和被裝飾對(duì)象要實(shí)現(xiàn)同一個(gè)接口,裝飾對(duì)象持有被裝飾對(duì)象的實(shí)例,如圖所示。字節(jié)流緩沖流9.2.6節(jié)講解了裝飾設(shè)計(jì)模式,實(shí)際上,在I/O中一些流也用到了這種模式,分別是BufferedInputStream類和BufferedOutputStream類,這兩個(gè)流都使用了裝飾設(shè)計(jì)模式。它們構(gòu)造方法中分別接收InputStream和OutputStream類型的參數(shù)作為被裝飾對(duì)象,在執(zhí)行讀寫操作時(shí)提供緩沖功能,如圖所示。字符流定義及基本用法前面講解了字節(jié)流的相關(guān)內(nèi)容,Java還提供了字符流,用于操作字符。與字節(jié)流相似,字符流也有兩個(gè)抽象基類,分別是Reader和Writer,Reader是字符輸入流,用于從目標(biāo)文件讀取字符,Writer是字符輸出流,用于向目標(biāo)文件寫入字符。字符流也是由兩個(gè)抽象基類衍生出很多子類,由子類來實(shí)現(xiàn)功能,先來了解一下它們的結(jié)構(gòu),如圖所示。字符流操作文件9.3.1節(jié)介紹了Reader和Writer的眾多子類,其中,F(xiàn)ileReader和FileWriter是兩個(gè)很常用的子類,F(xiàn)ileReader類是用來從文件中讀取字符的,操作文件的字符輸入流,接下來通過一個(gè)案例來演示如何從文件中讀取字符。首先在當(dāng)D盤根目錄下新建一個(gè)文本文件read.txt,文件內(nèi)容如下。字符流的緩沖區(qū)前面講解了字節(jié)流的緩沖區(qū),字符流也同樣有緩沖區(qū)。字符流中帶緩沖區(qū)的流分別是BufferedReader類和BufferedWriter類,其中,BufferedReader類用于對(duì)字符輸入流進(jìn)行包裝,BufferedWriter類用于對(duì)字符輸出流進(jìn)行包裝,包裝后會(huì)提高字符流的讀寫效率。接下來通過一個(gè)案例演示如何在復(fù)制文件時(shí)應(yīng)用字符流緩沖區(qū),先在項(xiàng)目的根目錄下創(chuàng)建一個(gè)src.txt文件,文件內(nèi)容如下。LineNumberReaderJava程序在編譯或運(yùn)行期間經(jīng)常會(huì)出現(xiàn)一些錯(cuò)誤,在錯(cuò)誤中通常會(huì)報(bào)告出錯(cuò)的行號(hào),為了方便查找錯(cuò)誤,需要在代碼中加入行號(hào)。JDK提供了一個(gè)可以跟蹤行號(hào)的流——LineNumberReader,它是BufferedReader的子類。接下來通過一個(gè)案例來演示復(fù)制文件時(shí),如何為文件內(nèi)容加上行號(hào),首先在當(dāng)前目錄新建一個(gè)文件code1.txt,文件內(nèi)容如下。轉(zhuǎn)換流前面分別講解了字節(jié)流和字符流,有時(shí)字節(jié)流和字符流之間也需要進(jìn)行轉(zhuǎn)換,在JDK中提供了可以將字節(jié)流轉(zhuǎn)換為字符流的兩個(gè)類,分別是InputStreamReader類和OutputStreamWriter類,它們被稱為轉(zhuǎn)換流,其中,OutputStreamWriter類可以將一個(gè)字符輸出流轉(zhuǎn)換成字節(jié)輸出流,而InputStreamReader類可以將一個(gè)字節(jié)輸入流轉(zhuǎn)換成字符輸入流,轉(zhuǎn)換流的出現(xiàn)方便了對(duì)文件的讀寫,它在字符流與字節(jié)流之間架起了一座橋梁,使原本沒有關(guān)聯(lián)的兩種流操作能夠進(jìn)行轉(zhuǎn)化,提高了程序的靈活性。ObjectInputStream和ObjectOutputStream前面講解了如何通過流讀取文件,實(shí)際上通過流也可以讀取對(duì)象,例如,將內(nèi)存中的對(duì)象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)流的形式輸出,保存到硬盤,這叫作對(duì)象的序列化。通過將對(duì)象序列化,可以方便地實(shí)現(xiàn)對(duì)象的傳輸和保存。在Java中,并不是所有的類的對(duì)象都可以被序列化,如果一個(gè)類對(duì)象需要被序列化,則此類必須實(shí)現(xiàn)java.io.Serializable接口,這個(gè)接口內(nèi)沒有定義任何方法,是一個(gè)標(biāo)識(shí)接口,表示一種能力。Java提供了兩個(gè)類用于序列化對(duì)象的操作,它們分別是ObjectInputStream類和ObjectOutputStream類。對(duì)象序列化和反序列化通過以下兩步實(shí)現(xiàn)。(1)創(chuàng)建OutputStream對(duì)象,封裝在ObjectOutputStream對(duì)象中,只需調(diào)用writeObject即可將對(duì)象序列化。(2)創(chuàng)建InputStream對(duì)象,封裝在ObjectInputStream對(duì)象中,只需調(diào)用readObject即可將對(duì)象反序列化。DataInputStream和DataOutputStream上一節(jié)講解了將對(duì)象序列化和反序列化,Java中還提供了將對(duì)象中的一部分?jǐn)?shù)據(jù)進(jìn)行序列化和反序列化的類,也就是將基本數(shù)據(jù)類型序列化和反序列化,它們分別是DataInputStream類和DataOutputStream類。DataInputStream類和DataOutputStream類是兩個(gè)與平臺(tái)無關(guān)的數(shù)據(jù)操作流,它們不僅提供了讀寫各種基本數(shù)據(jù)類型數(shù)據(jù)的方法,而且還提供了readUTF()方法和writeUTF()方法,用于輸入輸出時(shí)指定字符串的編碼類型為UTF-8,接下來通過一個(gè)案例演示這兩個(gè)類如何讀寫數(shù)據(jù)。如例所示。PrintStream前面講解了使用輸出流輸出字節(jié)數(shù)組,如果想直接輸出數(shù)組、日期、字符等呢?Java中提供了PrintStream流來解決這一問題,它應(yīng)用了裝飾設(shè)計(jì)模式,使輸出流的功能更完善,它提供了一系列用于打印數(shù)據(jù)的print()和println()方法,被稱作打印流。接下來通過一個(gè)案例演示PrintStream流的用法,如例所示。標(biāo)準(zhǔn)輸入輸出流Java中有3個(gè)特殊的流對(duì)象常量,如表所示。表中列舉了3個(gè)特殊的常量,它們被習(xí)慣性地稱為標(biāo)準(zhǔn)輸入輸出流。其中,err是將數(shù)據(jù)輸出到控制臺(tái),通常是程序運(yùn)行的錯(cuò)誤信息,是不希望用戶看到的;out是標(biāo)準(zhǔn)輸出流,默認(rèn)將數(shù)據(jù)輸出到命令行窗口,是希望用戶看到的;in是標(biāo)準(zhǔn)輸入流,默認(rèn)讀取鍵盤輸入的數(shù)據(jù)。接下來通過一個(gè)案例演示這3個(gè)常量的使用。如例所示。PipedArrayInputStream和ByteArrayOutputStream在UNIX/LINUX中有一個(gè)很有用的概念——管道(pipe),它具有將一個(gè)程序的輸出當(dāng)作另一個(gè)程序的輸入的能力。在Java中也提供了類似這個(gè)概念的管道流,可以使用管道流進(jìn)行線程之間的通信,在這個(gè)機(jī)制中,輸入流和輸出流必須相連接,這樣的通信有別于一般的共享數(shù)據(jù),它不需要一個(gè)共享的數(shù)據(jù)空間。管道流主要用于連接兩個(gè)線程間的通信。管道流也分為字節(jié)流(PipedInputStream、PipedOutputStream)和字符流(PipedReader、PipedWriter),本節(jié)只講解PipedInputStream類和PipedOutputStream類。接下來通過一個(gè)案例演示管道流的使用,示例代碼參考教材9.4.5節(jié)。第二課時(shí)(其他I/O流、File類、RandomAccessFile、字符編碼、NIO)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時(shí)主題。上節(jié)已經(jīng)介紹了流概述、字節(jié)流的概念、字節(jié)流讀寫文件、文件的復(fù)制、字節(jié)流的緩沖區(qū)、裝飾設(shè)計(jì)模式、字節(jié)緩沖流、字符流定義及基本用法、字符流操作文件、字符流的緩沖區(qū)、LineNumberReader、轉(zhuǎn)換流、ObjectInputStream和ObjectOutputStream、DataInputStream和DataOutputStream、PrintStream、標(biāo)準(zhǔn)輸入輸出流和PipedInputStream和PipedOutputStream,下面將介紹ByteArrayInputStream和ByteArrayOutputStream、CharArrayReader和CharArrayWriter、SequenceInputStream、File類的常用方法、遍歷目錄下的文件、文件過濾、刪除文件及目錄、RandomAccessFile、常用字符集、字符編碼和解碼、字符傳輸、NIO概述、NIO基礎(chǔ)、NIO中的讀和寫操作和注意事項(xiàng)。明確學(xué)習(xí)目標(biāo)能夠掌握ByteArrayInputStream和ByteArrayOutputStream能夠掌握CharArrayReader和CharArrayWriter能夠掌握SequenceInputStream能夠掌握File類的常用方法能夠掌握遍歷目錄下的文件能夠掌握文件過濾能夠掌握刪除文件及目錄能夠掌握RandomAccessFile能夠掌握常用字符集能夠掌握字符編碼和解碼能夠掌握字符傳輸能夠掌握NIO概述能夠掌握NIO基礎(chǔ)能夠掌握NIO中的讀和寫操作能夠掌握注意事項(xiàng)知識(shí)講解ByteArrayInputStream和ByteArrayOutputStream前面學(xué)習(xí)的輸入和輸出流都是程序與文件之間的操作,有時(shí)程序在運(yùn)行過程中要生成一些臨時(shí)文件,可以采用虛擬文件的方式實(shí)現(xiàn)。Java提供了內(nèi)存流機(jī)制,可以實(shí)現(xiàn)將數(shù)據(jù)儲(chǔ)存到內(nèi)存中,稱為內(nèi)存操作流,它們分別是字節(jié)內(nèi)存操作流(ByteArrayInputStream、ByteArrayOutputStream)和字符內(nèi)存操作流(CharArrayWriter、CharArrayReader),本節(jié)只講解字節(jié)內(nèi)存操作流。接下來通過一個(gè)案例演示字節(jié)內(nèi)存操作流的使用,示例代碼參考教材9.4.6節(jié)。CharArrayReader和CharArrayWriter9.4.6節(jié)講解了字節(jié)內(nèi)存操作流,與之對(duì)應(yīng)的還有字符內(nèi)存操作流,分別是CharArrayReader類和CharArrayWriter類。CharArrayWriter類可以將字符類型數(shù)據(jù)臨時(shí)存入內(nèi)存緩沖區(qū)中,CharArrayReader類可以從內(nèi)存緩沖區(qū)中讀取字符類型數(shù)據(jù),接下來通過一個(gè)案例演示這兩個(gè)類的使用,如例所示。SequenceInputStream前面講解的對(duì)文件進(jìn)行操作都是通過一個(gè)流,Java提供了SequenceInputStream類可以將多個(gè)輸入流按順序連接起來,合并為一個(gè)輸入流。當(dāng)通過這個(gè)類來讀取數(shù)據(jù)時(shí),它會(huì)依次從所有被串聯(lián)的輸入流中讀取數(shù)據(jù),對(duì)程序來說就好像對(duì)同一個(gè)流操作。接下來通過一個(gè)案例演示SequenceInputStream類的使用,首先在當(dāng)前目錄創(chuàng)建file1.txt文件和file2.txt文件,其中file1.txt文件內(nèi)容如下。file2.txt文件內(nèi)容如下。File類的常用方法使用File類進(jìn)行操作,首先要設(shè)置一個(gè)操作文件的路徑,F(xiàn)ile類有3個(gè)構(gòu)造方法可以用來生成File對(duì)象并且設(shè)置操作文件的路徑,如下所示。如上所示構(gòu)造方法中,“directoryPath”表示文件的路徑名,“filename”是文件名,“dirObj”是一個(gè)指定目錄的File對(duì)象。通過這3個(gè)構(gòu)造方法可以創(chuàng)建File對(duì)象,如下所示。如上所示創(chuàng)建3個(gè)File對(duì)象f1、f2和f3,在指定路徑時(shí),使用了“/”,Java能正確處理UNIX和Windows約定路徑分隔符,所以在Windows下用“/”是可以正確指定路徑的,如果在Windows下使用反斜杠“\”作為路徑分隔符,則需要轉(zhuǎn)義,寫兩個(gè)反斜杠“\\”。在File中提供了一系列用于操作文件的有關(guān)方法,接下來先了解一下File類的常用方法,表參考教材9.5.1節(jié)。表列舉了File類的常用方法,接下來通過一個(gè)案例演示這些方法的基本使用,先在當(dāng)前目錄創(chuàng)建一個(gè)空的file.txt文件,然后編寫代碼,示例代碼參考教材9.5.1節(jié)。遍歷目錄下的文件在文件操作中,遍歷某個(gè)目錄下的文件是很常見的操作,F(xiàn)ile類中提供的list()方法就是用來遍歷目錄下所有文件的。接下來通過一個(gè)案例演示list()方法的使用,如例所示。文件過濾9.5.2節(jié)中講解了如何遍歷目錄下的文件,調(diào)用File類的list()方法成功遍歷了目錄下的文件,但有時(shí)候可能只需要遍歷某些文件,比如遍歷目錄下擴(kuò)展名為“.java”的文件,這就需要用到File類的list(FilenameFilterfilter)方法。接下來通過一個(gè)案例演示如何遍歷目錄下擴(kuò)展名為“.java”的文件,如例所示。刪除文件及目錄前面講解了文件的遍歷和過濾,文件的刪除操作也是很常見的,接下來通過一個(gè)案例演示如何刪除文件及目錄,如例所示。RandomAccessFile除了File類之外,Java還提供了RandomAccessFile類用于專門處理文件,它支持“隨機(jī)訪問”的方式,這里“隨機(jī)”是指可以跳轉(zhuǎn)到文件的任意位置處讀寫數(shù)據(jù)。使用RandomAccessFile類,程序可以直接跳到文件的任意地方讀、寫文件,既支持只訪問文件的部分內(nèi)容,又支持向已存在的文件追加內(nèi)容。RandomAccessFile類在數(shù)據(jù)等長(zhǎng)記錄格式文件的隨機(jī)(相對(duì)順序而言)讀取時(shí)有很大的優(yōu)勢(shì),但該類僅限于操作文件,不能訪問其他的I/O設(shè)備,如網(wǎng)絡(luò)、內(nèi)存影響等,接下來了解一下RandomAccessFile類的構(gòu)造方法,具體示例如下。常用字符集大家在看諜戰(zhàn)片時(shí),經(jīng)常會(huì)看到情報(bào)員將其得到的軍事計(jì)劃和命令等情報(bào)用密碼本將文字翻譯成秘密代碼發(fā)出,敵人就算接收到該代碼也要花很長(zhǎng)時(shí)間進(jìn)行破譯,而隊(duì)友就可以使用同樣的密碼本將收到的代碼翻譯成文字,計(jì)算機(jī)之間進(jìn)行傳輸同樣需要使用一種“密碼本”,它叫做字符碼表。計(jì)算機(jī)只能識(shí)別二進(jìn)制數(shù)據(jù),為了讓它識(shí)別各個(gè)國(guó)家的文字,就將各個(gè)國(guó)家的文字用數(shù)字來表示,并一一對(duì)應(yīng),形成一張表,這就是編碼表,編碼表是一種可以讓計(jì)算機(jī)識(shí)別的特定字符集,針對(duì)不同文字,每個(gè)國(guó)家都指定了自己的碼表,接下來介紹幾種常見的編碼表。1.ASCII最早的也是最基本最重要的一種英美文字的字符集,也可以說是編碼。ASCII被定為國(guó)際標(biāo)準(zhǔn)之后的代號(hào)為ISO-646。由于ASCII碼只使用了低7位二進(jìn)制位,其他的認(rèn)為無效,它僅使用了0~127這128個(gè)碼位。剩下的128個(gè)碼位便可以用來做擴(kuò)展,并且ASCII的字符集序號(hào)與存儲(chǔ)的編碼完全相同。2.ISO-8859-*隨著西歐國(guó)家的崛起,在ASCII的基礎(chǔ)上對(duì)剩余的碼位做了擴(kuò)展,就形成了一系列ISO-8859-*的標(biāo)準(zhǔn)。例如,為英語做了專門擴(kuò)展的字符集編碼標(biāo)準(zhǔn)編號(hào)ISO-8859-1,也叫做Latin-1。由于西歐小國(guó)眾多,稍有發(fā)言權(quán)的小國(guó)就紛紛在ASCII的基礎(chǔ)上擴(kuò)展形成自己的編碼,這就是ISO-8859-*系列。很顯然ISO-8859-*系列的碼也是8位的,并且其字符集序號(hào)與存儲(chǔ)的編碼也完全相同。3.GB2312GB2312字集是簡(jiǎn)體字集,全稱為GB2312(80)字集,共包括國(guó)標(biāo)簡(jiǎn)體漢字6763個(gè)。4.Unicode國(guó)際標(biāo)準(zhǔn)組織于1984年4月成立ISO/IECJTC1/SC2/WG2工作組,針對(duì)各國(guó)文字、符號(hào)進(jìn)行統(tǒng)一性編碼。1991年美國(guó)跨國(guó)公司成立UnicodeConsortium,并于1991年10月與WG2達(dá)成協(xié)議,采用同一編碼字集。目前Unicode是采用16位編碼體系,其字符集內(nèi)容與ISO10646的BMP(BasicMultilingualPlane)相同。Unicode于1992年6月通過DIS(DrafInternationalStandard),目前版本V2.0于1996公布,內(nèi)容包含符號(hào)6811個(gè),漢字20902個(gè),韓文拼音11172個(gè),造字區(qū)6400個(gè),保留20249個(gè),共計(jì)65534個(gè)。Unicode編碼后的大小是一樣的。例如,一個(gè)英文字母“a”和一個(gè)漢字“好”,編碼后都是占用的空間大小是一樣的,都是兩個(gè)字節(jié)。5.GBKGBK字集包括了GB字集、BIG5字集和一些符號(hào),共包括21003個(gè)字符。GBK編碼是GB2312編碼的超集,向下完全兼容GB2312,同時(shí)GBK收錄了Unicode基本多文種平面中的所有CJK漢字。同GB2312一樣,GBK也支持希臘字母、日文假名字母、俄語字母等字符,但不支持韓語中的表音字符(非漢字字符)。GBK還收錄了GB2312不包含的漢字部首符號(hào)、豎排標(biāo)點(diǎn)符號(hào)等字符。6.UTF-8UTF-8是用以解決國(guó)際上字符的一種多字節(jié)編碼,它對(duì)英文使用8位(即一個(gè)字節(jié)),中文使用24位(三個(gè)字節(jié))來編碼。UTF-8包含全世界所有國(guó)家需要用到的字符,是國(guó)際編碼,通用性強(qiáng)。UTF-8編碼的文字可以在各國(guó)支持UTF8字符集的瀏覽器上顯示。例如,使用UTF-8編碼,則在外國(guó)人的英文IE上也能顯示中文,它們無須下載IE的中文語言支持包,在實(shí)際開發(fā)中采用UTF-8編碼是最常見的。字符編碼和解碼在前面講解過Java的轉(zhuǎn)換流,將字節(jié)流轉(zhuǎn)換為字符流,或者將字符流轉(zhuǎn)換為字節(jié)流,這實(shí)際上涉及到編碼和解碼,將字符流轉(zhuǎn)換為字節(jié)流稱為編碼,便于計(jì)算機(jī)識(shí)別;將字節(jié)流轉(zhuǎn)換為字符流稱為解碼,便于用戶看懂。在轉(zhuǎn)換流中,有可能出現(xiàn)亂碼的情況,出現(xiàn)這種情況原因一般是編碼與解碼字符集不統(tǒng)一,另外缺少字節(jié)數(shù)或長(zhǎng)度丟失,也會(huì)出現(xiàn)亂碼。接下來通過一個(gè)案例來演示字符的編碼和解碼,如例所示。字符傳輸前面講解的I/O文件傳輸用的都是Windows系統(tǒng)默認(rèn)編碼字符集GBK,讀寫文件沒有發(fā)生亂碼問題。但如果讀取一個(gè)編碼格式為GBK的文件,將讀取的數(shù)據(jù)寫入一個(gè)編碼格式為UTF-8的文件時(shí),則會(huì)出現(xiàn)亂碼的情況,接下來通過一個(gè)案例演示這種情況,示例代碼參考教材9.7.3節(jié)。在例中,分別以GBK字符集和UTF-8字符集創(chuàng)建兩個(gè)文件file1.txt和file2.txt,將兩個(gè)字符串分別寫入兩個(gè)文件,然后用字符輸入流讀取file2.txt的內(nèi)容,最后用字符輸出流將讀取到的內(nèi)容輸出到file1.txt,生成文件如圖所示。NIO概述NI/O(NewInput/Output)也稱為NewI/O。是一種基于通道和緩沖區(qū)的I/O方式,與之前學(xué)習(xí)面向流的I/O相比,NI/O是面向緩存的,其效率會(huì)提高很多。而且,NI/O是一種同步非阻塞的I/O模型,會(huì)不斷輪詢I/O事件檢查其是否準(zhǔn)備就緒,在等待I/O的時(shí)候,可以同時(shí)做其他任務(wù)。在NI/O中同步的核心就是Selector,Selector代替了線程本身輪詢I/O事件,避免了阻塞的同時(shí)減少了不必要的線程消耗;非阻塞的核心就是通道和緩沖區(qū),當(dāng)I/O事件就緒時(shí),可以通過寫道緩沖區(qū),保證I/O的成功,而無需線程阻塞式地等待。在JavaAPI中提供了兩套NI/O,一套是針對(duì)標(biāo)準(zhǔn)輸入輸出NI/O,另一套就是網(wǎng)絡(luò)編程N(yùn)I/O。NIO基礎(chǔ)NI/O主要有三大核心部分:Channel(通道),Buffer(緩沖區(qū)),Selector(選擇器)。傳統(tǒng)I/O基于字節(jié)流和字符流進(jìn)行操作,而NI/O基于Channel(通道)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 媒體健康教育宣傳方案
- 高層建筑外墻作業(yè)安全施工方案
- 中老年人骨質(zhì)疏松健康促進(jìn)方案
- 讓現(xiàn)代多媒體技術(shù)與作文相得益彰
- 亞丁電音節(jié)贊助合作方案
- 高空作業(yè)風(fēng)險(xiǎn)評(píng)估與應(yīng)急預(yù)案
- 《員工升職協(xié)議》
- 小學(xué)心理健康教育活動(dòng)反饋方案
- 2024年09版小學(xué)5年級(jí)下冊(cè)英語第4單元綜合卷
- 外語教師口語教學(xué)方案
- 馬王堆出土文物藝術(shù)欣賞-課件
- 初中語文人教六年級(jí)下冊(cè)《專題閱讀:概括主要事件》PPT
- 13、停電停水等突發(fā)事件的應(yīng)急預(yù)案以及消防制度
- DB42T1811-2022西瓜設(shè)施育苗技術(shù)規(guī)程
- 早教托育園招商加盟商業(yè)計(jì)劃書
- 醫(yī)療HRP整體解決方案課件
- 電力電纜基礎(chǔ)知識(shí)專題培訓(xùn)課件
- 分布式光伏安裝清包合同
- 四機(jī)廠介紹企業(yè)介紹
- AEO認(rèn)證系列-供應(yīng)鏈安全培訓(xùn)
- 中小學(xué)高級(jí)職稱英語全英答辯題
評(píng)論
0/150
提交評(píng)論