Friday, December 12, 2008

I/O, Applets, and Other Topics

I/O, Applets, and Other Topics

The Preceeding Posts introduces two of Java's most important packages: io and applet. The io package supports Java's basic I/O (input/output) system, including file I/O. The applet package supports applets. Support for both I/O and applets comes from Java's core API libraries, not from language keywords. For this reason, an in-depth discussion of these topics is found in Part II of this book, which examines Java's API classes. This Post discusses the foundation of these two subsystems, so that you can see how they are integrated into the Java language and how they fit into the larger context of the Java programming and execution environment. This Post also examines the last of Java's keywords: transient, volatile, instanceof, native, strictfp, and assert.

 

I/O Basics

As you may have noticed while reading the preceding 11 Posts, not much use has been made of I/O in the example programs. In fact, aside from print( ) and println( ), none of the I/O methods have been used significantly. The reason is simple: most real applications of Java are not text-based, console programs. Rather, they are graphically oriented applets that rely upon Java's Abstract Window Toolkit (AWT) for interaction with the user. Although text-based programs are excellent as teaching examples, they do not constitute an important use for Java in the real world. Also, Java's support for console I/O is limited and somewhat awkward to use—even in simple example programs. Text-based console I/O is just not very important to Java programming.

 

The preceding paragraph notwithstanding, Java does provide strong, flexible support for I/O as it relates to files and networks. Java's I/O system is cohesive and consistent. In fact, once you understand its fundamentals, the rest of the I/O system is easy to master.

 

Streams

Java programs perform I/O through streams. A stream is an abstraction that either produces or consumes information. A stream is linked to a physical device by the Java I/O system. All streams behave in the same manner, even if the actual physical devices to which they are linked differ. Thus, the same I/O classes and methods can be applied to any type of device. This means that an input stream can abstract many different kinds of input: from a disk file, a keyboard, or a network socket.

 

Likewise, an output stream may refer to the console, a disk file, or a network connection. Streams are a clean way to deal with input/output without having every art of your code understand the difference between a keyboard and a network, for example. Java implements streams within class hierarchies defined in the java.io package.

 

If you are familiar with C/C++/C#, then you are already familiar with the concept of the stream. Java's approach to streams is loosely the same.

 

Byte Streams and Character Streams

Java 2 defines two types of streams: byte and character. Byte streams provide a convenient means for handling input and output of bytes. Byte streams are used, for example, when reading or writing binary data. Character streams provide a convenient means for handling input and output of characters. They use Unicode and, therefore, can be internationalized. Also, in some cases, character streams are more efficient than byte streams.

 

The original version of Java (Java 1.0) did not include character streams and, thus, all I/O was byte-oriented. Character streams were added by Java 1.1, and certain byte-oriented classes and methods were deprecated. This is why older code that doesn't use character streams should be updated to take advantage of them, where appropriate. One other point: at the lowest level, all I/O is still byte-oriented. The character-based streams simply provide a convenient and efficient means for handling characters. An overview of both byte-oriented streams and character-oriented streams is presented in the following sections.

 

The Byte Stream Classes

Byte streams are defined by using two class hierarchies. At the top are two abstract classes: InputStream and OutputStream. Each of these abstract classes has several concrete subclasses, that handle the differences between various devices, such as disk files, network connections, and even memory buffers. The byte stream classes are shown in Table 12-1. A few of these classes are discussed later in this section. Others are described in Part II. Remember, to use the stream classes, you must import java.io.

 

The abstract classes InputStream and OutputStream define several key methods that the other stream classes implement. Two of the most important are read( ) and write( ), which, respectively, read and write bytes of data. Both methods are declared as abstract inside InputStream and OutputStream. They are overridden by derived stream classes.

 

The Character Stream Classes

Character streams are defined by using two class hierarchies. At the top are two abstract classes, Reader and Writer. These abstract classes handle Unicode character streams. Java has several concrete subclasses of each of these. The character stream classes are shown in Table 12-2.

 

The abstract classes Reader and Writer define several key methods that the other stream classes implement. Two of the most important methods are read( ) and write( ), which read and write characters of data, respectively. These methods are overridden by derived stream classes.

 

Stream                                   Class                         Meaning

BufferedInputStream             Buffered        input stream

BufferedOutputStream          Buffered        output stream

ByteArrayInputStream                                  Input stream that reads from a byte array

ByteArrayOutputStream                              Output stream that writes to a byte array

DataInputStream                                          An input stream that contains methods for

                                                                       reading the Java standard data types

DataOutputStream                                       An output stream that contains methods for  

                                                                       writing the Java standard data types

 

FileInputStream                                             Input stream that reads from a file

FileOutputStream                                          Output stream that writes to a file

FilterInputStream                                           Implements InputStream

FilterOutputStream                                        Implements OutputStream

InputStream                                                    Abstract class that describes stream input

OutputStream                                                 Abstract class that describes stream output

PipedInputStream                                          Input pipe

PipedOutputStream                                      Output pipe

PrintStream                                                    Output stream that contains print()&println()

PushbackInputStream                                  Input stream that supports one-byte "unget,"

                                                                        which returns a byte to the input stream

RandomAccessFile                                      Supports random access file I/O

SequenceInputStream                                  Input stream that is a combination of two or

more input streams that will be read   

sequentially, one after the other

                          Table 12-1. The Byte Stream Classes

 

Stream                                   Class                         Meaning

BufferedReader                  Buffered        input character stream

BufferedWriter                    Buffered        output character stream

CharArrayReader                                     Input stream that reads from a character array

CharArrayWriter                                       Output stream that writes to a character array

FileReader                                                Input stream that reads from a file

FileWriter                                                   Output stream that writes to a file

FilterReader                         Filtered        reader

FilterWriter                           Filtered         writer

InputStreamReader                                  Input stream that translates bytes to characters

LineNumberReader                                 Input stream that counts lines

OutputStreamWriter                                Output stream that translates characters to bytes

PipedReader                                            Input pipe

PipedWriter                                              Output pipe

PrintWriter                                                 Output stream that contains print( ) and println( )

PushbackReader                                     Input stream that allows characters to be returned to the input stream

                                                                   Reader  Abstract class that describes character stream input

StringReader                                            Input stream that reads from a string

StringWriter                                              Output stream that writes to a string

                                                                   Writer Abstract class that describes character stream output

                            Table 12-2. The Character Stream I/O Classes

No comments: