Java 输入输出相关概念介绍(File、IO 流)(二十)(OutputStreamWriter)

293 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

上一篇文章讲的是FilterWriter,FilterWriter 继承于Writer,但本身也是个抽象类,日常开发中几乎使用不到。但是今天这篇文章讲的OutputStreamWriter 使用的频率就比较多了。

OutputStreamWriter 的概念

OutputStreamWriter 的作用是字符流转为字节流然后输出,再进一步说就是将一个字符流的输出对象变为字节流的输出对象。它作为字符流通向字节流的桥梁,可以传入指定的字符集,将要写入流中的字符编码成指定格式的字节。

注意,如果我们没有显示指定字符集,那么将会接受平台默认的字符集。

我们应该将OutputStreamWriter 和InputstreamReader 结合起来对比着看。

有的人如果只看类名,可能会以为会有四个组合:InputStreamWriter/InputStreamReader/OutputStreamdReader/OutputStreamWriter。

但是实际上只存在InputStreamReader 和OutputStreamWriter。因为不可能存在输入流和输出流组合的情况。

InputStreamReader、OutputStreamWriter 分别是为InputStream、OutputStream 的底层输入输出流提供将字节转换成字符的桥梁。可以理解,他们只是外面的一个包装。

对于OutputStream,其真正的核心是里面的StreamEncoder。有兴趣的同学可以看看源码。

它实现的过程如下:

  • 根据我们传入的字符集(如果没有指定那么就使用默认的编码集),将字符转码为字节。
  • 调用类中的StreamEncoder,使用StreamEncoder 实现的方法将转码后的字节写入到底层字节输出流中。

OutputStream 的方法

构造方法

// 根据传入的字符集,创建OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName)
// 功能同上,创建使用给定字符集的OutputStreamWriter,只不过是字符集描述参数不一样
OutputStreamWriter(OutputStream out, Charset cs)
// 不指定字符集,那么久创建使用默认字符编码的OutputStreamWriter 实例
OutputStreamWriter(OutputStream out)
// 功能同上
OutputStreamWriter(OutputStream out, CharsetEncoder enc)

其他方法

// 关闭流,释放资源
void close()
// 返回某个流在使用的字符编码名称
String getEncoding()
// 向流中写入单个字符
void write(int c)
// 根据参数,向流中写入字符数组的某一部分
void write(char cbuf[], int off, int len)
// 功能同上,只不过是向流中写入字符串的某一部分
void write(String str, int off, int len)
// 刷新流的缓冲区
void flush()

使用举例

public static void main(String args[]) throws Exception {
  File f = new File("/abc/def/copy.txt") ;
  // 将字节流(FileOutStream 实例)变为字符流
  Writer out = new OutputStreamWriter(new FileOutputStream(f));
  // 使用字符流输出
  out.write("abcdefg1234567") ;
  // 关闭流
  out.close() ;
}

这个例子也比较清晰明了,相关的内容也做了注释,不在赘述。

总结

这篇文章是围绕OutputStreamWriter 展开的,OutputStreaWriter 的作用也很明朗,只要记住当我们需要将数据从字节流转成字符流的时候使用这个就好。接下来我们将继续介绍Writer 的子类,接下来的文章也会是我们这个系列的最后一篇文章。