java.io.OutputStreamWriter
java.io.OutputStreamWriter extends Writer
OutputStreamWriter是字符流通向字节流的桥梁,可使用指定的charset ,将其写入流中的字符编码为字节
构造方法:
*OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
*OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter
参数:
*OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
*String charsetName:指定编码名称,不区分大小写,默认为UTF-8格式
java.io.InputStreamReader
java.io.InputStreamReader extends Reader
InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的charset将其解码为字符 。
构造方法:
*InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
*InputStreamReader(InputStream in, String charsetName)
创建一个使用命名字符集的InputStreamReader。
参数:
*OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
*String charsetName:指定编码名称,不区分大小写,默认为UTF-8格式
测试
使用OutputStreamWriter和InputStreamReader 进行读取和写入,测试结果表明:
*1使用GBK格式写中文不能用utf-8正确读取
*2使用GBK格式写ASCII中的字符可以用utf-8正确读取
原因:
1因为GBK下中文占2字节,UTF-8下中文占3字节。
2因为GBK和UTF-8两种编码方式都兼容了ASCII编码格式
测试例程如下:
public static void main(String[] args) throws IOException {
OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream("osw.txt",false),"GBK");
for(int i=0;i<5;i++) {
osw.write('a');
}
osw.write("你好");
//写入结束
osw.close();
//写入结束后再读取
//使用GBK格式写中文不能用utf-8正确读取,因为GBK下中文占2字节,UTF-8下中文占3字节
//InputStreamReader isr=new InputStreamReader(new FileInputStream("osw.txt"),"GBK") ;
InputStreamReader isr=new InputStreamReader(new FileInputStream("osw.txt"),"Utf-8") ;
int len=0;
while((len=isr.read())!=-1) {
System.out.print((char)len);
}
isr.close();
}
应用案例:文本格式转换——将Utf-8格式文档转存为GBK格式
public static void main(String[] args) throws IOException {
//创建读取
InputStreamReader isr=new InputStreamReader(new FileInputStream("isr.txt"),"Utf-8") ;
//创建写入
OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream("osw.txt",false),"GBK");
//读取文件并写入
int len=0;
while((len=isr.read())!=-1) {
osw.write(len);
}
osw.close();
isr.close();
}