Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

20
Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture

Transcript of Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Page 1: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Java Input/Output

CSE301

University of Sunderland

Harry Erwin, PhD

Half Lecture

Page 2: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Background

• Java’s I/O model is defined in terms of streams—ordered sequences of data with a source or destination.

• Initially, these were (8-bit) byte streams like cin, cout, and cerr for C++. The corresponding byte streams for Java are:– System.in (an InputStream)– System.out (a PrintStream)– System.err (an unbuffered PrintStream)

• Later, Unicode character streams were added. These are called Readers and Writers.

• These classes and interfaces are found in java.io.*• This is only a short introduction to a long subject! Read the

text! Test questions on this material!

Page 3: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Stacking Streams

• The important concept in working with Java I/O is stacking streams.

• That is, you apply adaptors to a stream to specialise it for a specific task.

• For example, a File can be used via a FileStream.

• A .gz file can be used via a GZIPInputStream.

Page 4: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Some Byte Stream Operations

• java.io.InputStream (base class for byte input)– int read()—reads a byte

– int read(byte[])—reads an array of bytes

– void close()—closes the stream

• java.io.OutputStream (base class for byte output)– void write(int)—writes a byte passed as int

– void write(byte[])—writes an array

– void flush()—flushes the stream

– void close()—closes the stream

Page 5: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Some Character Stream Operations

• java.io.Reader– int read()—reads a Unicode character– int read(char[])—reads a character array– boolean ready()—returns true if there is data to read– void close()

• java.io.Writer– void write(int)—writes a character– void write(char[])– void write(String)—writes a String– void flush()– void close()

Page 6: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Formatted Input/Output

• DataInput and DataOutput are interfaces used to transfer data other than bytes or characters (e.g., binary data). Implemented by:– DataInputStream—readType()– DataOutputStream—writeType()– RandomAccessFile—implements both and allows

positioning in the file.

where Type includes all the primitive types. readLine(), writeBytes(String), writeChars(String), and writeUTF(String) are used for String data.

Page 7: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Data Conversion

• The wrapper classes for the primitive types (e.g, Double for double) provide static methods for data conversion from a String to that type.

• All classes also define a toString() method to convert the class data to a String. This is used in println() and when Strings are constructed using the + and += operators. If you want this method to be useful, you should override the default method inherited from Object.

• Test questions!

Page 8: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Various InputStreams

• FileInputStream—built around a file.

• PipedInputStream—PipedInputStreams are connected to PipedOutputStreams and are used between threads.

• ByteArrayInputStream—Has an internal byte array provided by the creator of the stream and where the data are stored.

• StringBufferInputStream—Like a ByteArrayInputStream. The internal buffer is a String.

• SequenceInputStream—Reads from multiple streams, finishing one before going on to the next.

Page 9: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

More InputStreams

• FilterInputStream—Generally built around some other InputStream, using it as a source of data and doing further conversions. This ‘stacking’ can involve multiple filters. Examples include:– BufferedInputStream—Buffers the input and supports

mark and reset operations.– DataInputStream—Formatted input operations.– LineNumberInputStream—Reads one line at a time,

keeping count– PushBackInputStream—Allows the last byte to be

‘unread’ if desired. Useful for user interfaces.

Page 10: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Various OutputStreams

• PrintStream—provides print(arg) and println(arg) operations to output data in a readable form. Both operate by applying the toString() method to arg and then printing the resulting String. println() outputs an end of line as well.

• File-, Piped-, ByteArray-, Filter-, Buffered-, and DataOutputStream work generally as you would be expect.

Page 11: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Unicode Character Streams

• BufferedReader, BufferedWriter, LineNumberReader

• CharArrayReader, CharArrayWriter• FilterReader, PushBackReader, FilterWriter• InputStreamReader, OutputStreamWriter,

FileReader, FileWriter• PipedReader, PipedWriter• StringReader, StringWriter• PrintWriter

Page 12: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Files and Directories

• An instance of class File represents the pathname (a String) to some file or directory.

• File creation and deletion are handled through the File class.

• There are some problems having to do with pathnames for files in Java. No bugs; just a collection of surprises.

Page 13: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

File Input/Output

• A FileInputStream or FileOutputStream is built around a pathname or a File.

• Otherwise, it is basically a Stream of the appropriate type.

• You can build a FilterInputStream or a FilterOutputStream around these streams.

Page 14: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Data Compression

• Specialized filter streams exist to operate on data.• E.g., java.util.zip.GZIPOutputStream if created

around another OutputStream will apply gzip compression to the data.

• You can also use other classes in the java.util package to generate a checksum for the stream.

• The class java.util.zip.ZipFile allows you to access a ZIP archive and read the entries through a stream.

Page 15: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Interfacing to Arrays

• The ByteArrayXXX, StringReader/ StringWriter and CharArrayXXX streams allow you to read and write data stored in byte arrays and character strings.

Page 16: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Serialization

• This is the capacity to serialize objects, sending them over a stream and deserializing them at the other end to reconstruct the object. This can also be used to save objects offline.

• java.io.ObjectOutputStream and java.io.ObjectInputStream participate in this.

• Methods used: writeObject() and readObject().• Used in:

– Remote Method Invocation (RMI)– Handling persistent objects– Distributed agent networks

Page 17: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Networking

• In the java.net.* package.• Supports TCP and UDP protocols.• URL class is used to represent a Uniform

Resource Locator• Also supports sockets/ports with the Socket class.

I have watched one of my students write a working IRC client in Java in less than 15 minutes.

• Secure Socket Layer is available in Java 1.4.

Page 18: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Logging

• New in Java 1.4

• In the java.util.logging.* package.

• Automates the creation of a log with multiple severity thresholds.

• Can be used to create an audit trail for security.

Page 19: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

Non-Blocking I/O

• New for Java 1.4

• In java.nio.*

• Traditionally, Java I/O was blocking, with the thread having to wait for its data. This is non-blocking I/O.

• Supports high-performance I/O.

Page 20: Java Input/Output CSE301 University of Sunderland Harry Erwin, PhD Half Lecture.

XML

• New for Java 1.4

• Supports XML documents and document formats.

• SAXP, JAXP, and XDOC.

• Used in JavaServer Pages.

• If you care about XML, you care a lot.