总结
- InputStreamReader是从字节流到字符流的桥梁, 它读取字节并使用指定的java.nio.charset.Charset将其解码为字符。它使用的字符集可以通过名称指定,也可以显式指定,或者可以接受平台的默认字符集,实质是通过字符集创建字符集解码器CharsetDecoder,通过解码器实现读取字节并转换成字符
- 每次调用InputStreamReader的read方法之一都可能导致从底层字节输入流读取一个或多个字节,为了实现字节到字符的高效转换,可以从底层流中提前读取比满足当前读取操作所需的更多字节
- 为了达到最高效率,考虑在缓冲区读取器BufferedReader中封装一个输入流读取器InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader类方法
构造方法
方法名 | 作用 |
---|
InputStreamReader(InputStream in) | 创建使用默认字符集的InputStreamReader转换流,InputStream是字节流 |
InputStreamReader(InputStream in, String charsetName) | 创建使用给定命名字符集的InputStreamReader转换流,InputStream是字节流,charsetName是字符集名字 |
InputStreamReader(InputStream in, Charset cs) | 创建使用给定字符集的InputStreamReader转换流,InputStream是字节流,Charset是字符集的Java对象实现 |
InputStreamReader(InputStream in, CharsetDecoder dec) | 创建使用给定字符集解码器的InputStreamReader转换流,InputStream是字节流,CharsetDecoder是字符集解码器,上面的三个构造函数最终都会创建一个对应的字符集解码器,解码器负责将字节流解码为字符 |
操作方法
方法名 | 作用 |
---|
String getEncoding() | 返回此流正在使用的字符编码的名称 |
int read() | 读取单个字符,调用字符集解码器CharsetDecoder读取一个或几个字节解码为一个字符,返回的int是字符的ASCALL编码 |
int read(char cbuf[], int offset, int length) | 读取多个字符填充字符数组,从字符数组下标offset处开始填充,填充length个字符,底层调用字符集解码器CharsetDecoder读取多个字节转为多个字符,并写入字符数组cbuf中,返回的int是读取的字符个数 |
boolean ready() | 判断此流是否已准备好读取。如果InputStreamReader的输入缓冲区不为空,或者可以从基础字节流读取字节,则InputStreamReader已准备就绪,底层调用字符集解码器CharsetDecoder的ready方法 |
void close() | 关闭InputStreamReader转换流,底层调用字符集解码器CharsetDecoder的close方法,关闭字符集解码器 |