0% found this document useful (0 votes)
10 views

03 Io1

Uploaded by

Trần Vũ
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
10 views

03 Io1

Uploaded by

Trần Vũ
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 54

Java Programming Course

IO
Session objectives

 What is an I/O stream?


 Types of Streams
 Stream class hierarchy
 Control flow of an I/O operation
using Streams
 Byte streams
 Character streams
 Buffered streams
 Standard I/O streams
 Data streams
 Object streams
 File class

2
I/O stream

3
I/O Streams

• An I/O Stream represents an input source or an output


destination.
• A stream can represent many different kinds of sources and
destinations, including disk files, devices, other programs, and
memory arrays.
• Streams support many different kinds of data
o simple bytes, primitive data types, localized characters, and objects.

• Some streams simply pass on data; others manipulate and


transform the data in useful ways.

4
I/O Streams

A stream is a sequence of data.


• A program uses an input stream to read data from a source, one
item at a time:

• A program uses an output stream to write data to a destination,


one item at time:

5
Types of Streams

6
General Stream Types

• Character and Byte Streams

• Input and Output Streams

• Based on source or destination

• Node and Filter Streams

• Whether the data on a stream is manipulated or transformed or


not.

7
Character and Byte Streams

• Byte streams
o For binary data
o Root classes for byte streams:
• The InputStream Class
• The OutputStream Class
• Both classes are abstract

• Character streams
o For Unicode characters
o Root classes for character streams:
• The Reader class
• The Writer class
• Both classes are abstract

8
Input and Output Streams

• Input or source streams


o Can read from these streams
o Root classes of all input streams:
• The InputStream Class
• The Reader Class

• Output or sink (destination) streams


o Can write to these streams
o Root classes of all output streams:
• The OutputStream Class
• The Writer Class

9
Node and Filter Streams

• Node streams (Data sink stream)


o Contain the basic functionality of reading or writing from a
specific location
o Types of node streams include files, memory and pipes

• Filter streams (Processing stream)


o Layered onto node streams between threads or processes
o For additional functionality- altering or managing data in the
stream

• Adding layers to a node stream is called stream


chaining 10
Java IO Stream hierarchy

11
Control Flow of an I/O operation

1. Create a stream object and associate it with a data-


source (data-destination)

2. Give the stream object the desired functionality


through stream chaining

3. while (there is more information)

4. read(write) next data from(to) the stream

5. close the stream

12
Byte Stream

13
Byte Stream

• Programs use byte streams to perform input and output of 8-bit


bytes
• All byte stream classes are descended from InputStream and
OutputStream
• There are many byte stream classes
o FileInputStream and FileOutputStream

• They are used in much the same way; they differ mainly in the
way they are constructed

14
When Not to Use Byte Streams?

• Byte Stream represents a kind of low-level I/O that you should


avoid
o If the data contains character data, the best approach is to use
character streams
o There are also streams for more complicated data types

• Byte streams should only be used for the most primitive I/O
• All other streams are based on byte stream

15
Byte Stream example

16
Character Stream

17
Character Stream

• The Java platform stores character values using Unicode


conventions
• Character stream I/O automatically translates this internal
format to and from the local character set.
o In Western locales, the local character set is usually an 8-bit
superset of ASCII.

• All character stream classes are descended from Reader and


Writer
• As with byte streams, there are character stream classes that
specialize in file I/O: FileReader and FileWriter.

18
Character Stream

• For most applications, I/O with character streams is no more


complicated than I/O with byte streams.
o Input and output done with stream classes automatically translates to
and from the local character set.
o A program that uses character streams in place of byte streams
automatically adapts to the local character set and is ready for
internationalization — all without extra effort by the programmer.
o If internationalization isn't a priority, you can simply use the character
stream classes without paying much attention to character set issues.
o Later, if internationalization becomes a priority, your program can be
adapted without extensive recoding.

19
Character Stream example

20
Character Stream and Byte Stream

• Character streams are often "wrappers" for byte streams


• The character stream uses the byte stream to perform the
physical I/O, while the character stream handles translation
between characters and bytes.
o FileReader, for example, uses FileInputStream, while FileWriter uses
FileOutputStream

• There are two general-purpose byte-to-character "bridge"


streams: InputStreamReader and OutputStreamWriter. Use
them to create character streams when there are no
prepackaged character stream classes that meet your needs.

21
Line-Oriented I/O

• Character I/O usually occurs in bigger units than single


characters.
o One common unit is the line: a string of characters with a line
terminator at the end.
o A line terminator can be a carriage-return/line-feed sequence ("\r\
n"), a single carriage-return ("\r"), or a single line-feed ("\n").

22
Line-Oriented I/O example

23
Buffered Stream

24
The necessary of Buffered Streams

• An unbuffered I/O means each read or write request is handled


directly by the underlying OS
o This can make a program much less efficient, since each such request
often triggers disk access, network activity, or some other operation
that is relatively expensive.

• To reduce this kind of overhead, the Java platform implements


buffered I/O streams
o Buffered input streams read data from a memory area known as a
buffer; the native input API is called only when the buffer is empty
o Similarly, buffered output streams write data to a buffer, and the
native output API is called only when the buffer is full.
25
Buffered Stream Classes

• There are four buffered stream classes used to wrap


unbuffered streams:

o BufferedInputStream and BufferedOutputStream create buffered


byte streams.

o BufferedReader and BufferedWriter create buffered character


streams.

26
Buffered Stream Classes - Reading demo

27
Buffered Stream Classes - Writing demo

28
Flushing Buffered Streams

• It often makes sense to write out a buffer at critical points,


