【问题标题】:Which OutputStream subclass to write to a text file将哪个 OutputStream 子类写入文本文件
【发布时间】:2011-12-23 07:44:27
【问题描述】:

我正在编写一个将数据输出到 .txt 文件的程序,该文件可由使用记事本之类的程序的人读取。 也许不一定是 ASCII,而是用户可以理解的东西。

我使用其中的哪一个?

  • ByteArrayOutputStream
  • 文件输出流
  • 过滤输出流
  • ObjectOutputStream
  • 输出流
  • 管道输出流

我有这个任务要求我专门使用一个 OutputStream 子类,所以 Writer 不是一个选项。

类概述

  • ByteArrayOutputStream 直到BalusC给出更简单的描述才明白。显然它将东西存储在一个字节数组中,这使得它不可读,因为它们是特殊的字节。
  • FileOutputStream 它将输出转换为字节,因此也不可读。
  • FilterOutputStream 我认为它以我不理解的方式转换数据。当您只想在程序中编写内容时编写它们,这并不好。
  • ObjectOutputStream 根据“原始数据类型也可以使用 DataOutput 中的适当方法写入流。字符串也可以使用 writeUTF 方法写入。”并且提供的示例可能就是答案,但又一次如此多的解释让我感到困惑。
  • OutputStream 完全看不懂描述。
  • PipedOutputStream 创建二进制数据管道。什么是管道?一点头绪都没有。

【问题讨论】:

  • OutputStreamWriter 包裹在 BufferedWriter 中?
  • 为什么特别是 ASCII?记事本也支持例如 UTF-8。
  • 嗯,当然,任何可以理解并使用这些子类的东西。
  • 在我的(已删除)答案中,事实证明这实际上是一项家庭作业,并且不允许 OP 像普通开发人员那样使用Writer。我添加了作业标签。现在,您是否阅读过每个提到的 javadocs 以了解每个应该用于什么?从这里开始:download.oracle.com/javase/6/docs/api/java/io/…
  • 是的,谢谢,我已经阅读了 javadocs,当然还有其他的,然后再在这里询问并从人们那里抢时间。

标签: java file ascii outputstream


【解决方案1】:
  • 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 时将字符集指定为第二个参数。

另见:

【讨论】:

【解决方案2】:

使用PrintStream。它是 OutputStream 的子类,允许逐行输出。它与 System.out 中使用的类相同

new PrintStream(new File("path/to/your/file.txt")).println("Your output");

【讨论】:

    【解决方案3】:

    FileOutputStream 有什么问题吗?

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多