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

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

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

引言 

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

字節(jié)流和字符流 

在上圖中,橙色部分是抽象類(lèi),而藍(lán)色部分則是實(shí)現(xiàn)類(lèi)

字節(jié)流 

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

字節(jié)輸入流 

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

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

接下來(lái)通過(guò)代碼更好的加深對(duì)這一部分知識(shí)點(diǎn)的理解吧!

File file = new File("File//data.txt");
        //第一種構(gòu)造器,參數(shù)是File類(lèi)
        InputStream inputStream = new FileInputStream(file);
        //第二種構(gòu)造器,參數(shù)是文件的路徑,可以是相對(duì)也可以是絕對(duì)的路徑
        InputStream inputStream1 = new FileInputStream("File//data.txt");
        //通過(guò)字節(jié)讀取文件中的數(shù)據(jù)
        int len;
        while ((len=inputStream.read()) != -1){
            System.out.print((char) len);
        }
        System.out.println();
        //通過(guò)字節(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);
        }
//輸出結(jié)果:
//ab1abab
//ab1abab

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

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

字節(jié)輸出流 

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

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

 接下來(lái)通過(guò)代碼更好的加深對(duì)這一部分知識(shí)點(diǎn)的理解吧!

OutputStream outputStream = new FileOutputStream("File//data.txt",true);
//true表示可以對(duì)文件進(jìn)行追加內(nèi)容,若沒(méi)有true則會(huì)在關(guān)閉文件之后,進(jìn)行寫(xiě)文件的時(shí)候會(huì)對(duì)之前的內(nèi)容進(jìn)行覆蓋。
        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)過(guò)上面一系列操作以后,會(huì)將這些數(shù)據(jù)寫(xiě)進(jìn)data.txt文件之中,但是仍然會(huì)出現(xiàn)問(wèn)題,有時(shí)無(wú)法將中文正常的寫(xiě)進(jìn)去,那么它也不是一個(gè)適合所有文件的,由此而引出了字符輸出流。

字符流

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

字符輸入流 

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

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

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

接下來(lái)通過(guò)一部分代碼來(lái)加深對(duì)它的理解吧!

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

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

字符輸出流 

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

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

接下來(lái)就通過(guò)代碼來(lái)加深對(duì)它的理解吧!

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();

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

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Java多線程并發(fā)編程和鎖原理解析

    Java多線程并發(fā)編程和鎖原理解析

    這篇文章主要介紹了Java多線程并發(fā)編程和鎖原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java?正則表達(dá)式URL?匹配與源碼全解析

    Java?正則表達(dá)式URL?匹配與源碼全解析

    在Web應(yīng)用開(kāi)發(fā)中,我們經(jīng)常需要對(duì)URL進(jìn)行格式驗(yàn)證,今天我們結(jié)合?Java?的?Pattern?和?Matcher?類(lèi),深入理解正則表達(dá)式在實(shí)際應(yīng)用中的強(qiáng)大功能,并剖析一段實(shí)際的?Java?示例源碼,感興趣的朋友一起看看吧
    2025-04-04
  • JAVA重復(fù)調(diào)用接口導(dǎo)致數(shù)據(jù)不一致的問(wèn)題解決

    JAVA重復(fù)調(diào)用接口導(dǎo)致數(shù)據(jù)不一致的問(wèn)題解決

    在使用JAVA進(jìn)行開(kāi)發(fā)時(shí),我們經(jīng)常會(huì)遇到要調(diào)用接口來(lái)獲取數(shù)據(jù)的情況,本文主要介紹了JAVA重復(fù)調(diào)用接口導(dǎo)致數(shù)據(jù)不一致的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題

    解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題

    這篇文章主要介紹了如惡化解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Spring源碼解析之編程式事務(wù)

    Spring源碼解析之編程式事務(wù)

    今天給大家?guī)?lái)的是關(guān)于Java Spring的相關(guān)知識(shí),文章圍繞著Spring編程式事務(wù)展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • java實(shí)現(xiàn)馬踏棋盤(pán)算法(騎士周游問(wèn)題)

    java實(shí)現(xiàn)馬踏棋盤(pán)算法(騎士周游問(wèn)題)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)馬踏棋盤(pán)算法,解決騎士周游問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問(wèn)題及解決

    idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問(wèn)題及解決

    這篇文章主要介紹了idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 手把手教你JAVA進(jìn)制之間的轉(zhuǎn)換

    手把手教你JAVA進(jìn)制之間的轉(zhuǎn)換

    這篇文章主要介紹了Java實(shí)現(xiàn)的進(jìn)制轉(zhuǎn)換,結(jié)合完整實(shí)例形式分析了Java實(shí)現(xiàn)二進(jìn)制、十六進(jìn)制、字符串、數(shù)組等相關(guān)轉(zhuǎn)換操作技巧,需要的朋友可以參考下
    2021-08-08
  • Java如何接收前端easyui?datagrid傳遞的數(shù)組參數(shù)

    Java如何接收前端easyui?datagrid傳遞的數(shù)組參數(shù)

    這篇文章分享一下怎么在easyui的datagrid刷新表格時(shí),在后端java代碼中接收datagrid傳遞的數(shù)組參數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-11-11
  • Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)

    Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)

    這篇文章主要介紹了Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)操作(一對(duì)一、一對(duì)多、多對(duì)多),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

赣州市| 大安市| 固始县| 日喀则市| 确山县| 新闻| 汶川县| 琼海市| 华亭县| 桃园市| 乌什县| 武汉市| 三门县| 大洼县| 高邮市| 寿阳县| 新疆| 星座| 石门县| 紫阳县| 陆河县| 迭部县| 贵德县| 罗源县| 稷山县| 衡山县| 凌海市| 营山县| 呼和浩特市| 于都县| 乌苏市| 淮南市| 钦州市| 平阴县| 德昌县| 科尔| 内黄县| 新化县| 凌云县| 石台县| 梁平县|