1.转换流:把字节流转成字符流
InputStreamReader:把字节输入流转成字符输入流.OutputStreamWriter:把字节输出流转成字符输出流.
---------------------------------------------------------
为什么有字节转字符流,没有字符转字节流.
字节流可以操作一切文件(纯文本文件/二进制文件).
字符流是用来操作中文纯文本使用的,本身是对字节流的增强.
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset
读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter 是字节流通向字符流的桥梁:它使用指定的 charset
读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
文件拷贝例子:这里传入的是字节流,然后我们把字节流使用上面的转换流包装装换为字符流,然后再用缓冲流再包装,这样读写最高效了:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class IODemo6 {
public static void main(String[] args) {
//这里我使用了JDK1.7新特性:自动关闭资源,将资源的创建放到try语句的()中,资源使用完毕之后会自动关闭,不用我们手动释放
try
(
//创建源
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt")));
//创建目标
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fileCopy.txt")));
)
{
//装换再加上使用缓冲流包装,接下来的操作就是字符流的操作了
String len = null;
while ((len=reader.readLine())!=null) {
writer.write(len);
writer.newLine();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}