java IO流之InputStreamReader OutputStreamWriter 转换流
- 作用:将字节流和字符流进行转换。
- 转换流属于字符流
- InputStreamReader :字节输入流 -->字符的输入流
- OutputStreamWriter : 字符输出流 -->字节的输出流
InputStreamReader
-
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
-
每次调用 InputStreamReader 中的一个
read()
方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 -
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
构造方法摘要
- InputStreamReader(InputStream in[, Charset cs])
- 创建使用给定(未指定则使用默认字符集)字符集的 InputStreamReader
- InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。- InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
方法
Modifier and Type | Method | Description |
---|---|---|
void | close() | 关闭该流并释放与之关联的所有资源。 |
String | getEncoding() | 返回此流使用的字符编码的名称。 |
int | read() | 读取单个字符。 |
int | read(char[] cbuf, int offset, int length) | 将字符读入数组中的某一部分。 |
boolean | ready() | 判断此流是否已经准备好用于读取。 |
int | read(char[] cbuf) | 将字符读入数组。 |
int | read(CharBuffer target) | 试图将字符读入指定的字符缓冲区。 |
long | skip(long n) | 跳过n个字符。 |
void | reset() | 重置该流。 |
void | mark(int readAheadLimit) | 标记流中的当前位置。 |
boolean | markSupported() | 判断此流是否支持 mark() 操作。 |
- 从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
OutputStreamWriter
-
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
-
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
-
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
-
代理对surrogate pair是一个字符,它由两个
char
值序列表示:高 high代理项的范围为 ‘\uD800’ 到 ‘\uDBFF’,后跟范围为 ‘\uDC00’ 到 ‘\uDFFF’ 的低 low 代理项。错误代理元素malformed surrogate element 指的是后面不跟低代理项的高代理项,或前面没有高代理项的低代理项。 此类总是使用字符集的默认替代序列 替代错误代理元素和不可映射的字符序列。如果需要更多地控制编码过程,则应该使用 CharsetEncoder 类。
构造方法摘要
OutputStreamWriter(OutputStream out[, Charset cs])
创建使用给定(未指定则使用默认字符集)字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
创建使用给定字符集编码器的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
方法
Modifier and Type | Method | Description |
---|---|---|
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) | 写入字符串的某一部分。 |
void | write(char[] cbuf) | 写入字符数组cbuf。 |
void | write(String str) | 写入字符串str。 |
Write | append(char c) | 将指定字符c添加到此 writer。 |
Writer | append(CharSequence csq) | 将指定字符序列csq添加到此 writer。 |
Writer | append(CharSequence csq, int start, int end) | 将指定字符序列的子序列添加到此 writer。 |
- 从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
分步实现
以复制文件为例
-
源文件目标文件创建实例
//1.源文件目标文件创建实例 File f1 = new File("d:\\Test.txt"); File f2 = new File("d:\\Demo.txt");
-
输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream
//2.输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream FileInputStream fis = new FileInputStream(f1); InputStreamReader isr = new InputStreamReader(fis,"utf-8");//指定源文件打开格式utf-8
-
输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream
//3.输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream FileOutputStream fos = new FileOutputStream(f2); OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");//指定目标文件编码格式gbk
-
操作内容
char[] ch = new char[20]; int len = isr.read(ch); while(len!=-1){ osw.write(ch,0,len); len = isr.read(ch); }
-
关闭流,倒着关闭,如果处理流包裹着节点流的话,那么其实只要关闭高级流(处理流),那么里面的字节流也会随之被关闭。
osw.close(); isr.close();
完整程序
try-catch-finally
public class IOsrwTC {
public static void main(String[] args){
//1.源文件目标文件创建实例
File f1 = new File("IOStream/src/testfile/test.txt");
File f2 = new File("IOStream/src/testfile/demo.txt");
FileInputStream fis = null;
InputStreamReader isr = null;
FileOutputStream fos = null;
OutputStreamWriter osw = null;
try {
//2.输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream
fis = new FileInputStream(f1);
isr = new InputStreamReader(fis,"utf-8");
//3.输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream
fos = new FileOutputStream(f2);
osw = new OutputStreamWriter(fos,"gbk");
//4.开始动作:
char[] ch = new char[20];
int len = isr.read(ch);
while(len!=-1){
osw.write(ch,0,len);
len = isr.read(ch);
}
} catch (FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
System.out.println("文件找不到或编码格式不支持");
} catch (IOException e) {
e.printStackTrace();
}finally{
//5.关闭流:
try {
if (osw != null) {
osw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (isr != null) {
isr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
try-with-resource
import java.io.*;
public class IOsrwTC {
public static void main(String[] args){
//1.源文件目标文件创建实例
File f1 = new File("IOStream/src/testfile/test.txt");
File f2 = new File("IOStream/src/testfile/demo.txt");
try (
//2.输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream
FileInputStream fis = new FileInputStream(f1);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
//3.输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream
FileOutputStream fos = new FileOutputStream(f2);
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
){
//4.开始动作:
char[] ch = new char[20];
int len = isr.read(ch);
while(len!=-1){
osw.write(ch,0,len);
len = isr.read(ch);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件找不到");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
System.out.println("编码格式不支持");
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
System.out.println("编码格式不支持");
} catch (IOException e) {
e.printStackTrace();
}
}
}