✦ Byte streams
✦ Character streams
✦ Buffered streams
✦ Scanning and formatting
✦ I/O from the command line
✦ Data streams
✦ Object streams
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.
30 trang |
Chia sẻ: candy98 | Lượt xem: 483 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Object-Oriented Programming - Lecture 5: I/O Streams - Lê Hồng Phương, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
August 2012
Object-Oriented Programming
Lecture 5: I/O Streams
Dr. Lê H!ng Ph"#ng -- Department of Mathematics, Mechanics and Informatics, VNUH
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.
3
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.
4
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.
5
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.
8
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:
✦ 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().
BufferedReader bufferedReader = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("output.txt"));
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.
✦ Use regular expressions to specify a different separator:
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();
}
}
}
}
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 {
s.next();
}
}
} finally {
s.close();
}
System.out.println(sum);
}
}
8.5
32,767
3.14159
1,000,000.1
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:
✦ Console: a single, predefined object that has most features provided by the standard
streams. It is particularly useful for secure password entry.
InputStreamReader cin = new InputStreamReader(System.in);
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;
out = new ObjectOutputStream(new
BufferedOutputStream(
new FileOutputStream(dataFile)));
out.writeObject(Calendar.getInstance());
ObjectInputStream in = null;
in = new ObjectInputStream(new
BufferedInputStream(
new FileInputStream(dataFile)))
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