转换流 InputStreamReader和InputStreamWriter完成字符与字符编码字节的转换,在字节流和字符流间架起了一道桥梁。类FileReader和FileWriter分别是两个转换流的子类,实现文件读写访问
1、转换输入流 InputStreamReader
BufferedReader in=new BufferedReader( new InputStreamReader(System.in));
String x=in.readLine();
【说明】 标准输入(键盘)提供的数据是字节形式的,实际上,从键盘输入的数据是字符系列,转换成字符流更符合应用的特点,因此使用InputStreamReader将字节流转换为字符流,又为了能一次性从键盘输入一 行字符串,再用BufferedReader对字符流进行包装处理,如图,进而用BufferedReader 的readLine()方法读取一行字符串。
类InputStreamReader的常用构造方法
- public InputStreamReader(InputStream in):
创建转换输入流,按默认字符集的编码从输入流读数据;
- public InputStreamReader(InputStream in,Charset c):
创建转换输入流,按指定字符集的编码从输入流读数据;
- public InputStreamReader(InputStream in, String enc)throws UnsupportedEncodingException
创建转换输入流,按名称所指字符集的编码从输入流读数据。
例:
InputStream filein = new FileInputStream(file);
Reader in = new InputStreamReader(filein, “ISO-8859-1”);
按“ISO-8859-1”字符集编码从文件读数据,并将字节数据转换为相应的UTF-16字符。中文字符会变成“??”,也就是出现乱码。
支持汉字的编码字符集有GB2312、GBK、UTF-8、UTF-16。其中GBK是GB2312的扩展,它们均是双字节编码,UTF-16采用定长的双字节,而UTF-8采用变长字节表示不同字符。
InputStreamReader isr=null;
try {
isr=new InputStreamReader(new FileInputStream(“paper.txt”), "gbk"); //gbk,utf-8
}catch(FileNotFoundException e) {
System.out.println("file not found");
}
BufferedReader in=new BufferedReader(isr);
String x=in.readLine();
while(x!=null)
{
System.out.println(x);
x=in.readLine();
}
2、转换输出流OutputStreamWriter
类OutputStreamWriter是Writer的子类。将UTF-16字符转换为指定的字符编码形式写入到字节输出流。
- 构造方法有:public OutputStreamWriter (OutputStream out):
创建转换输出流,按默认字符集的编码往输出流写数据。
- public OutputStreamWriter (OutputStream out,Charset c):
创建转换输出流,按指定字符集的编码往输出流写数据。
- public OutputStreamWriter (OutputStream out,String enc) throws UnsupportedEncodingException :
创建转换输出流,按名称所指字符集的编码往输出流写数据。
String s="hello,大家好";
OutputStreamWriter osw=null;
try {
osw=new InputStreamReader(new FileOutputStream("x.txt"),"utf-8");
}catch(FileNotFoundException e){
System.out.println("file not found");
}
try {
osw.write(s);
osw.close();
}catch(IOException e){}