Java IO流中提供了两种用于将字节流转换为字符流的转换流——InputStreamReader和OutputStreamWriter。
其中,InputStreamReader用于将字节输入流转换为字符输入流,OutputStreamWriter用于将字节输出流转换为字符输出流。
使用转换流可以在一定程度上避免乱码,还可以在使用时制定编码格式(比如UTF-8、GBK、GB2312、ISO8859-1等)
一、InputStreamReader
InputStreamReader是Reader的子类,可以将InputStream(字节流)转换成Reader(字符流)。
构造方法:
InputStreamReader(InputStream in); //创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs) ;//创建一个使用给定字符集的InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) ;//创建一个使用给定字符集解码器的InputStreamReader。
InputStreamReader(InputStream in, String charsetName) ;//创建一个使用命名字符集的InputStreamReader。
常用方法:
void close() ;//关闭流并释放与之相关联的任何系统资源。
String getEncoding() ;//返回此流使用的字符编码的名称。
int read() ;//读一个字符。
int read(char[] cbuf, int offset, int length) ;//将字符读入数组的一部分。
boolean ready() ;//告诉这个流是否准备好被读取。
示例代码:
public static void transReadNoBuf() throws IOException {
/**
* 没有缓冲区,只能使用read()方法。
*/
//读取字节流
// InputStream in = System.in;//读取键盘的输入。
InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。
//将字节流向字符流的转换。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节.
InputStreamReader isr = new InputStreamReader(in);//读取
// InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\demo.txt"));//综合到一句。
char []cha = new char[1024];
int len = isr.read(cha);
System.out.println(new String(cha,0,len));
isr.close();
}
public static void transReadByBuf() throws IOException {
/**
* 使用缓冲区 可以使用缓冲区对象的 read() 和 readLine()方法。
*/
//读取字节流
// InputStream in = System.in;//读取键盘上的数据
InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。
//将字节流向字符流的转换。
InputStreamReader isr = new InputStreamReader(in);//读取
//创建字符流缓冲区
BufferedReader bufr = new BufferedReader(isr);//缓冲
// BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。
/* int ch =0;
ch = bufr.read();
System.out.println((char)ch);*/
String line = null;
while((line = bufr.readLine())!=null){
System.out.println(line);
}
isr.close();
}
二、OutputStreamWriter
OutputStreamWriter是Writer的子类,可以将OutputStream(字节流)转换成Writer(字符流)。
构造方法:
OutputStreamWriter(OutputStream out) ;//创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) ;//创建一个使用给定字符集的OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc) ;//创建一个使用给定字符集编码器的OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) ;//创建一个使用命名字符集的OutputStreamWriter。
常用方法:
void close() ;//关闭流,先刷新。
void flush() ;//刷新流。
String getEncoding() ;//返回此流使用的字符编码的名称。
void write(char[] cbuf, int off, int len) ;//写入字符数组的一部分。
void write(int c) ;//写一个字符。
void write(String str, int off, int len) ;//写一个字符串的一部分。
示例代码:
public static void transWriteNoBuf() throws IOException {
OutputStream out = System.out;//打印到控制台
// OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件
OutputStreamWriter osr = new OutputStreamWriter(out);//输出
// OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//两句可以综合到一句。
// int ch = 97;//a
// int ch = 20320;//你
// osr.write(ch);
String str = "你好吗?";//你好吗?
osr.write(str);
osr.flush();
osr.close();
}
public static void transWriteByBuf() throws IOException {
// OutputStream out = System.out;//打印到控制台。
OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件。
OutputStreamWriter osr = new OutputStreamWriter(out);//输出
// OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//综合到一句。
BufferedWriter bufw = new BufferedWriter(osr);//缓冲
// int ch = 97;//a
// int ch = 20320;//你
// osr.write(ch);
String str = "你好吗?\r\n我很好!";//你好吗?
bufw.write(str);
bufw.flush();
bufw.close();
}