将流的引用“进一步向下”保持过滤器链,并再次使用这些较低级别的流,甚至将一种类型的流交换为另一种流是不是很糟糕的风格?例如:
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();
如果是这样,如果我需要使用两个流的功能,有什么替代方案,例如:如果我想在流中写几行文本,然后是二进制数据,反之亦然?
答案 0 :(得分:4)
这可以在某些情况下完成,但它容易出错。您需要注意缓冲区和诸如ObjectOutputStream
的流标题之类的内容。
如果我想在流中写几行文本,然后是二进制文件 数据,反之亦然?
为此,您需要知道的是,您可以将文本转换为二进制数据并返回,但始终需要指定编码。但是,它也容易出错,因为人们倾向于使用使用平台默认编码的API方法,当然你基本上是为自定义二进制文件格式实现解析器 - 很多东西都可能出错。
总而言之,如果您正在创建文件格式,特别是在混合文本和二进制数据时,最好使用现有的框架,如Google protocol buffers
答案 1 :(得分:3)
如果你必须这样做,那么你必须这样做。因此,如果你正在处理一个你无法控制的外部依赖,你就必须这样做。
我认为糟糕的风格是你需要这样做的事实。如果你有时必须发送二进制数据,而在其他人发送文本,最好是拥有某种消息对象并通过Serialization在线路上发送对象本身。如果结构合理,数据开销不会太大。
答案 2 :(得分:1)
我不明白为什么不。我的意思是,各种流类的实现应该保护您免于编写无效数据。只要你以同样的方式阅读它,并且你的代码是可以理解的,我不明白为什么那会是一个问题。
风格并不总是意味着你必须按照别人的方式去做。只要它是合乎逻辑的,并且阅读代码的人会看到你正在做什么(以及为什么),而不需要写一堆评论,那么我不知道问题是什么。
答案 3 :(得分:0)
既然你在之间徘徊,那可能就好了。但是使用一个OutputStream
并使用os.write(string.getBytes());
来编写字符串可能会更清晰。