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();
}
}
综上所述:编码和解码需要对应相应的编码格式。
建议自己敲一遍代码实现一下,记忆更深刻