Java 17 I/O OutputStreamWriter 篇
这篇文章我们来看看 OutputStreamWriter 类,以及其子类 FileWriter。
并来说说 PrintWriter 和 StringWriter 类。
这些类都来自模块 Module:java.base
来自包 Package:java.io
OutputStreamWriter
先看该类的定义:
public class OutputStreamWriter extends Writer
对于 OutputStreamWriter 类,主要是从字符流到字节流的桥梁,对于写入的字符可以使用指定的字符集编码转换成对应的字节。并且对应的字符集可以使用字符集名称指定,也可以显式的给出对应的字符集对象。当然也会有默认的字符集,一般和平台(当前系统)有关系。当然如果想更多的对编码过程中进行控制,可以使用CharsetEncoder 类。
前两节我们说过, 为了提高效率可以把对象包装在对应的 BufferedWriter 中,同样该类也可以这样做。这样做的好处是获得了最高效率,并且也避免了频繁的调用转换器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
对于字符集来说,有一个新概念: surrogate pair (代理对) 也有叫做代理项对。
Surrogate Pair: 是UTF-16中用于扩展字符而使用的编码方式,是一种采用四个字节(两个UTF-16编码)来表示一个字符。也就是位补充字符分配两个 16 位的 Unicode 编码单。
- 第一个编码单,被称为高代理项,取值范围是:’\uD800’到’\uDBFF’。
- 第二个编码单,被称为低代理项,取值范围是:’\uDC00’到’\uDFFF’。
构造函数
对于该类的构造函数有四个,分别是
构造函数 |
描述 |
OutputStreamWriter(OutputStream out) |
使用默认字符集编码创建一个 OutputStreamWriter |
OutputStreamWriter(OutputStream out, String charsetName) |
指定命名字符集的输出流 OutputStreamWriter |
OutputStreamWriter(OutputStream out, Charset cs) |
创建一个使用指定字符集对象的 OutputStreamWriter |
OutputStreamWriter(OutputStream out, CharsetEncoder cs) |
创建一个使用给定字符集编码器的 OutputStreamWriter |
方法
除了继承父类的 Writer 方法。
修饰符和类型 |
方法 |
描述 |
Writer |
append(char c) |
将指定的字符附加到这个 writer。 |
Writer |
append(CharSequence csq) |
将指定的字符序列附加到此编写器。 |
Writer |
append(CharSequence csq, int start, int end) |
将指定字符序列的子序列附加到此编写器。 |
abstract void |
close() |
刷新流之后,再关闭流。 |
abstract void |
flush() |
刷新流 |
static Writer |
nullWriter() |
返回一个丢弃所有字符的新 Writer。 |
void |
write(char[] cbuf) |
写入一个字符数组。 |
abstract void |
write(char[] cbuf, int off, int len) |
写入指定部分的字符数组。 |
void |
write(int c) |
写入单个字符。 |
void |
write(String str) |
写入一个字符串。 |
void |
write(String str, int off, int len) |
写入指定部分的字符串。 |
还有另外的一个新增方法获得编码集。
修饰符和类型 |
方法 |
描述 |
String |
getEncoding() |
返回此流使用的字符编码的名称。 |
如何使用
基础使用
把字符串写入到文件中。
String data = "使用 OutputStreamWriter 写入数据到文件中。"; try (FileOutputStream fileOutputStream = new FileOutputStream("test.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);) { outputStreamWriter.write(data); } catch (IOException ex) { System.out.println(ex.getMessage()); }
完整代码及演示:
这里使用了 ls 指定文件名,可以查看对应的文件信息。cat 是查看文件内容的命令。
获得编码集
使用构造函数, 传入字符集名称的字符串。并调用 getEncoding() 方法,查看其编码集。
try (FileOutputStream fileOutputStream = new FileOutputStream("test.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF8")) { System.out.println("当前字符集: " + outputStreamWriter.getEncoding()); outputStreamWriter.write(data); } catch (IOException ex) { System.out.println(ex.getMessage()); }
完整代码如下:
多种创建方式
当然也可以使用如下的方式创建该对象。
new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8"));
并且可以使用 append 方法追加数据到对应的流中。
效果如下:
同样对于该类的使用使用 try() catch(Exception e){} 语法。这样可以避免流关闭的问题。
该类有一个子类。 FileWriter。
FileWriter
对于 FileWriter 继承了 OutputStreamWriter。该类主要是使用默认的缓冲区大小,将文本写入字符文件中。从字符到字节的编码使用了指定的字符集或平台的默认字符集。
对于文件而言,是否可以创建取决于底层平台。特别对于 Windows 平台来说,允许一次仅由一个 FileWriter,当然这里也包含其他的写入对象,打开文件进行写入对应的数据。在这种情况下,如果操作的文件已经被打开,则使用(构造)的时候将会提示失败。
对于 FileWriter 主要用于写入字符流,如果想要写入原始字节流,可以考虑 FileOutputStream。
定义:
public class FileWriter extends OutputStreamWriter
构造函数
构造函数 |
描述 |
FileWriter(File file) |
给定要写入的文件,使用平台的默认字符集构造一个 FileWriter |
FileWriter(FileDescriptor fd) |
在给定文件描述符的情况下,使用平台的默认字符集构造一个 |
FileWriter(File file, boolean append) |
构造一个 FileWriter 给定要写入的文件和一个布尔值,指示是否使用平台的默认字符集追加写入的数据。 |
FileWriter(File file, Charset charset) |
给定要写入的文件和字符集,构造一个 FileWriter。 |
FileWriter(File file, Charset charset, boolean append) |
给定要写入的文件、字符集和指示是否追加写入的数据的布尔值,构造一个 FileWriter。 |
FileWriter(String fileName) |
使用平台的默认字符集构造一个给定文件名的 FileWriter |
FileWriter(String fileName, boolean append) |
构造一个 FileWriter 给定文件名和一个布尔值,指示是否使用平台的默认字符集追加写入的数据。 |
FileWriter(String fileName, Charset charset) |
在给定文件名和字符集的情况下构造一个 FileWriter。 |
FileWriter(String fileName, Charset charset, boolean append) |
构造一个 FileWriter 给定文件名、字符集和一个布尔值,指示是否追加写入的数据。 |
方法
对于 FileWriter 对象而言,没有新增的方法。完全和父类方法一致。
创建一个对象
根据构造对象可以看出来,文件的传入有两种方式,一种是同时字符串传入一个对应的文件路径。 另一种方式使用 File 文件类,给定义个文件对象。并且可以在构造器中可以指定对应的字符集。以及追加数据的状态。当对应的 append 等于 true 时,字节将被写入文件的末尾而不是开头。
代码如下:
try (FileWriter fileWriter = new FileWriter("test.txt");) { fileWriter.write(data); } catch (IOException ex) { System.out.println(ex.getMessage()); }
使用不同的构造器创建
代码如下:
try (FileWriter fileWriter = new FileWriter("test.txt", true); FileWriter fileWriter2 = new FileWriter("test.txt", Charset.forName("UTF-8")); FileWriter fileWriter3 = new FileWriter("test.txt", Charset.forName("UTF-8"), true); FileWriter fileWriter4 = new FileWriter(new File("test.txt")); FileWriter fileWriter5 = new FileWriter(new File("test.txt"), true); FileWriter fileWriter6 = new FileWriter(new File("test.txt"), Charset.forName("UTF-8")); FileWriter fileWriter7 = new FileWriter(new File("test.txt"), Charset.forName("UTF-8"), true);) { fileWriter.write(fileWriter.getEncoding() + " fileWriter 写入" + System.lineSeparator()); fileWriter2.write(fileWriter2.getEncoding() + "fileWriter2 写入" + System.lineSeparator()); fileWriter3.write(fileWriter3.getEncoding() + "fileWriter3 写入" + System.lineSeparator()); fileWriter4.write(fileWriter4.getEncoding() + "fileWriter4 写入" + System.lineSeparator()); fileWriter5.write(fileWriter5.getEncoding() + "fileWriter5 写入" + System.lineSeparator()); fileWriter6.write(fileWriter6.getEncoding() + "fileWriter6 写入" + System.lineSeparator()); fileWriter7.write(fileWriter7.getEncoding() + "fileWriter7 写入" + System.lineSeparator()); } catch (IOException ex) { System.out.println(ex.getMessage()); }
这里为了验证完整的代码,效果和实际演示的效果略有差别。完整代码如下:
写到这, 关于字符流和字节流,都介绍完毕。
对于初版的 I/O 就是这四个大的基类拆分而来的。InputStream 和 OutputStream。Reader 和 Writer。根据使用场景各有侧重点。灵活且根据实际的业务进行选择。先把基础的使用方法使用尽可能详细。这样你再看很多框架的时候,都知道别人写的思路,而且到时候有疑问也可以根据这个基础版本, 进行迭代。
任何成熟的产品都是从一开始小的不能再小的功能,一个一个小功能迭代而来的。学习的技能也是一个一个知识点堆起来的, 每天一个知识点,一个概念。只要能够不间断。你的知识体系就会越发完善了。从今天开始, 从这篇文章开始,有学到的那些概念吗?
关注我, 每天送一个知识点给你。希望本篇内容给你一点帮助。收藏,点赞。 感谢您的阅读。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/16189.html