JavaIO——转换流、字符编码

本文介绍了如何使用转换流(如OutputStreamWriter和InputStreamReader)实现字节流与字符流之间的转换,并探讨了不同字符编码(如GBK、UTF-8、ISO8859-1等)的应用场景与乱码产生的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、转换流

转换流是将字节流变成字符流的流。

OutputStreamWriter:将字节输出流转换成字符输出流。

public class OutputStreamWriter extends Writer

提供的构造方法:

     public OutputStreamWriter(OutputStream out)

InputStreamReader:将字节输入流转换成字符输入流。

public class InputStreamReader extends Reader

提供的构造方法:

     public InputStreamReader(InputStream in)

/*
 * 字节流与字符流的转化
 * */
public class Test2{
	public static void main(String[] args) throws IOException {
		String singal = File.separator;
		//1.根据文件路径创建File对象
		File file = new File("C:"+singal+"Users"+singal+"lenovo"+singal+"DeskTop"+singal+"Test.txt");
		if(!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		OutputStream outputStream = new FileOutputStream(file);
		//字节流转化成字符流
		Writer writer = new OutputStreamWriter(outputStream);
		String string = "有点淡淡的忧伤";
		writer.write(string);
		writer.close();
	}
}

                          

这种操作在实际开发中并没有多么大的意义,我们主要用来分析FileOutputStreamFileInputStreamFileWriterFileReader之间的继承关系。

       

该类继承是典型的装饰者设计模型

优点:灵活,被装饰者可灵活组装需要的类。

缺点:类结构复杂,含有大量的其他类。

2、字符编码

1、常用的字符编码

(1)GBKgb2312:描述的是中文编码,其中gb2312中只含有简体中文,而GBK中可包含有繁体中文。

(2)UNICODE编码:是java语言中的默认编码,16进制编码,支持世界上所有语言的编码,缺点就是占用的内存过大,会造成网络传输的负担。

(3)UTF-8:支持所有的语言,通用编码。

(4)ISO8859-1:国际通用拜编码,不支持中文,浏览器页面默认使用此编码。

2、乱码分析:

要对乱码进行分析首先我们应该先明确的知道当前操作系统上使用的是什么编码(java默认编码):

public class Test2{
	public static void main(String[] args) throws UnsupportedEncodingException, IOException {
		//查看当前系统的字符编码(可以发现采用GBK编码)
		System.getProperties().list(System.out);
		OutputStream outputStream = new FileOutputStream("G:\\lemon\\testIO\\TestIO.java");
		//向文件中写入下列内容,并转化成ISO8859-1编码格式
		outputStream.write("hello你好!".getBytes("ISO8859-1"));
		outputStream.close();
	}
}

                

通过结果可以发现,出现了乱码,正是因为ISO8859-1不支持中文编码,所以导致有中文的地方出现了乱码。所以我们可以得出下列结论:

    乱码产生的原因:编码与解码的字符编码不一致。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值