亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中字節流和字符流是什么

發布時間:2022-07-26 16:58:38 來源:億速云 閱讀:120 作者:iii 欄目:開發技術

本篇內容主要講解“Java中字節流和字符流是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java中字節流和字符流是什么”吧!

字節流和字符流 

Java中字節流和字符流是什么

在上圖中,橙色部分是抽象類,而藍色部分則是實現類

字節流 

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

字節輸入流 

下面是字節輸入流中經常會用到的構造器和方法:

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

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

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

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

字節輸入流并不適合所有的文件數據,由此而引出了字符輸入流。

字節輸出流 

下面是字節輸出流常用到的方法:

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

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

OutputStream outputStream = new FileOutputStream("File//data.txt",true);
//true表示可以對文件進行追加內容,若沒有true則會在關閉文件之后,進行寫文件的時候會對之前的內容進行覆蓋。
        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();

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

字符流

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

字符輸入流 

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

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

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

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

File file = new File("File//data.txt");
        //第一種構造器,參數是File類
        FileReader fileReader = new FileReader(file);
        //第二種構造器,參數是文件的絕對路徑或者相對路徑
        FileReader fileReader1 = new FileReader("File//data.txt");
        //第一種方法,一個一個字符讀取
        int len;
        while ((len = fileReader.read())!=-1){
            System.out.print((char) len);
        }
        //第二種方法,以字符數組進行讀取
        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

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

字符輸出流 

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

構造器說明
public FileWriter(File file)創建字符輸出流管道與源文件對象接通
public FileWriter(File file,boolean append)創建字符輸出流管道與源文件對象接通,可追加數據
public FileWriter(String filepath)創建字符輸出流管道與源文件路徑接通
public FileWriter(String filepath,boolean append)創建字符輸出流管道與源文件路徑接通,可追加
方法說明
void writer(int c)寫入一個字符
void writer (char [ ] buffer)寫入一個字符數組
void writer (char[ ]buffer,int off,int len)寫入字符數組的一部分
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();

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

附:字節流和字符流的區別

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

字節流默認不使用緩沖區;字符流使用緩沖區。

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

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

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

字節流和字符流的轉換

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

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

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

字節流與字符流主要的區別是他們的的處理方式。

到此,相信大家對“Java中字節流和字符流是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

思茅市| 安国市| 长乐市| 建昌县| 许昌市| 平顶山市| 东至县| 安义县| 盐山县| 浦北县| 五华县| 镇康县| 积石山| 万年县| 富平县| 永嘉县| 休宁县| 尉氏县| 龙门县| 光山县| 东兰县| 高要市| 海丰县| 苏尼特左旗| 郎溪县| 宿州市| 长子县| 武清区| 汉阴县| 旺苍县| 泰安市| 班玛县| 莱州市| 历史| 汉寿县| 建湖县| 察隅县| 上犹县| 黄龙县| 龙游县| 镇远县|