<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於使用位元組流操控中文時不是很方便,Java就提供了字元流來進行操控中文
實現原理:位元組流+編碼表
為什麼用位元組流進行復制帶有中文的文字檔案時沒有問題?
因為底層操作會自動進行位元組拼接成中文
怎樣識別該位元組是中文呢?
漢字在儲存時,無論是UTF-8還是GBK,第一個位元組都是負數用來提示
是一個系統支援的所有字元的集合,包括國家文字、標點符號、圖形符號、數位等
計算機要準確的儲存和識別各種字元集符號,就需要進行字元編碼,一套字元集必然至少有一套字元編碼
常見的字元集有ASCII字元集、GBXXX字元集、Unicode字元集等
GBK:最常用的中文碼錶,是在GB2312標準基礎上的擴充套件規範,使用了雙位元組編碼方案,共收錄了21003個漢字,完全相容GB2312標準,同時支援繁體漢字以及日韓漢字等
GB18030:最新的中文碼錶,收錄漢字70244個,採用多位元組編碼,每個字可以由1個、2個或4個位元組組成。支援中國少數民族的文字,同時支援繁體漢字以及日韓漢字等
為了表達任意語言的任意字元而設計,是業界的一個標準,也稱為統一碼、標準萬國碼;它最多使用4個位元組的數位來表達每個字母、符號,或者文字。有三種編碼方案:UTF-8、UTF-16、UTF32,最常用的是UTF-8
UTF-8:可以用來表示Unicode標準中的任意字元,它是電子郵件、網頁及其他儲存或傳送檔案的應用中,優先採用的編碼。網際網路工作小組要求所有的網際網路協定都必須支援UTF-8編碼格式。它使用一至四個位元組為每個字元編碼
128個US-ASCII字元,只需要一個位元組編碼
拉丁文等字元,需要兩個位元組編碼
大部分常用字(含中文),使用三個位元組編碼
其他極少使用的UniCode輔助字元,使用四個位元組編碼
總結:編碼時使用那種規則,解碼就需要採用對應的規則,否則會亂碼
byte[] getBytes():使用平臺預設的字元集將該String編碼為一系列位元組,將結果儲存到新的位元組陣列中
byte[] getBytes(String charsetName):使用指定的字元集將該String編碼為一系列位元組,將結果儲存到新的位元組陣列中
String(byte[]bytes):通過使用平臺的預設字元集解碼指定的位元組陣列來構造新的String
String(byte[]bytes,String charsetName):通過指定的字元集解碼指定的位元組陣列來構造新的String
IDEA中預設的編碼格式是UTF-8
字元流抽象基礎類別:
Reader:字元輸入流的抽象類
Writer:字元輸出流的抽象類
字元流中和編碼解碼問題相關的兩個類:
InputStreamReader:是從位元組流到字元流的橋樑:它讀取位元組,並使用指定的字元集將其解碼為字元。它使用的字元集可以由名稱指定,也可以被明確指定,或者可以接受平臺的預設字元集
構造方法:
InputStreamReader(InputStream in) | 建立一個使用預設字元集的InputStreamReader。 |
InputStreamReader(InputStream in, String charsetName) | 建立一個使用命名字元集的InputStreamReader。 |
OutputStreamWruter:是從字元流到位元組流的橋樑:使用自訂的字元集將寫入的字元編碼為位元組,它使用的字元集可以由名稱指定,也可以被明確指定,或者可以接受平臺的預設字元集
構造方法:
OutputStreamWriter(OutputStream out) | 建立一個使用預設字元編碼的OutputStreamWriter。 |
OutputStreamWriter(OutputStream out, String charsetName) | 建立一個使用命名字元集的OutputStreamWriter。 |
public class ConversionStreamDemo { public static void main(String[] args) throws IOException { //建立一個預設編碼格式的InputStreamReaderOutputStreamWriter InputStreamReader ipsr = new InputStreamReader(new FileInputStream("E:\abc.txt")); OutputStreamWriter opsw = new OutputStreamWriter(new FileOutputStream("E:\abc.txt")); //寫入資料 opsw.write("你好啊"); opsw.close(); //讀資料,方式一:一次讀取一個位元組資料 int ch; while ((ch = ipsr.read()) != -1) { System.out.print((char) ch); } ipsr.close(); } }
方法名 | 說明 |
void write(int c) | 寫一個字元 |
void write(char[] cbuf) | 寫入一個字元陣列 |
void write(char[] cbuf,int off,int len) | 寫入字元陣列的一部分 |
void write(String str) | 寫入一個字串 |
void write(String str,int off,int len) | 寫入一個字串的一部分 |
字元流寫資料需要注意緩衝區的問題,如果想要將緩衝區的資料載入出來需要在寫入方法後加上重新整理方法flush();
前三個方法與位元組流寫入方法使用相同,這裡重點介紹下面兩種方式
public class OutputStreamWriterDemo { public static void main(String[] args) throws IOException { //建立一個預設編碼格式的OutputStreamWriter物件 OutputStreamWriter opsw=new OutputStreamWriter(new FileOutputStream("E:\abc.txt")); //方式一:寫入一個位元組 opsw.write(97); opsw.flush();//如果需要在檔案中立即顯示輸入的資料,就需要加入重新整理方法 //方式二:寫入一個字元陣列 char[]ch={'a','b','c','二'}; opsw.write(ch); opsw.flush();//如果需要在檔案中立即顯示輸入的資料,就需要加入重新整理方法 //方式三:寫入一個字元陣列的一部分 opsw.write(ch,0,2); opsw.flush();//如果需要在檔案中立即顯示輸入的資料,就需要加入重新整理方法 //方式四:寫入一個字串 opsw.write("一二三"); opsw.flush();//如果需要在檔案中立即顯示輸入的資料,就需要加入重新整理方法 //方式五:寫入一個字串的一部分 opsw.write("三四五",1,2); opsw.flush();//如果需要在檔案中立即顯示輸入的資料,就需要加入重新整理方法 } }
方法名 | 說明 |
int read() | 一次讀取一個字元資料 |
int read(char[] cbuf) | 一次讀取一個字元陣列資料 |
public class InputStreamReadDemo { public static void main(String[] args) throws IOException { //建立一個預設編碼格式的InputStreamReader InputStreamReader ipsr=new InputStreamReader(new FileInputStream("E:\abc.txt")); //讀取資料,方式一一次讀取一個字元資料 int ch; while ((ch=ipsr.read())!=-1){ System.out.print((char) ch); } ipsr.close(); //方式二:一次讀取一個字元陣列資料 char []ch=new char[1024]; int len; while ((len=ipsr.read(ch))!=-1){ System.out.print(new String(ch,0,len)); } ipsr.close(); } }
小結:如果使用預設編碼格式的話,那麼字元輸入流InputStreamReader可以使用子類FileReader來替代,字元輸出流OutputStreamWriter可以使用其子類FileWriter來替代,兩者在使用預設編碼格式的情況下作用一致。
到此這篇關於Java 超詳細講解字元流的文章就介紹到這了,更多相關Java 字元流內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45