Vous êtes sur la page 1sur 30

Object-Oriented Programming

Lecture 5: I/O Streams


Dr. L H!ng Ph"#ng -- Department of Mathematics, Mechanics and Informatics, VNUH

August 2012
1

Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
2

Thursday, August 2, 12
I/O streams

An I/O stream represents an input source and an output destination.

Different kinds of source and destination:

disk files, devices, other programs, memory arrays.

Different kinds of data:

simple bytes, primitive data types, objects.

Thursday, August 2, 12
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 a time.

Thursday, August 2, 12
Byte streams

Programs use byte streams to perform input and output on 8-bit bytes.

There are many byte stream classes.

All of them are descended from InputStream and OutputStream.

File I/O byte streams: FileInputStream and FileOutputStream.

Thursday, August 2, 12
Byte streams
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;

while ((c = in.read()) != -1) {


out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
6
}
Thursday, August 2, 12
Byte streams
A simple loop that reads the input stream
and writes the output stream, one byte at a
time.

Notice that read() returns an int value,


which allow it to use -1 to indicate that it
reaches the end of the stream.

Always close streams: very important!

The finally block guarantees that the


streams will be closed even if an error
occurs.

This helps avoid serious leaks.


7

Thursday, August 2, 12
When not to use byte streams?

CopyBytes represents a kind of low-level I/O that you should avoid.

Because the input.txt contains character data, the best approach is to


use character streams.

Why should talk about byte streams?

Because all other stream types are built on byte streams.

Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
9

Thursday, August 2, 12
Character streams

The Java platform stores character values using Unicode conventions.

A program that uses character streams automatically adapts to the


local character set (Vietnamese locale, US locales...)

All character stream classes are descended from Reader and Writer.

File I/O character streams: FileReader and FileWriter.

10

