最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中字節(jié)流和字符流的理解(超精簡!)

 更新時間:2022年07月26日 11:59:41   作者:石原里美的微笑  
Java通過稱為流的抽象來執(zhí)行I/O操作,下面這篇文章主要給大家介紹了關于Java中字節(jié)流和字符流理解,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

引言 

在完完全全的完成本學期的學習任務之后,終于可以有時間繼續(xù)更新Java相關的文章了。那么今天我們要學習的是的Java中的IO流(I即為Input,O即為Output),也稱為輸入流,輸出流,其主要的作用是為了能夠?qū)ξ募械臄?shù)據(jù)進行輸入和輸出(讀和寫),更加方便了今后我們在Java道路上的學習,好了,廢話不多說,我們開始今天的學習吧!

字節(jié)流和字符流 

在上圖中,橙色部分是抽象類,而藍色部分則是實現(xiàn)類

字節(jié)流 

字節(jié)流,顧名思義就是將數(shù)據(jù)細分為字節(jié)對文件進行讀和寫的操作, 主要分為字節(jié)輸入流和字節(jié)輸出流。

字節(jié)輸入流 

下面是字節(jié)輸入流中經(jīng)常會用到的構造器和方法:

構造器說明
public        FileInputStream(File file)創(chuàng)建字節(jié)輸入流管道與源文件對象接通
public        FileInputStream(String pathname)創(chuàng)建字節(jié)輸入流管道與源文件路徑接通
方法名稱說明
public int read()每次讀取一個字節(jié)返回,如果字節(jié)已經(jīng)沒有可讀的返回-1
public int read(byte[ ] buffer)每次讀取一個字節(jié)數(shù)組返回,如果字節(jié)已經(jīng)沒有可讀的返回-1

接下來通過代碼更好的加深對這一部分知識點的理解吧!

File file = new File("File//data.txt");
        //第一種構造器,參數(shù)是File類
        InputStream inputStream = new FileInputStream(file);
        //第二種構造器,參數(shù)是文件的路徑,可以是相對也可以是絕對的路徑
        InputStream inputStream1 = new FileInputStream("File//data.txt");
        //通過字節(jié)讀取文件中的數(shù)據(jù)
        int len;
        while ((len=inputStream.read()) != -1){
            System.out.print((char) len);
        }
        System.out.println();
        //通過字節(jié)數(shù)組讀取文件中的數(shù)據(jù)
        byte [] buffer = new byte[3];
        while ((len=inputStream1.read(buffer))!=-1){
            String s = new String(buffer,0,len);
            System.out.print(s);
        }
//輸出結果:
//ab1abab
//ab1abab

現(xiàn)在我們看到的輸出結果和文件中的內(nèi)容是一一對應的,那么它就一定是沒有問題的了嗎?其實并不是,只是還沒有遇到問題而已,首先我們應該了解到的是,在utf-8中,字母和數(shù)字都是一個字節(jié),而中文是由三個字節(jié)組成的,那么當我們的文件中出現(xiàn)漢字的時候,第一種方法就無法實現(xiàn)正常的讀取了,因為每次都讀取一個字節(jié)的原因會將漢字拆解,在輸出的時候形成亂碼的情況;而第二種則方法可以在特殊的情況下實現(xiàn)對漢字的輸出,必須滿足的條件是剛好中文的三個字節(jié)都在同一個字節(jié)數(shù)組中。

字節(jié)輸入流并不適合所有的文件數(shù)據(jù),由此而引出了字符輸入流。

字節(jié)輸出流 

下面是字節(jié)輸出流常用到的方法:

方法說明
public void write (int a)寫一個字節(jié)出去
public void write (byte [ ]buffer)寫一個字節(jié)數(shù)組出去
public void write (byte [ ]buffer,int off, int len)將一個字節(jié)數(shù)組中的一部分寫出去
file.close()流的關閉,不能再寫數(shù)據(jù)
file.flush()流的更新,還可以繼續(xù)寫數(shù)據(jù)

 接下來通過代碼更好的加深對這一部分知識點的理解吧!

OutputStream outputStream = new FileOutputStream("File//data.txt",true);
//true表示可以對文件進行追加內(nèi)容,若沒有true則會在關閉文件之后,進行寫文件的時候會對之前的內(nèi)容進行覆蓋。
        outputStream.write('a');
        outputStream.write(13);
        outputStream.write('美');
        outputStream.flush();
        byte[] buffer = {'s','y','l','m',99};
        outputStream.write(buffer);
        outputStream.write(buffer,1,3);
        outputStream.close();

經(jīng)過上面一系列操作以后,會將這些數(shù)據(jù)寫進data.txt文件之中,但是仍然會出現(xiàn)問題,有時無法將中文正常的寫進去,那么它也不是一個適合所有文件的,由此而引出了字符輸出流。

字符流

字符流,顧名思義就是將數(shù)據(jù)細分為字符對文件進行讀和寫的操作, 主要分為字符輸入流和字符輸出流。 

字符輸入流 

 下面是字符輸入流中經(jīng)常會用到的構造器和方法:

構造器說明
public FileReader (File file)創(chuàng)建字符輸入流管道與源文件對象接通
public FileReader(String pathname)創(chuàng)建字符輸入流管道與源文件路徑接通
方法說明
public int read()每次讀取一個字符返回,如果字符已經(jīng)沒有可讀的返回-1
public int read(char [ ]buffer)每次讀取一個字符數(shù)組返回,返回讀取的字符個數(shù),如果字符沒有可讀的返回-1

