Java io字符流读入英文_Java IO 系列教程(四)-字符输入流(2)
本文介紹字符輸入流
在前面一節(jié)中,我們向一個(gè)文件中寫入了一些字符,通過圖片可以看出總共是6個(gè)中文字符和一個(gè)換行,總共是20個(gè)字節(jié),可以推算出字符編碼是utf-8,每個(gè)漢子占3三個(gè)字節(jié)。本文就用字符輸入流來讀一下。
代碼部分
package io.charStream;
import java.io.FileInputStream;
import java.io.FileReader;
/**
* @Author: micro cloud fly
* @Description: 字符流學(xué)習(xí)-FileReader
* @Date: Created in 10:20 上午 2020/10/20
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
//文件內(nèi)容為Abcdefg,當(dāng)文件中有中文時(shí),utf-8編碼的每個(gè)中文占三個(gè)字節(jié),那么每個(gè)字節(jié)讀取的時(shí)候打印出來就是亂碼了
FileInputStream inputStream = new FileInputStream("/Users/java0904/Pictures/imgs/1.txt");
//int count = 0;
打印
//while((count=inputStream.read())!=-1){
// System.out.println((char)count);
//}
文件內(nèi)容為:希望你開心hah234,打印出來的是一片亂碼
//inputStream = new FileInputStream("/Users/java0904/Pictures/imgs/2.txt");
//count = 0;
打印
//while((count=inputStream.read())!=-1){
// System.out.println((char)count);
//}
//改為用字符流進(jìn)行讀取,filereader內(nèi)部做了編碼的確認(rèn)工作,即使有中文也有英文,讀取也不會(huì)亂碼,是不是很神奇
FileReader fileReader = new FileReader("/Users/java0904/Pictures/imgs/filewriter.txt");
//int count = 0;
//while ((count = fileReader.read()) != -1) {
// System.out.println((char) count);
//}
//也可以一次讀取多個(gè)
int count = 0;
char[] cbuf = new char[1];
while ((count = fileReader.read(cbuf)) != -1) {
System.out.println("count:"+ count +", "+new String(cbuf, 0, count));
}
System.out.println("----");
}
}
輸出
count:1, 你
count:1, 好
count:1,
count:1,
count:1, 我
count:1, 是
count:1, 小
count:1, 微
----
問題
以下這段代碼需要格外注意下
int count = 0;
char[] cbuf = new char[1];
while ((count = fileReader.read(cbuf)) != -1) {
System.out.println("count:"+ count +", "+new String(cbuf, 0, count));
}
我們都知道java中char類型占用2個(gè)字節(jié),而文件中的中文是占用3個(gè)字節(jié),那么為什么一個(gè)2字節(jié)的char數(shù)組,可以裝入3字節(jié)的漢字呢?
這其中一定是java搞的鬼了。
原因
java 是采用Unicode編碼,它為每種語言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。通常Unicode占用兩字節(jié),也就說Unicode用兩字節(jié)就能表示世界上全部語言。UTF-8(是針對(duì)Unicode的一種可變長度字符編碼。重點(diǎn)是“可變”,UTF-8根據(jù)存儲(chǔ)的字符類型不一樣,他所占的字節(jié)是不一樣的,例如,英文時(shí),只占用1個(gè)字節(jié),中文時(shí)則膨脹為3個(gè)字節(jié)。
編譯后生成的class文件會(huì)把漢字轉(zhuǎn)化成Unicode的兩字節(jié),也就說Java內(nèi)部或者說Jvm內(nèi)部對(duì)字符的編碼計(jì)算基于Unicode雙字節(jié),而外部顯示存儲(chǔ)則是用UTF-8,通過這種方式從而實(shí)現(xiàn)兩字節(jié)的Char存儲(chǔ)UTF-8編碼的字符。
總結(jié)
以上是生活随笔為你收集整理的Java io字符流读入英文_Java IO 系列教程(四)-字符输入流(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tim如何恢复聊天记录(腾讯tim怎么用
- 下一篇: 下载不了java应用程序_Java 7u