使用哪个OutputStream子类来写入文本文件

5

[任务]

要求

使用 具体的 OutputStream 子类 将数据输出到一个 .txt 文件中,该文件可以被使用 Notepad 等程序阅读。 (因此,Writer 不是一个选项)

想法

可以使用 ASCII 或任何可读性良好的字符集。

问题

我应该使用这些中的哪一个?

  • ByteArrayOutputStream
  • FileOutputStream
  • FilterOutputStream
  • ObjectOutputStream
  • OutputStream
  • PipedOutputStream

OutputStreamWriter 包装在 BufferedWriter 中? - Hovercraft Full Of Eels
为什么特定使用ASCII编码?例如Notepad也支持UTF-8。 - BalusC
当然,任何可以被理解并使用这些子类的东西。 - Ren
1
在我的(已删除的)回答中,事实证明这实际上是一项家庭作业任务,并且OP不被允许像正常开发人员那样使用“Writer”。我添加了家庭作业标签。现在,您是否阅读了每个提到的Java文档以了解应该如何使用每个文档?从这里开始:http://download.oracle.com/javase/6/docs/api/java/io/package-summary.html - BalusC
是的,谢谢。我已经阅读了Javadocs文档,还有什么需要在这里询问并占用别人时间的吗? - Ren
好的,您能否编辑您的问题,添加一个概述,说明所有这些类应该用于什么以及为什么您认为它们是否适合编写文本文件?例如,“ByteArrayOutputStream不适合,因为它只能将数据写入内存中的byte[],而不能写入文件”,等等。然后我们可以相应地进行更正。 - BalusC
3个回答

6
  • ByteArrayOutputStream 用于将字节写入到内存中的 byte[] 变量中。
  • FileOutputStream 用于将字节写入到一个 File 中。
  • FilterOutputStream 是一些特定输出流操作的共同父类,这些输出流可以在操作数据之前对其进行操作,例如加密/解密、计算校验和、字符编码、压缩等。它本身并没有做什么特殊的事情。
  • ObjectOutputStream 用于将完整的Java类型和对象以序列化形式写入到字节流中。它基本上允许将复杂的Java对象转换为原始字节,反之亦然。
  • OutputStream 只是这些流的公共抽象类。无论如何,您都不能构造它。不过,您可以声明对它进行操作。
  • PipedOutputStream 旨在能够将数据写入到管道中的另一个 InputStream 中,以便另一端可以从该 InputStream 中读取它们。

如果您想要将数据明文写入到一个File中,那么FileOutputStream就足够了。

try (OutputStream output = new FileOutputStream("/foo.txt")) {
    output.write(text.getBytes());
}

请注意,String#getBytes() 使用平台默认编码将字符转换为字节。如果您使用的是至少不包含 ASCII 的“特殊字符”,则应始终明确指定字符集,使用 String#getBytes(charset)。例如:
    output.write(text.getBytes(StandardCharsets.UTF_8));

与具体问题无关通常做法是使用Writer来写入字符数据。

如果您不关心字符编码,请使用FileWriter

try (Writer writer = new FileWriter("/foo.txt")) {
    writer.write(text);
}

它将使用平台默认的字符编码,通常也支持ASCII字符。

如果您关心字符编码,请使用OutputStreamWriter

try (Writer writer = new OutputStreamWriter(new FileOutputStream("/foo.txt"), StandardCharsets.UTF_8)) {
    // ...
}

在使用OutputStream时,可以通过第二个参数指定字符集。

另请参阅:


非常感谢您,但我有一个作业要求我使用特定的OutputStream子类之一... - Ren
谢谢,那真的解释了很多。 不过,还有另一个OutputStream:http://download.oracle.com/javase/6/docs/api/org/omg/CORBA/portable/OutputStream.html - Ren
1
有无数的实现方式。我只是真的想知道什么样的老师会提到CORBA这个。 - BalusC

1
使用PrintStream。它是OutputStream的子类,允许逐行输出。它是System.out中使用的相同类。
new PrintStream(new File("path/to/your/file.txt")).println("Your output");

0

FileOutputStream 有什么问题吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接