在Java中流链接

时间:2011-11-02 21:10:51

标签: java io

将流的引用“进一步向下”保持过滤器链,并再次使用这些较低级别的流,甚至将一种类型的流交换为另一种流是不是很糟糕的风格?例如:

    OutputStream os = new FileOutputStream("file");
    PrintWriter pw = new PrintWriter(os);
    pw.print("print writer stream");
    pw.flush();
    pw = null;
    DataOutputStream dos = new DataOutputStream(os);
    dos.writeBytes("dos writer stream");
    dos.flush();
    dos = null;
    os.close();

如果是这样,如果我需要使用两个流的功能,有什么替代方案,例如:如果我想在流中写几行文本,然后是二进制数据,反之亦然?

4 个答案:

答案 0 :(得分:4)

这可以在某些情况下完成,但它容易出错。您需要注意缓冲区和诸如ObjectOutputStream的流标题之类的内容。

  

如果我想在流中写几行文本,然后是二进制文件   数据,反之亦然?

为此,您需要知道的是,您可以将文本转换为二进制数据并返回,但始终需要指定编码。但是,它也容易出错,因为人们倾向于使用使用平台默认编码的API方法,当然你基本上是为自定义二进制文件格式实现解析器 - 很多东西都可能出错。

总而言之,如果您正在创建文件格式,特别是在混合文本和二进制数据时,最好使用现有的框架,如Google protocol buffers

答案 1 :(得分:3)

如果你必须这样做,那么你必须这样做。因此,如果你正在处理一个你无法控制的外部依赖,你就必须这样做。

我认为糟糕的风格是你需要这样做的事实。如果你有时必须发送二进制数据,而在其他人发送文本,最好是拥有某种消息对象并通过Serialization在线路上发送对象本身。如果结构合理,数据开销不会太大。

答案 2 :(得分:1)

我不明白为什么不。我的意思是,各种流类的实现应该保护您免于编写无效数据。只要你以同样的方式阅读它,并且你的代码是可以理解的,我不明白为什么那会是一个问题。

风格并不总是意味着你必须按照别人的方式去做。只要它是合乎逻辑的,并且阅读代码的人会看到你正在做什么(以及为什么),而不需要写一堆评论,那么我不知道问题是什么。

答案 3 :(得分:0)

既然你在之间徘徊,那可能就好了。但是使用一个OutputStream并使用os.write(string.getBytes());来编写字符串可能会更清晰。