No, a character does not always take up two bytes when read from or written to a stream. How many bytes a character uses depends on the encoding.
If you use ASCII, a character is always 1 byte. If you use
UTF-8, then the number of bytes per character is variable (at least 1 and at most 4 bytes).
In
Java I/O, there are two kinds of classes: streams and readers / writers. Streams (InputStream and OutputStream) are used for reading and writing binary data (i.e. you use them to read the exact contents of a file on disk, for example). Readers and writers are used to read or write text. Readers and writers convert the bytes from and to characters, using a character encoding.
An int in Java is always 32 bits in memory, regardless of which bits are set to 0 and which bits are set to 1.