字符輸入流的構造器和方法大致上和字節(jié)輸入流的相同,不同的地方在于字符輸入流是以字符為單位的讀取,無論你是字母還是數(shù)字,都作為一個字符進行讀取,這樣便可以避免在讀取中文的時候出現(xiàn)亂碼的問題。

接下來通過一部分代碼來加深對它的理解吧!

File file = new File("File//data.txt");
        //第一種構造器,參數(shù)是File類
        FileReader fileReader = new FileReader(file);
        //第二種構造器,參數(shù)是文件的絕對路徑或者相對路徑
        FileReader fileReader1 = new FileReader("File//data.txt");
        //第一種方法,一個一個字符讀取
        int len;
        while ((len = fileReader.read())!=-1){
            System.out.print((char) len);
        }
        //第二種方法,以字符數(shù)組進行讀取
        char []buffer = new char[3];
        while ((len = fileReader1.read(buffer))!=-1){
            String s = new String(buffer,0,len);
            System.out.println(s);
        }
//輸出結果:
//110,119,120
//110
//,11
//9,1
//20

通過以字符為單位的讀寫,便可以避免在讀取中文的時候出現(xiàn)亂碼的問題了。

字符輸出流 

 下面是字符輸出流中經(jīng)常會用到的構造器和方法:

構造器說明
public FileWriter(File file)創(chuàng)建字符輸出流管道與源文件對象接通
public FileWriter(File file,boolean append)創(chuàng)建字符輸出流管道與源文件對象接通,可追加數(shù)據(jù)
public FileWriter(String filepath)創(chuàng)建字符輸出流管道與源文件路徑接通
public FileWriter(String filepath,boolean append)創(chuàng)建字符輸出流管道與源文件路徑接通,可追加
方法說明
void writer(int c)寫入一個字符
void writer (char [ ] buffer)寫入一個字符數(shù)組
void writer (char[ ]buffer,int off,int len)寫入字符數(shù)組的一部分
void writer(String str)        寫入一個字符串
void writer(String str,int off,int len)寫入字符串的一部分
close和flush輸出流的關閉和刷新

接下來就通過代碼來加深對它的理解吧!

FileWriter fileWriter = new FileWriter("File//data.txt");
        fileWriter.write('k');
        fileWriter.write('d');
        char []buffer = {'i','r','v','i','n','g'};
        fileWriter.write(buffer);
        fileWriter.flush();
        String s = "James";
        fileWriter.write(s);
        fileWriter.write(s,0,4);
        fileWriter.close();

字符輸出流的使用便可以很好地解決了中文不能正常寫入文件的問題了。 

附:字節(jié)流和字符流的區(qū)別

字節(jié)流操作的基本單元為字節(jié);字符流操作的基本單元為Unicode碼元。

字節(jié)流默認不使用緩沖區(qū);字符流使用緩沖區(qū)。

字節(jié)流在操作的時候本身是不會用到緩沖區(qū)的,是與文件本身直接操作的,所以字節(jié)流在操作文件時,即使不關閉資源,文件也能輸出;字符流在操作的時候是使用到緩沖區(qū)的。如果字符流不調(diào)用close或flush方法,則不會輸出任何內(nèi)容。

字節(jié)流通常用于處理二進制數(shù)據(jù),實際上它可以處理任意類型的數(shù)據(jù),但它不支持直接寫入或讀取Unicode碼元;字符流通常處理文本數(shù)據(jù),它支持寫入及讀取Unicode碼元。

字節(jié)流可用于任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串; 字節(jié)流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。

字節(jié)流和字符流的轉(zhuǎn)換

字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進制數(shù)據(jù),它是按字節(jié)來處理的,但實際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機的encode來處理,也就是要進行字符集的轉(zhuǎn)化,這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯(lián),實際上是通過byte[]和String來關聯(lián)。在從字節(jié)流轉(zhuǎn)化為字符流時,實際上就是byte[]轉(zhuǎn)化為String時,而在字符流轉(zhuǎn)化為字節(jié)流時,實際上是String轉(zhuǎn)化為byte[]時。

字符流處理的單元為2個字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串,而字節(jié)流處理單元為1個字節(jié),操作字節(jié)和字節(jié)數(shù)組。所以字符流是由Java虛擬機將字節(jié)轉(zhuǎn)化為2個字節(jié)的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片、歌曲,就用字節(jié)流好點,如果是關系到中文(文本)的,用字符流好點。所有文件的儲存是都是字節(jié)(byte)的儲存,在磁盤上保留的并不是文件的字符而是先把字符編碼成字節(jié),再儲存這些字節(jié)到磁盤。在讀取文件(特別是文本文件)時,也是一個字節(jié)一個字節(jié)地讀取以形成字節(jié)序列。

字節(jié)流可用于任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串; 字節(jié)流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。

字節(jié)流與字符流主要的區(qū)別是他們的的處理方式。

總結

到此這篇關于Java中字節(jié)流和字符流的文章就介紹到這了,更多相關Java字節(jié)流和字符流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

新昌县| 绥德县| 遂平县| 黑龙江省| 增城市| 阳西县| 鄂州市| 通化县| 屏东县| 枣阳市| 横峰县| 香格里拉县| 灌云县| 宁河县| 大石桥市| 达州市| 霍山县| 新密市| 留坝县| 陵水| 中超| 宁乡县| 山阳县| 京山县| 库车县| 平遥县| 桂阳县| 彩票| 抚宁县| 谷城县| 伊川县| 赣榆县| 阳新县| 肥西县| 罗山县| 荥经县| 马山县| 江源县| 白水县| 子洲县| 万载县|