我不明白这两节课之间的区别。您什么时候可以使用一种?我知道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的唯一解释是它“将字符流转换为字节流”,因此在第二个示例中,我是否不应该在文本文件中看到某些字节?

一些澄清将不胜感激。

最佳答案

XXXInputStream和XXXOutputStream(其中XXX不同,有很多选项)处理8位字节。例如OutputStream.write(byte[] c);
XXXWriter或XXXReader处理16位字符。例如,Reader.read(char[] cbuf)

OutputStreamWriter将OutputStream转换为Writer。您可能已经猜到了,InputStreamReader从InputStream转换为Reader。我不知道任何相反的类,即将Reader转换为InputStream。

FileWriter是与文件对话的Writer。由于Java String内部使用char(16位,因此它们可以处理Unicode),因此FileWriter是与Unicode String一起使用的自然类。

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

现在,真正的问题是,何时使用阅读器/书写器以及何时使用流?我已经使用Java多年了,有时我也会感到困惑。我相信以下是正确的:

实用指南-如何确定使用哪个:

  • 如果要处理二进制数据(例如图像),请使用Streams。
  • 如果您使用的是非ASCII Unicode字符,例如中文,使用
    读者/作家。
  • 如果使用的是普通ASCII文本(传统的0-127个字符),则可以(通常)使用其中一种。

  • 其他一些链接:

    inputstream and reader in Java IO

    InputStream vs InputStreamReader

    10-07 19:32