java中的位元組流和字元流的儲存比較

2021-06-17 16:10:20 字數 1578 閱讀 8777

用幾個常用型別的資料來比較位元組流和字元流的區別

int a=5;

boolean b=true;

char c='g';

string d="你好";

使用字元流列印以上型別的資料到檔案中:

printwriter dos =new printwriter(new bufferedwriter(new filewriter("c:")));

dos.print(a);

dos.print(b);

dos.print(c);

dos.print(d);

結果如下:

a是5b是true

c是gd是你好

字元流完全保證了和我們輸入的字元保持一致

再看看位元組流

dataoutputstream dos =new dataoutputstream(new fileoutputstream("c:"));

dos.writeint(a);

dos.writeboolean(b);

dos.writechar(c);

dos.writeutf(d);

dos.writechars(d);

dos.writebytes(d);

結果是二進位制檔案,我們用十六進製制編輯器開啟它

a是00 00 00 05,int是四個位元組

b是01,布林型變數是乙個位元組

c是00 47,char是兩個位元組

d分別用3個不同的函式列印在檔案中

第乙個是00 06 e4 bd a0 e5 a5 bd,前面的00 06是writeutf加上去的,是位元組的數目,後面六個位元組是"你好"的utf編碼,每個漢字3個位元組

第二個是4f 60 59 7d,這是"你好"的big endian的unicode編碼,每個漢字2個位元組

第三個是60 7d,這是從4f 60 59 7d中分別取得兩個漢字的低位元組

進一步說明

用記事本儲存不同的編碼檔案,檔案的頭部會有一些標記來識別檔案的編碼型別,用記事本的另存為就可以儲存不同編碼型別的檔案,然後用記事本開啟時就可以正確識別編碼,如果用十六進製制編輯器開啟它們就會看到用來識別編碼型別的標記被寫在檔案頭部,這些型別說明如下:

ef bb bf utf-8

ff fe utf-16/ucs-2, little endian

fe ff utf-16/ucs-2, big endian

ff fe 00 00 utf-32/ucs-4, little endian.

00 00 fe ff utf-32/ucs-4, big-endian.

utf-8儲存乙個字元時,長度為1-3個位元組,也就是8bit-24bit。

其中code<= 007f的,儲存為1個位元組

(code >= 0080) && (code <= 0x07ff)的,儲存為2個位元組

code>0800的,儲存為3個位元組

"你好"的gb2312編碼是c4 e3 ba c3,漢字大於0800,所以每個漢字儲存為3個位元組

little endian:低位址存放位元組低位,x86是這種順序

big endian:低位址存放位元組高位,網路位元組序是這種順序

JAVA中的位元組流和字元流的轉換

以字元為導向的stream基本上有與之相對應的以位元組為導向的stream,兩個對應類實現的功能相同,只是操作時的導向不同 1 位元組輸入流轉換為字元輸入流 inputstreamreader是位元組流向字元流的橋梁,它使用指定的charset讀取位元組並將其解碼為字元,它使用的字符集可以由名稱指定...

Java位元組流和字元流的區別

簡單來說 位元組流不使用快取,字元流使用快取。位元組流直接把資料寫到檔案,而字元流先把資料寫到快取,再寫到檔案。寫檔案時 使用位元組流的時候,wirte之後,就算沒有關閉流 close方法 程式也把資料寫到檔案了 使用字元流的時候,write之後,如果沒有關閉流,開啟檔案後發現資料並沒有寫進去。當時...

java中的位元組流和字元流的儲存比較

引用 用幾個常用型別的資料來比較位元組流和字元流的區別 int a 5 boolean b true char c g string d 你好 使用字元流列印以上型別的資料到檔案中 printwriter dos new printwriter new bufferedwriter new file...