日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java io字符流读入英文_Java IO 系列教程(四)-字符输入流(2)

發(fā)布時(shí)間:2023/12/2 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java io字符流读入英文_Java IO 系列教程(四)-字符输入流(2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文介紹字符輸入流

在前面一節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。