在流转换之前,先来看看字节流和字符流有什么区别?
最大的区别是:字节流直接与终端文件进行数据交互(读入、输出),而字符流需要将数据经过缓冲区处理才与终端文件进行数据交互。
如在使用字节输出流OutputStream输出数据时,即使最后没有关闭输出流,内容也可以正常输出,但是如果使用的是字符输出流Writer(子类FileWriter),程序最后如果没有关闭字符输出流,就表示在缓冲区处理的内容不会被强制清空,所以就不会输出数据。如果有特殊情况,字符输出流无法关闭,可以使用flush()强制清空缓冲区!
进入正题:转换流用于将底层的字节流转换为字符流供子类使用。
(1)、OutputStreamWriter:
字节输出流转换为字符输出流;
类定义:public class OutputStreamWriter extends Writer;
构造方法:
public OutputStreamWriter(OutputStream out);// 创建使用默认字符集的字节输出流转换字符输出流对象
public OutputStreamWriter(OutputStream out, String charsetName) //创建指定字符集的字节输出流转换字符输出流对象
注明:默认的字符集码表使用的是UTF-8
说明:OutputStreamWriter类的构造方法接收字节输出流OutputStream对象out,而OutputStreamWriter类是Writer的子类,所以该子类的对象可以向上转型为Writer类对象,这样就表示可以将接收的字节输出流转换为字符输出流。
File f = new File("c.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
(2)、InputStreamReader
:字节输入流转换为字符输入流;
类定义:public class InputStreamReader extends Reader;
构造方法:
public InputStreamReader(InputStream in);// 创建使用默认字符集的字节输入流转换字符输入流对象(默认字符集UTF-8)
public InputStreamReader(InputStream in, String charsetName) ;//创建指定字符集的字节输入流转换字符输入流对象
说明:InputStreamReader类的构造方法接收字节输出流InputStream对象in,而
InputStreamReader类是Reader的子类,所以该子类的对象可以向上转型为Reader类对象,这样就表示可以将接收的字节输入流转换为字符输入流。
public class Test {
public static void main(String[] args) throws IOException {
//1.定义输出文件路径
File file =
new File("d:"+File.separator+"Demo"+File.separator+"OutputStreamWriter.txt");
//判断目录是否存在
if(!file.getParentFile().exists()){
//创建文件目录
file.getParentFile().mkdirs();
}
//2.取得字节输出流
OutputStream outputStream = new FileOutputStream(file);
//3.将字节输出流转换为字符输出流
OutputStreamWriter out = new OutputStreamWriter(outputStream);
out.write("欢迎使用字节输出流转换字符输出流!");
//4.关闭流
out.close();
}
}