InputStreamReader
InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。一次只读一个字符。
构造函数
- 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) //将字符读入数组中的某一部分。
OutputStreamWriter
OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。每次调用 write()方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。一次只写一个字符。
构造函数
- OutputStreamWriter(OutputStream out) //创建使用默认字符编码的 OutputStreamWriter
- OutputStreamWriter(OutputStream out, String charsetName) //创建使用指定字符集的 OutputStreamWriter。
- OutputStreamWriter(OutputStream out, Charset cs) //创建使用给定字符集的 OutputStreamWriter。
- OutputStreamWriter(OutputStream out, CharsetEncoder enc) //创建使用给定字符集编码器的OutputStreamWriter。
常用方法
- 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 ReaderWriterDemoPractice()throws IOException{
// 复制StringCharsetNameQuestion.java文件
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java"),"UTF-8");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestionCopy.txt"),inputStreamReader.getEncoding());
char[] chars = new char[1024] ;
int length = 0 ;
while((length = inputStreamReader.read(chars)) != -1){
outputStreamWriter.write(chars,0,length);
}
outputStreamWriter.close();
inputStreamReader.close();
}
特别注意:编码以及解码问题
延伸
public static void FileReaderWriterTest()throws IOException{
FileReader fileReader = new FileReader(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java");
FileWriter fileWriter = new FileWriter(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestionCopy2.txt");
int length ;
char[] chars = new char[1024];
while ((length = fileReader.read(chars))!=-1){
fileWriter.write(chars,0,length);
}
fileWriter.close();
fileReader.close();
}
public static void BufferReaderWriter()throws IOException{
//BufferedReader bufferedReader = new BufferedReader(new FileReader(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java")) ;
// 最好将new InputstreamReader(new FileInputStream())的方式方式,因为这样设定编码方式
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java"))) ;
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestionCopy3.txt"));
// 一次读取一个字符数据
char[] chars = new char[1024];
int length = 0 ;
while((length = bufferedReader.read(chars))!=-1){
bufferedWriter.write(chars,0,length);
}
bufferedWriter.close();
bufferedReader.close();
}
}
** 注意**整体方法都差不多,参照JDK1.8 API查询一下即可,具体的底层逻辑需要去查看源码