Writing Bytes to Output Streams
The fundamental method of the OutputStream class is write( ) :
public abstract void write(int b) throws IOException
This method writes a single unsigned byte of data whose value should be between 0 and 255. If you pass a number larger than 255 or smaller than 0, it's reduced modulo 256 before being written.
Example 2-1, AsciiChart, is a simple program that writes the printable ASCII characters (32 to 126) on the console. The console interprets the numeric values as ASCII characters, not as numbers. This is a feature of the console, not of the OutputStream class or the specific subclass of which System.out is an instance. The write( ) method merely sends a particular bit pattern to a particular output stream. How that bit pattern is interpreted depends on what's connected to the other end of the stream.
Example 2-1. The AsciiChart program
import java.io.*; public class AsciiChart { public static void main(String[] args) { for (int i = 32; i < 127; i++) { System.out.write(i); // break line after every eight characters. if (i % 8 == 7) System.out.write(' '); else System.out.write(' '); } System.out.write(' '); } } |
Notice the use of the char literals ' ' and ' '. The compiler converts these to the numbers 9 and 10, respectively. When these numbers are written on the console, the console interprets them as a tab and a linefeed, respectively. The same effect could have been achieved by writing the if clause like this:
if (i % 8 == 7) System.out.write(10); else System.out.write(9);
Here's the output:
% java AsciiChart ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
The write( ) method can throw an IOException, so you'll need to wrap most calls to this method in a try/catch block, or declare that your own method throws IOException. For example:
try { for (int i = 32; i <= 127; i++) out.write(i); } catch (IOException ex) { System.err.println(ex); }
Observant readers will have noticed that Example 2-1 did not actually catch any IOExceptions. The PrintStream class, of which System.out is an instance, overrides write( ) with a variant that does not throw IOException. This is very unusual, and PrintStream is almost the only class that does this. I'll have more to say about PrintStream, including this very unsafe behavior, in Chapter 7.