InputStreamReader(字符输入转换流)继承于Reader,OutputStreamWriter(字符输出转换流)继承于Writer。它们是字节流和字符流之间的“桥梁”。我们只需要记住,当要操作字节和字符串时,用着两个当纽带来操作。
有些人学过FileReader和FileWriter可能就有点懵了,因为感觉都是字符啥的,为啥搞这么麻烦。这样来说吧,一个字节是8位,而一个字符在GBK编码下占2个字节,即16位,在UTF-8编码下占三个字节,即24位。InputStreamReader和OutputStreamWriter作用于字节,而FileReader和FileWriter作用于字符,显然两者直接作用有差别的。
这两者的常用方法是:read(),读取单个字符;read(char[] cbuf,int off,int len),将字符读入数组中的某一部分;write(int c),写入单个字符;write(char[] cbuf,int off,int len),写入字符数组的某一部分;write(String str,int off,int len),写入字符串的某一部分;close()关闭该流。
下面我们通过实例代码来对其进行学习:
①进行文件的拷贝
@Test
public void t1() throws Exception{
InputStreamReader isr = new InputStreamReader(new FileInputStream("H:\\javaio\\copy01.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("H:\\javaio\\copy02.txt"));
char[] cbuf = new char[1024];
int len;
while((len = isr.read(cbuf)) != -1){
osw.write(cbuf, 0, len);
}
osw.close();
isr.close();
}
②向文件写入数据,并设置写入编码的格式
@Test
public void t2() throws Exception{
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("H:\\javaio\\test.txt"),"GBK");
osw.write("我是测试用例!");
osw.close();
}
③读取文件
@Test
public void t3() throws Exception{
InputStreamReader isr = new InputStreamReader(new FileInputStream("H:\\javaio\\test.txt"),"GBK");
char[] cbuf = new char[1024];
int len;
while((len = isr.read(cbuf)) != -1){
System.out.println(new String(cbuf,0,len));
}
isr.close();
}