首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutputStreamWriter vs FileWriter

OutputStreamWriter vs FileWriter
EN

Stack Overflow用户
提问于 2012-07-07 08:07:56
回答 4查看 59.7K关注 0票数 30

我不明白这两个类之间的区别。什么时候你会用一个而不是一个?我知道FileWriter可以将字符输出到文件,但据我所知,OutputStreamWriter也可以。这是我测试的一些代码,它们看起来工作起来是一样的,我没有添加异常处理的东西,但让我们假设它就在那里。

代码语言:javascript
复制
FileWriter writer = new FileWriter("C:\\Users\\owner\\Desktop\\demo.txt");
writer.write("hello");
writer.close();

我还尝试了下面的代码:

代码语言:javascript
复制
File file = new File("C:\\Users\\owner\\Desktop\\demo.txt");
os = new OutputStreamWriter(new FileOutputStream(file));
os.write("hello");
os.close();

这两个对我来说似乎都是一样的。唯一奇怪的情况是当我试图将一个int值放入write()方法中时。对于FileWriter示例,我的demo.txt是完全空的。对于OutputStreamWriter示例,我在文本文件中得到了一些奇怪的符号。我正在读一本java书,我得到的关于OutputStreamWriter的唯一解释是它“将一个字符流转换为字节流”,那么在第二个例子中,我不应该在我的文本文件中看到一些字节吗?

如果能澄清一下,我们将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2012-07-07 08:33:47

XXXInputStream和XXXOutputStream ( XXX不同,有很多选项)处理8位字节。例如,OutputStream.write(byte[] c);

XXXWriter或XXXReader处理16位字符。例如,Reader.read(char[] cbuf)

OutputStreamWriter将OutputStream转换为Writer。正如您可能已经猜到的,InputStreamReader从InputStream转换为Reader。我不知道有什么类可以做相反的事情,比如把Reader转换成InputStream。

FileWriter是一个与文件对话的写入器。因为Java String在内部使用字符(16位以便它们可以处理Unicode),所以FileWriter是与Unicode String一起使用的自然类。

FileOutputStream是用于将字节写入文件的OutputStream。OutputStreams不接受字符(或字符串)。通过将其包装在OutputStreamWriter中,您现在就有了一个Writer,它接受String。

现在,真正的问题是,你什么时候使用Reader/Writer,什么时候使用Stream?我已经使用Java很多年了,有时我也会感到困惑。我相信以下内容是正确的:

便捷指南-如何决定使用哪一个:

  1. 如果您正在处理二进制数据(例如图像),请使用Streams。
  2. 如果您使用非ASCII Unicode字符,例如中文,请使用读卡器/写入器。
  3. 如果您使用的是普通的ASCII码文本(传统的0-127字符),您(通常)可以使用这两种字符中的任何一种。

其他一些链接:

inputstream and reader in Java IO

InputStream vs InputStreamReader

票数 49
EN

Stack Overflow用户

发布于 2012-07-07 08:17:33

实际上没有本质上的区别,FileWriter只是一个方便的类。它扩展OutputStreamWriter并创建所需的FileOutputStream本身。

关于write(int):该方法将具有指定代码点的单个字符写入流,它不会写入数值的文本表示形式。

至于空文件,请注意,当您想要将您编写的内容刷新到底层存储时(可以是文件、网络流或您能想到的任何内容),您应该始终刷新缓冲区。只需在编写后调用os.flush(),就可以了。

编辑:正如Thilo正确提到的,关闭流应该已经刷新了它(以及所有底层流)。

最后但并非最不重要的一点是,您应该几乎总是显式地指定您希望Writer写入的字符集/编码。写入器写入字符,而OutputStreams写入字节,因此您必须指定如何将这些字符编码为字节。如果不指定编码,将使用系统默认值,这可能不是您想要的。

票数 14
EN

Stack Overflow用户

发布于 2012-07-07 08:21:17

这是来自here

在java.io中,您可以执行字节IO或字符IO。字节IO可用于任何形式的数据,而无需对该数据表示的内容进行任何解释。字符IO指的是表示为字符序列的信息。

对于字节IO,我们有各种类型的InputStream/OutputStream类,比如示例1中的FileOutputStream。对于字符数据,我们有各种形式的读取器/写入器类,比如示例中的FileWriter。缓冲可以在这两种情况下完成,因此使用BufferedWriter和BufferedOutputStream类。

要执行字符IO操作,必须使用某种编码形式将字符转换为字节数据。FileWriter为您做到了这一点,这就是为什么它有一个构造函数来接受编码和文件名。常见的编码包括UTF-8、UTF-16和US-ASCII。

OutputStreamWriter是一个只对字符进行编码的类。这就是为什么它是一个Writer,它的构造函数接受一个带有可选编码参数的OutputStream作为参数。

如果省略显式编码规范,FileWriter和ByteArrayOutputStream都将使用您的平台的默认编码。这一点需要非常小心,因为它在不同的JVM中会有所不同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11371154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档