InputStreamReader的使用
InputStream就是将字节输入流转换为字符输入流
- 也就相当于进行了一个解码
这里我们通过一个例子来理解InputStreamReader的使用
package IO流.转换流;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo {
public static void main(String[] args) throws IOException{
/*
创建字节节点输入流对象
*/
FileInputStream fis = new FileInputStream("Hello.txt");
/*
使用系统默认的字符集创建InputStreamReader对象
注意: 系统默认的字符集为UTF-8
*/
// InputStreamReader isr = new InputStreamReader(fis);
/*
这里使用UTF-8字符接来创建InputStreamReader对象
这个时候这里的第二个参数指明了字符集,具体使用哪个字符集,取决于文件Hello.txt保存时使用的字符集
这里指的是在硬盘上保存使用的字符集
我们使用指定字符集来创建InputStreamReader对象的时候,这个构造方法会出现一个编译时异常,
编码不支持异常 --- java.io.UnsupportedEncodingException
java.io.UnsupportedEncodingException继承与java.io.IOException
*/
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
/*
创建缓冲数组
*/
char [] chars = new char[1024];
/*
创建一个临时变量,用来存储read()方法的返回值
*/
int len = 0;
/*
进行文件的读取和写出(这里我们是写出到了控制台)
*/
while((len = isr.read(chars)) != -1){
/*
这里我们使用String的构造方法和使用String类的valueOf()方法都可以将char[]
转换为String
*/
// String s = new String(chars,0,len);
String s = String.valueOf(chars,0,len);
System.out.println(s);
}
/*
流资源的关闭 --- 关闭了外层流之后就不用关闭内层流了,因为我们关闭外层流的同时内层流也会跟着关闭
我们的外层流在这里就指的是转换流对象(也就是InputStreamReader对象)
我们的内层流在这里就是指的是字节节点输入流(也就是FileInputStream对象)
*/
isr.close();
}
}
结论:
- 我们的转换流也是属于字符流,那么我们转换流进行读取文件的时候使用的缓冲数组是char []
- 我们创建转换流对象的时候如果我们使用不指定字符集的构造方法 – 也就是只有一个参数的构造方法,这个时候我们默认使用系统默认的字符集,也就是UTF-8字符集,这个时候这个构造方法不会抛出异常
- 如果我么在创建转换流对象的时候如果我们使用了指定字符集的构造方法 – 也就是有两个参数的构造方法,这个时候我们就是使用我们参数中指定的字符集,这个时候由于我们提供的参数中的字符可能不合法,这个时候这个构造方法会抛出一个java.io.UnsupportedEncodingException
- java.io.UnsupportedEncodingException继承与java.io.IOException