我不明白这两个类之间的区别。什么时候你会用一个而不是一个?我知道FileWriter可以将字符输出到文件,但据我所知,OutputStreamWriter也可以。这是我测试的一些代码,它们看起来工作起来是一样的,我没有添加异常处理的东西,但让我们假设它就在那里。
FileWriter writer = new FileWriter("C:\\Users\\owner\\Desktop\\demo.txt");
writer.write("hello");
writer.close();我还尝试了下面的代码:
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的唯一解释是它“将一个字符流转换为字节流”,那么在第二个例子中,我不应该在我的文本文件中看到一些字节吗?
如果能澄清一下,我们将不胜感激。
发布于 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很多年了,有时我也会感到困惑。我相信以下内容是正确的:
便捷指南-如何决定使用哪一个:
其他一些链接:
发布于 2012-07-07 08:17:33
实际上没有本质上的区别,FileWriter只是一个方便的类。它扩展OutputStreamWriter并创建所需的FileOutputStream本身。
关于write(int):该方法将具有指定代码点的单个字符写入流,它不会写入数值的文本表示形式。
至于空文件,请注意,当您想要将您编写的内容刷新到底层存储时(可以是文件、网络流或您能想到的任何内容),您应该始终刷新缓冲区。只需在编写后调用os.flush(),就可以了。
编辑:正如Thilo正确提到的,关闭流应该已经刷新了它(以及所有底层流)。
最后但并非最不重要的一点是,您应该几乎总是显式地指定您希望Writer写入的字符集/编码。写入器写入字符,而OutputStreams写入字节,因此您必须指定如何将这些字符编码为字节。如果不指定编码,将使用系统默认值,这可能不是您想要的。
发布于 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中会有所不同。
https://stackoverflow.com/questions/11371154
复制相似问题