【问题标题】:Stream writer on char[] does not workchar[] 上的流编写器不起作用
【发布时间】:2011-11-11 01:18:07
【问题描述】:

我有以下代码,但是当我检查输出文件时,char[] cc 似乎没有被写入。谁能告诉我怎么了?

import java.io.*;

class Test {
  public static void main(String[] args) {
    System.out.printf("start of main\n");
    char[] cc = new char[300];
    try {
      String s = "this is a test.";
      System.arraycopy(s.toCharArray(), 0, cc, 0, s.length());
      System.out.printf("cc = %s\n", new String(cc));
      String filename = "tst.data";
      DataOutputStream ostream = new DataOutputStream(new FileOutputStream(filename));
      OutputStreamWriter writer = new OutputStreamWriter(ostream);
      writer.write(cc, 0, 300);
      ostream.close();

      DataInputStream istream = new DataInputStream(new FileInputStream(filename));
      InputStreamReader reader = new InputStreamReader(istream);
      char[] newcc = new char[300];
      reader.read(newcc, 0, 300);
      istream.close();

      System.out.printf("newcc = %s\n", new String(newcc));
    } catch (Exception e) {
      System.out.printf("Exception - %s\n", e);
    }
  }
}

【问题讨论】:

  • 当你并不真正需要它时,使用 char[] 会使它变得更复杂,至少在这个给定的代码中是这样。您只需使用 String 即可完成上述所有操作

标签: java stream writer


【解决方案1】:

您需要关闭最外层的 I/O 包装器。

替换

ostream.close();

通过

writer.close();

与具体问题无关,在这种情况下,那些 DataOutputStreamDataInputStream 包装器是不必要的。删除它们。最后,您应该关闭 finally 块中的流。另请参阅此相关问题:Do I have to close FileOutputStream which is wrapped by PrintStream?

【讨论】:

  • 但我真正想要的是在编写器写出数组后使用 ostream 来 writeInt。如果 write.close 被调用,那么 ostream 之后如何继续写入。当然 writer 不支持 write(int)。
  • 如果你关闭ostream,你会怎么做writeInt()呢?只需在调用writer.flush() 之后和调用writer.close() 之前执行此操作。顺便问一下,功能要求是什么?我不禁觉得您并没有真正理解 DataInput/OutputStream 的目的和/或将简单的事情过于复杂化。
  • 但这不起作用。我可以在调用 writer.close() 之前用 ostream 写(int),但是当我尝试读回它时它会导致 IOException。
  • 我理解这个问题。但我仍然不明白功能要求。我们可以一起拼凑出一个糟糕的解决方案,但这不是我的风格。您可能想问一个新问题,其中清楚地描述了功能需求并询问如何最好地解决它,其中显示失败的尝试。
  • 你不能偷偷摸摸地违反 DataOutputStream 的协议。
【解决方案2】:

它缝合了 writer 仍然没有将缓冲区刷新到 ostream。 您可以使用 writer.flush(); 像这样

writer.write(cc, 0, 300);
writer.flush();

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2018-01-03
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2014-09-02
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多