Is it bad style to keep the references to streams “further down” a filter chain, and use those lower level streams again, or even to swap one type of stream for another? For example:
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();
If so, what are the alternatives if I need to use the functionality of both streams, e.g. if I want to write a few lines of text to a stream, followed by binary data, or vice versa?
This can be done in some cases, but it’s error-prone. You need to be careful about buffers and stuff like the stream headers of
ObjectOutputStream.For this, all you need to know is that you can convert text to binary data and back but always need to specify an encoding. However, it is also error-prone because people tend to use the API methods that use the platform default encoding, and of course you’re basically implementing a parser for a custom binary file format – lots of things can go wrong there.
All in all, if you’re creating a file format, especially when mixing text and binary data, it’s best to use an existing framework like Google protocol buffers