write a student profile_writer author

write a student profile_writer authorJava 17 I/O OutputStreamWriter 篇这篇文章我们来看看 OutputStreamWriter 类,以及其子类 FileWriter。并来说说 PrintWriter 和 StringWri

Java 17 I/O OutputStreamWriter 篇

这篇文章我们来看看 OutputStreamWriter 类,以及其子类 FileWriter。

并来说说 PrintWriter 和 StringWriter 类。

这些类都来自模块 Module:java.base

来自包 Package:java.io

OutputStreamWriter

先看该类的定义:

public class OutputStreamWriter extends Writer 
write a student profile_writer author

对于 OutputStreamWriter 类,主要是从字符流到字节流的桥梁,对于写入的字符可以使用指定的字符集编码转换成对应的字节。并且对应的字符集可以使用字符集名称指定,也可以显式的给出对应的字符集对象。当然也会有默认的字符集,一般和平台(当前系统)有关系。当然如果想更多的对编码过程中进行控制,可以使用CharsetEncoder 类。

前两节我们说过, 为了提高效率可以把对象包装在对应的 BufferedWriter 中,同样该类也可以这样做。这样做的好处是获得了最高效率,并且也避免了频繁的调用转换器。例如:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

对于字符集来说,有一个新概念: surrogate pair (代理对) 也有叫做代理项对。

Surrogate Pair: 是UTF-16中用于扩展字符而使用的编码方式,是一种采用四个字节(两个UTF-16编码)来表示一个字符。也就是位补充字符分配两个 16 位的 Unicode 编码单。

  1. 第一个编码单,被称为高代理项,取值范围是:’\uD800’到’\uDBFF’。
  2. 第二个编码单,被称为低代理项,取值范围是:’\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()); }

完整代码及演示:

write a student profile_writer author

这里使用了 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()); }

完整代码如下:

write a student profile_writer author

多种创建方式

当然也可以使用如下的方式创建该对象。

new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8"));

并且可以使用 append 方法追加数据到对应的流中。

效果如下:

write a student profile_writer author

同样对于该类的使用使用 try() catch(Exception e){} 语法。这样可以避免流关闭的问题。

该类有一个子类。 FileWriter。

FileWriter

对于 FileWriter 继承了 OutputStreamWriter。该类主要是使用默认的缓冲区大小,将文本写入字符文件中。从字符到字节的编码使用了指定的字符集或平台的默认字符集。

对于文件而言,是否可以创建取决于底层平台。特别对于 Windows 平台来说,允许一次仅由一个 FileWriter,当然这里也包含其他的写入对象,打开文件进行写入对应的数据。在这种情况下,如果操作的文件已经被打开,则使用(构造)的时候将会提示失败。

对于 FileWriter 主要用于写入字符流,如果想要写入原始字节流,可以考虑 FileOutputStream。

定义:

public class FileWriter extends OutputStreamWriter 
write a student profile_writer author

构造函数

构造函数

描述

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()); }
write a student profile_writer author

使用不同的构造器创建

代码如下:

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()); }

这里为了验证完整的代码,效果和实际演示的效果略有差别。完整代码如下:

write a student profile_writer author

写到这, 关于字符流和字节流,都介绍完毕。

对于初版的 I/O 就是这四个大的基类拆分而来的。InputStream 和 OutputStream。Reader 和 Writer。根据使用场景各有侧重点。灵活且根据实际的业务进行选择。先把基础的使用方法使用尽可能详细。这样你再看很多框架的时候,都知道别人写的思路,而且到时候有疑问也可以根据这个基础版本, 进行迭代。

任何成熟的产品都是从一开始小的不能再小的功能,一个一个小功能迭代而来的。学习的技能也是一个一个知识点堆起来的, 每天一个知识点,一个概念。只要能够不间断。你的知识体系就会越发完善了。从今天开始, 从这篇文章开始,有学到的那些概念吗?

关注我, 每天送一个知识点给你。希望本篇内容给你一点帮助。收藏,点赞。 感谢您的阅读。

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/16189.html

(0)
上一篇 2024年 9月 18日
下一篇 2024年 9月 18日

相关推荐

关注微信