InputStreamReader(读取)、OutputStreamWriter(写入)
他们是字节流通向字符流的桥梁,它使用指定的 charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或者显示给定,否则可能接受平台默认的字符集。
主要用于字节流到字符流的转换,以及以指定编码读取和写入数据。注意当没有指定编码时,会使用开发平台的默认编码
主要方法:
1.构造方法
InputStreamReader(InputStream in):创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in,Charset cs):创建使用给定字符集的 InputStreamReader。也可以使用String charsetName参数代替Charset cs
OutputStreamWriter(OutputStream out):创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out,Charset cs):创建使用给定字符集的 OutputStreamWriter。也可以使用String charsetName替换Charset cs
2.其他方法
String getEncoding() 返回此流使用的字符编码的名称。
int read()
读取单个字符。 void write(int c) 写入单个字符。
int
read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。
void
write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
代码演示:
字节流转换为字符流
//字节流转换为字符流
@Test
public void demo1() throws IOException{
//下面就是通过转换流的套接,完成了(System.in)InputStream到BufferReader的转换。
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr); //转换流相当于字符流,所以可以当做,字符流套接的参数
//下面就是通过转换流的套接,完成了FileOutputStream到BufferedWriter的转换
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
String str=null;
while((str=br.readLine())!=null){
if(str.equalsIgnoreCase("over")){
break;
}
System.out.println(str.toUpperCase());
bw.write(str);
bw.write("\n");
}
isr.close();
br.close();
bw.close();
}
结果:
zi jie liu dao zi Fu liu de mo zhuan huan
ZI JIE LIU DAO ZI FU LIU DE MO ZHUAN HUAN
over
以平台默认编码进行读写
//以平台指定编码进行读写
@Test
public void demo2() throws IOException{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("默认.txt"));
osw.write("平台默认编码"); //这里是我的MyEclipse的编码utf_8;
osw.close();
InputStreamReader isr=new InputStreamReader(new FileInputStream("默认.txt"));
BufferedReader br=new BufferedReader(isr);
String str=null;
while((str=br.readLine())!=null){
System.out.println(str);
}
isr.close();
br.close();
}
结果
平台默认编码
//指定编码进行读写
@Test
public void demo4() throws IOException{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");
osw.write("指定为gbk编码");
osw.write("\n");
osw.write("指定为gbk编码");
osw.write("\n");
osw.close();
InputStreamReader isr=new InputStreamReader(new FileInputStream("gbk.txt"),"gbk");
char b[]=new char[8];
int len=0;
while((len=isr.read(b))!=-1){
String str=new String(b,0,len);
System.out.print(str);
}
OutputStreamWriter osw2=new OutputStreamWriter(new FileOutputStream("utf8.txt"),"utf-8");
osw2.write("\n");
osw2.write("指定为utf-8编码");
osw2.write("\n");
osw2.write("指定为utf-8编码");
osw2.write("\n");
osw2.close();
InputStreamReader isr2=new InputStreamReader(new FileInputStream("utf8.txt"),"utf-8");
char b2[]=new char[8];
int len2=0;
while((len2=isr2.read(b2))!=-1){
String str=new String(b2,0,len2);
System.out.print(str);
}
}
结果
指定为gbk编码
指定为gbk编码
指定为utf-8编码
指定为utf-8编码