Java 字符流(InputStreamReader)和(OutputStreamWriter)编码解码问题

Java 字符流(InputStreamReader)和(OutputStreamWriter)编码解码问题

一、注意:字符的字符集问题

编码:
byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charseName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
解码:
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes,String charseName)
例1:

public class Hmoework_1_IO {
    
    
	public static void main(String[] args) throws UnsupportedEncodingException  {
    
    
		//定义一个字符串1:
		String s="中国";
		//byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
		byte[] bys1=s.getBytes();
		System.out.println(Arrays.toString(bys1));//[-28, -72, -83, -27, -101, -67] 默认字符集输出为三个字节表示一个汉字
		
		//定义两个字符串2:
		String a="中国";
		String b="中国";
		//byte[] getBytes(String charseName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
		byte[] bys2=a.getBytes("UTF-8");
		System.out.println(Arrays.toString(bys2));//[-28, -72, -83, -27, -101, -67] UTF-8的编码格式(三个字节表示一个汉字)
		byte[] bys3=b.getBytes("GBK");
		System.out.println(Arrays.toString(bys3));//[-42, -48, -71, -6] GBK的编码格式(两个字节表示一个汉字)
		
		//解码:!!!!!
		//String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
		String ss=new String(bys);
		System.out.println(ss);//中国  使用的是默认编码进行解码
		
		//String(byte[] bytes,String charesName):通过指定的字符集解码指定的字节数组来构造新的String
  		String ss2=new String(bys,"utf-8");
  		System.out.println(ss2);//中国 使用指定编码格式“UTF-8”进行解码
		String ss3=new String(bys,"gbk");
		System.out.println(ss3);//涓浗 使用指定编码格式“GBK”进行解码	
		
	}
}

通过实验我们可以得知:指定编码格式将字符集进行编码后需要用相应的编码格式进行解码

二、字符流中的编码解码问题
字符流抽象类:
Reader:字符输入流的抽象类
Writer:字符输出流的抽象类
字符流中的编码解码问题相关的两个类:
InputStreamReader
OutputStreamWriter
(都在java.io 包下,需要导包)
InputStreamReader:是从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
OutputStreamWriter:是从字符流到字节流的桥梁
使用指定的编码将写入的字符编码为字节
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

例2:

public class Hmoework_2_IO {
    
    
	public static void main(String[] args) throws IOException {
    
    
	//OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
		FileOutputStream fos=new FileOutputStream("C:\\Users\\86182\\Desktop\\01.txt");
		OutputStreamWriter osw=new OutputStreamWriter(fos);//可以给它两步合并成一步
		OutputStreamWriter osw2=new OutputStreamWriter(new FileOutputStream("C:\\Users\\86182\\Desktop\\02.txt"));//合并成一步
		osw.write("中国国");
		osw.close();
	
		osw2.write("中国国");
		osw2.close();
	//OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。 
		OutputStreamWriter osw3=new OutputStreamWriter(new FileOutputStream("C:\\Users\\86182\\Desktop\\03.txt"),"utf-8");//指定为UTF-8
		OutputStreamWriter osw4=new OutputStreamWriter(new FileOutputStream("C:\\Users\\86182\\Desktop\\04.txt"),"GBK");//指定为GBK
		osw3.write("中国国");
		osw3.close();
		
		osw4.write("中国国");//GBK指定编码出现乱码,那么需要相应的字符来进行解码
		osw4.close();
	//InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 
	//InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
		InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\Users\\86182\\Desktop\\04.txt"),"GBK");//指定读取的字符编码
		InputStreamReader isr2=new InputStreamReader(new FileInputStream("C:\\Users\\86182\\Desktop\\04.txt"),"GBK");
		
	//一次读取一个字符数据
		int ch;
		while((ch=isr.read())!=-1) {
    
    
			System.out.print((char)ch);//输出在控制台控制台不出现乱码
		}
		isr.close();
		
		
		
	//一次读取一个数组
		char[] cha=new char[1024];
		int ch;
		while((ch=isr2.read(cha))!=-1) {
    
    
			System.out.print(new String(cha,0,ch));//输出在控制台不出现乱码
		}
		isr2.close();
	}
}

综上所述:编码和解码需要对应相应的编码格式。
建议自己敲一遍代码实现一下,记忆更深刻

猜你喜欢

转载自blog.csdn.net/qq_45844443/article/details/109512922