without waiting for it to fill. This is known as flushing the buffer.
• Some buffered output classes support autoflush, specified by an
optional constructor argument.
o When autoflush is enabled, certain key events cause the buffer to be
flushed
o For example, an autoflush PrintWriter object flushes the buffer on
every invocation of println or format.

• To flush a stream manually, invoke its flush method


o The flush method is valid on any output stream, but has no effect unless
the stream is buffered.
29
Standard Streams

30
Standard Streams on Java Platform

• Three standard streams


o Standard Input, accessed through System.in
o Standard Output, accessed through System.out
o Standard Error, accessed through System.err

• These objects are defined automatically and do not


need to be opened
• System.out and System.err are defined as
PrintStream objects

31
Data Streams

32
Data Streams

• Data streams support binary I/O of primitive data type values


(boolean, char, byte, short, int, long, float, and double) as well as
String values
• All data streams implement either the DataInput interface or
the DataOutput interface
• DataInputStream and DataOutputStream are most widely-used
implementations of these interfaces

33
The DataOutputStream class

• A data output stream lets an application write primitive Java


data types to an output stream in a portable way. An application
can then use a data input stream to read the data back in.
• Constructor:
DataOutputStream(OutputStream out)
Creates a new data output stream to write data to the
specified underlying output stream.

34
DataOutputStream demo

35
The DataInputStream class

• A data input stream lets an application read primitive Java data


types from an underlying input stream in a machine-independent
way. An application uses a data output stream to write data that
can later be read by a data input stream.
• Constructor :
DataInputStream(InputStream in)
Creates a DataInputStream that uses the specified underlying
InputStream.

36
The DataInputStream exemple

37
Object Streams

38
Object Serialization

• Persistence is the concept that an object can exist separate


from the executing program that creates it
• Java contains a mechanism called object serialization for
creating persistent objects executing program that creates it.
• When an object is serialized, it is transformed into a sequence
of bytes; this sequence is raw binary representation of the
object. Later, this representation can be restored to the
original object. Once serialized, the object can be stored in a
file for later use.

39
Object Streams

• Object streams support I/O of objects


o Like Data streams support I/O of primitive data types
o The object has to be Serializable type

• The object stream classes are ObjectInputStream


and ObjectOutputStream
o These classes implement ObjectInput and ObjectOutput,
which are subinterfaces of DataInput and DataOutput
o An object stream can contain a mixture of primitive and
object values

40
Object Serialization

• Any object we want to serialize must implement the Serializable


interface.
• To serialize an object, we invoke the writeObject method of
an ObjectOutputStream.
• To deserialize the object, we invoke the readObject method of
an ObjectInputStream.
• The actual data streams to which the serialized object is
written can represent a file, network communication, or some
other type of stream.

41
Object serialization demo

42
Output and Input of Complex Objects

• The writeObject and readObject methods are simple to use, but


they contain some very sophisticated object management logic
o This isn't important for a class like Calendar, which just encapsulates
primitive values. But many objects contain references to other
objects.

• If readObject is to reconstitute an object from a stream, it has


to be able to reconstitute all of the objects the original object
referred to.
o These additional objects might have their own references, and so on.

43
I/O of multiple referred-to objects

• Object a contains references to objects b and c, while b contains


references to d and e
• Invoking writeObject(a) writes not just a, but all the objects necessary
to reconstitute a, so the other four objects in this web are written also
• When a is read back by readObject, the other four objects are read
back as well, and all the original object references are preserved.

44
NIO - New I/O

45
NIO.2 - New I/O version 2

• Is aimed at simplifying I/O in Java


• A new file system and path abstraction
o Based on java.nio.file.Path
o Bulk access to file attributes
o File system specific support (e.g. Symbolic links)
o Extra providers (e.g. zip files treated as normal files)

• Asynchronous (non-blocking) I/O


o For sockets and files
o Mainly utilises java.util.concurrent.Future

• Socket/Channel construct
o Binding, options and multicast
46
NIO.2 - Path

• java.nio2.file.Path interface
o Typically represents a file on a file system
o normalize() method removes constructs such as . and .. in a Path
o relativize(Path) constructs relative Path between this path and the
one given
o Lots of other expected methods defined in the interface
o Dealing with real path, absolute path etc
o Can convert java.io.File objects via the toFile() method

• java.nio2.file.Paths
o Helper class, provides get(URI) method to return you a Path
o Uses FileSystems helper class under the hood
o Uses the default file system unless you specify otherwise
47
NIO.2 - Files

• java.nio2.file.Files helper class


o Day to day class for performing simple file I/O

• Many common methods


o copy
o delete
o move
o createDirectory/File/Link
o write
o readAllLines
o walkFileTree (recurse over a directory)
o newInputStream/OutputStream

• Combined with try-with-resources makes code concise


48
URLStream to file - Java 6 vs. Java 7

49
NIO.2 - Asynchronous I/O

• The ability to perform read/write operations in the background


o Without having to write your own java.util.concurrent code

• Is available for:
o file I/O (AsynchronousFileChannel)
o networking I/O (AsynchronousSocketChannel)
• And AsynchronousServerSocketChannel
• Can work in two styles
o Future based (order coffee, do something else, collect coffee)
o Callbacks (order coffee, do something else, have coffee thrown at
you)

50
NIO.2 - Future based file I/O example

51
NIO.2 - Callback based file I/O example

52
Summary

 What is an I/O stream?


 Types of Streams
 Stream class hierarchy
 Control flow of an I/O operation using Streams
 Byte streams
 Character streams
 Buffered streams
 Standard I/O streams
 Data streams
 Object streams
 File class

53
54

You might also like