Character Stream Vs Byte Stream in Java

A stream is a way of sequentially accessing a file. In Streams you can process the data one at a time as bulk operations are unavailable with them. But, streams supports a huge range of source and destinations including disk file, arrays, other devices, other programs etc. In Java, a byte is not the same thing as a char . Therefore a byte stream is different from a character stream. So, Java defines two types of streams: Byte Streams and Character Streams .

Byte Streams

A byte stream access the file byte by byte. Java programs use byte streams to perform input and output of 8-bit bytes. It is suitable for any kind of file, however not quite appropriate for text files. For example, if the file is using a unicode encoding and a character is represented with two bytes, the byte stream will treat these separately and you will need to do the conversion yourself. Byte oriented streams do not use any encoding scheme while Character oriented streams use character encoding scheme(UNICODE). All byte stream classes are descended from InputStream and OutputStream . Example
import java.io.*; public class TestClass{ public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("in.txt"); fos = new FileOutputStream ("out.txt"); int temp; while ((temp = fis.read()) != -1) //read byte by byte fos.write((byte)temp); //write byte by byte if (fis != null) fis.close(); if (fos != null) fos.close(); }catch(Exception e){ System.out.println(e); } } }

When to use:

Byte streams should only be used for the most primitive I/O

When not to use:

You should not use Byte stream to read Character streams

e.g. To read a text file

Character Streams

A character stream will read a file character by character. Character Stream is a higher level concept than Byte Stream . A Character Stream is, effectively, a Byte Stream that has been wrapped with logic that allows it to output characters from a specific encoding . That means, a character stream needs to be given the file's encoding in order to work properly. Character stream can support all types of character sets ASCII, Unicode, UTF-8, UTF-16 etc. All character stream classes are descended from Reader and Writer . Example
import java.io.*; public class TestClass{ public static void main(String[] args) { FileReader reader = null; try { reader = new FileReader("in.txt"); int fChar; while ((fChar = reader.read()) != -1) //read char by char System.out.println((char)fChar); //write char by char }catch(Exception e){ System.out.println(e); } } }

When to use:

To read character streams either from Socket or File of characters

Summary

  1. Character oriented are tied to datatype. Only string type or character type can be read through it while byte oriented are not tied to any datatype, data of any datatype can be read(except string) just you have to specify it.

  2. Character oriented reads character by character while byte oriented reads byte by byte.

  3. Character oriented streams use character encoding scheme(UNICODE) while byte oriented do not use any encoding scheme.

  4. Character oriented streams are also known as reader and writer streams Byte oriented streams are known as data streams-Data input stream and Data output stream.


JCharacter Streams versus Byte Streams