Thursday, August 2, 12
Character streams
public class CopyCharacters {
public static void main(String[] args) throws IOException {
FileReader inputStream = null;
FileWriter outputStream = null;
try {
inputStream = new FileReader("input.txt");
outputStream = new FileWriter("output.txt");

int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
11
}
Thursday, August 2, 12
Line-oriented I/O
public class CopyLines {
public static void main(String[] args) throws IOException {
BufferedReader inputStream = null;
PrintWriter outputStream = null;
try {
inputStream = new BufferedReader(new FileReader("input.txt"));
outputStream = new PrintWriter(new FileWriter("output.txt"));

String l;
while ((l = inputStream.readLine()) != null) {
outputStream.println(l);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
12
}
Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
13

Thursday, August 2, 12
Buffered streams

Unbuffered I/O: each read or write request is handled directly by the


underlying operating system.

This makes a program much less efficient since each such request
often triggers disk access, network activity or other expensive
operations.

Buffered I/O is much more efficient:

Read/write data from/to a memory area known as a buffer

The native input/output API is called only when the buffer is


empty or full.
14

Thursday, August 2, 12
Buffered streams

Convert an unbuffered stream into a buffered one using wrapping:


BufferedReader bufferedReader = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("output.txt"));

There are 4 buffered stream classes used to wrap unbuffered streams:

BufferedInputStream, BufferedOutputStream: buffered byte streams

BufferedReader, BufferedWriter: buffered character streams.

Flushing the buffer manually: invoke method flush().

15

Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
16

Thursday, August 2, 12
Scanning

Objects of type Scanner are useful for

breaking down formatted input into tokens;

translating individual tokens according to their data types.

17

Thursday, August 2, 12
Breaking input into tokens
A scanner uses white spaces (blanks, tabs, line terminators) to separate tokens.
public class ScanInput {
public static void main(String[] args) throws IOException {
Scanner s = null;
try {
s = new Scanner(new BufferedReader(new FileReader("input.txt")));

while (s.hasNext()) {
System.out.println(s.next());
}
} finally {
if (s != null) {
s.close();
}
}
}
}
Use regular expressions to specify a different separator: s.useDelimiter(",\\s*");
18

Thursday, August 2, 12
Translating individual tokens

Scanner also supports tokens for all of the primitive types.

Numeric values can use thousands separators:

32,767 is an integer value in a US locale.

Example: ScanSum reads a list of doubles and adds them up.

19

Thursday, August 2, 12
Translating individual tokens
public class ScanSum {
public static void main(String[] args) throws IOException {
Scanner s = null;
double sum = 0;
try {
s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt")));
s.useLocale(Locale.US);

while (s.hasNext()) {
if (s.hasNextDouble()) {
sum += s.nextDouble();
} else { 8.5
s.next(); 32,767
}
3.14159
}
} finally {
1,000,000.1
s.close();
}
System.out.println(sum); The output string is "1032778.74159"
}
} 20

Thursday, August 2, 12
Formatting

Stream objects that implement formatting are instance of either

PrintWriter, a character stream class or

PrintStream, a byte stream class.

These class implement

standard write() methods for simple byte and character output;

a set of methods for converting internal data into formatted output.

21

Thursday, August 2, 12
Formatting
public class Root {
public static void main(String[] args) {
int i = 2;
double r = Math.sqrt(i);
System.out.format("The square root of %d is %f.%n", i, r);
}
}
The square root of 2 is 1.414214.
d formats an integer value as a decimal value.
f formats a floating point value as a decimal value.
n outputs a platform-specific line terminator.
x formats an integer as a hexadecimal value.
s formats any value as a string.
tB formats an integer as a locale-specific month name.

System.out.format("%f, %1$+020.10f %n", Math.PI);

3.141593, +00000003.1415926536
22

Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
23

Thursday, August 2, 12
I/O from the command line
A program is often run from the command line and interacts with the user in the
command line environment. Two ways:

through standard streams;

through the Console.

Standard streams: System.in, System.out, System.err.

System.in is a byte stream with no character stream features. To use the standard
input as a character stream, do as follows:

InputStreamReader cin = new InputStreamReader(System.in);

Console: a single, predefined object that has most features provided by the standard
streams. It is particularly useful for secure password entry.
24

Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
25

Thursday, August 2, 12
Data streams
Data streams support binary I/O of primitive data type values (boolean, char,
byte, short, int, long, float and double) and String values.

All data streams implement either DataInput or DataOutput interface.

Two widely-used implementations: DataInputStream, DataOutputStream.


DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));

out.writeDouble(price);
out.writeInt(unit);
out.writeUTF(desc);

DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));

double price = in.readDouble();


int unit = in.readInt();
String desc = in.readUTF();

26

Thursday, August 2, 12
Content

Byte streams

Character streams

Buffered streams

Scanning and formatting

I/O from the command line

Data streams

Object streams
27

Thursday, August 2, 12
Object streams
Object streams support I/O of objects. Classes support serialization of their
objects if they implement the interface Serializable.

The object stream classes: ObjectInputStream, ObjectOutputStream.

These classes implements ObjectInput and ObjectOutput, which are


subinterfaces of DataInput and DataOutput.

This means that all the primitive data I/O methods supported by data
streams are also implemented in object streams.
ObjectOutputStream out = null; ObjectInputStream in = null;

out = new ObjectOutputStream(new in = new ObjectInputStream(new


BufferedOutputStream( BufferedInputStream(
new FileOutputStream(dataFile))); new FileInputStream(dataFile)))

out.writeObject(Calendar.getInstance()); Calendar date = (Calendar) in.readObject();


28

Thursday, August 2, 12
Exercises

Exercises 1. Write a program which creates a Deck object representing


a deck of cards (cf. previous exercises). Then:

Shuffles (randomly) the deck;

Saves the deck into a text file, each cards in a line;

Loads the file and restores the deck.

29

Thursday, August 2, 12
Exercises

Exercise 2. Write a class Student which represents a student whose


fields are id (int), name (String), mark (double).

Creates n students (n > 4) whose data are read from the standard
input;

Saves the students to a binary file using data streams;

Loads the saved file to restore and print the students to the
standard output.

Exercises 3. Same as Exercises 2 but using object streams to save and


load data instead of data streams.
30

Thursday, August 2, 12

Vous aimerez peut-être aussi