java字符流

java字符流

预备知识

编码

计算机只能存储字节数组,他也只能读取字节数组,

如何将字节数组识别成话?

人为规定好,字节和字母的对应关系,这样看到一串字节,就可以知道想表达的是什么。

ASCII编码例子:
I love you
73 32 108 111 118 101 32 121 111 117

常见编码

人们为了表示自己国家的文字来交流,发明了各种各样的编码。

GBK
优点:汉字两个字节,字母一个字节表示。
缺点:只适合与中国地区使用,只兼容汉语。

windows 在中国大陆编码ANSI默认就对应了GBK

UTF-8
可变长编码,一个或多个字节表示一个字符。
优点: 完美兼容ASCII码 ,存储ASCII范围里的字符时,只占一个字节。支持各国语言。
缺点:除ASCII外都占多个字节,比如一个汉字占3个字节。可变长编码导致解析字符数组性能较差。
UTF-16
定长编码,每个字符两个字节(无论中文字符和是英文字符)。java内部Char数组使用的就是UTF-16编码,所以char占2个字节。
优点:方便解码。
缺点:ASCII也是2个字节,如果英文字母较多的字符串,则会较占地方。并且新扩展的Unicode已经大于65536个字符,大于两个字节表示的范围,所以有时候需要4个字节来表示一个字符。
UTF-32
4个字节表示一个字符。定长编码。
优点:和Unicode字符集上字符一一对应。
缺点:浪费空间。
java字符流

字符流,就是指定好编码再读取或写入,将外部的字节流按照指定编码转化成java内部的编码存储。java内部编码是UTF-16.

	package 指针23期java教学;
	
	import java.io.BufferedInputStream;
	import java.io.BufferedOutputStream;
	import java.io.FileInputStream;
	import java.io.FileOutputStream;
	import java.io.FileReader;
	import java.io.FileWriter;
	import java.io.IOException;
	import java.io.InputStreamReader;
	import java.io.OutputStreamWriter;
	import java.io.Reader;
	import java.io.Writer;
	import java.nio.CharBuffer;
	
	public class encode {
		public static void main(String[] args) {
			
			char[] array=new char[512];
			try(
					//Reader in=new FileReader("test.txt"); 默认使用ANSI编码来读取。
					//指定编码来读取。
					Reader in= new InputStreamReader(new BufferedInputStream(new FileInputStream("test.txt")),"GBK");
					
					//Writer out=new FileWriter("tttt"); 默认使用ANSI编码去写入。
					//指定编码来写入。
					Writer out=new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream("tttt.txt")),"utf-8");
					
					){
				
				/*
				 out.write("测试数据");
				 out.flush();  字符流写入必须flush才能确保一定输出到目标。close时也会调用flush。
				 */
				char buff[]=new char[512];
				while(in.read(buff)!=-1){
					System.out.println(buff);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值