Download as pdf or txt
Download as pdf or txt
You are on page 1of 27

Streams

Chapter 10
• A stream is an object that enables the flow of 
File I/O p g
data between a program and some I/O device 
or file
– If the data flows into a program, then the stream 
If the data flows into a program then the stream
is called an input stream
– If the data flows out of a program, then the 
If th d t fl t f th th
stream is called an output stream

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐2

Streams Text Files and Binary Files


Text Files and Binary Files
• IInput streams can flow from the keyboard or from a 
fl f h k b d f • Files that are designed to be read by human beings, 
file and that can be read or written with an editor are 
–S
System.in
t i is an input stream that connects to the 
i i t t th t t t th called text files
keyboard
Scanner keyboard
y = new Scanner(System.in);
( y ); – Text files can also be called ASCII files because the data 
they contain uses an ASCII encoding scheme
• Output streams can flow to a screen or to a file
– An advantage of text files is that the are usually the same 
– System.out
y is an output stream that connects to the 
p
screen on all computers, so that they can move from one 
ll t th t th f
System.out.println("Output stream"); computer to another

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐3 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐4


Text Files and Binary Files
Text Files and Binary Files Writing to a Text File
Writing to a Text File
• Fil
Files that are designed to be read by programs and 
th t d i dt b db d • The class PrintWriter is a stream class 
that consist of a sequence of binary digits are called 
binary files
binary files that can be used to write to a text file
– Binary files are designed to be read on the same type of  – An object of the class PrintWriter has the 
computer and with the same programming language as 
the computer that created the file
the computer that created the file methods print and println
methods print and println
– An advantage of binary files is that they are more efficient  – These are similar to the System.out methods 
to process than text files
– Unlike most binary files, Java binary files have the 
of the same names but are used for text file
of the same names, but are used for text file 
advantage of being platform independent also output, not screen output

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐5 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐6

Writing to a Text File


Writing to a Text File Writing to a Text File
Writing to a Text File
• All
All the file I/O classes that follow are in the package 
h fil I/O l h f ll i h k • A stream of the class PrintWriter is created and 
java.io, so a program that uses PrintWriter will start 
with a set of import
p statements: connected to a text file for writing as follows:
import java.io.PrintWriter; PrintWriter outputStreamName;
import java.io.FileOutputStream; outputStreamName = new PrintWriter(new
i
import
t j
java.io.FileNotFoundException;
i Fil N tF dE ti FileOutputStream(FileName));
• The class PrintWriter has no constructor that takes a file  – The class FileOutputStream takes a string representing the file 
name as its argument
name as its argument name as its argument
– It uses another class, FileOutputStream, to convert a file name  – The class PrintWriter takes the anonymous 
to an object that can be used as the argument to its (the  FileOutputStream object as its argument
PrintWriter) constructor
PrintWriter) constructor

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐7 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐8


Writing to a Text File
Writing to a Text File Writing to a Text File
Writing to a Text File
• Thi
This produces an object of the class PrintWriter
d bj t f th l P i tW it • When a text file is opened in this way, a 
that is connected to the file FileName FileNotFoundException can be thrown
– The
The process of connecting a stream to a file is called 
process of connecting a stream to a file is called – In this context it actually means that the file could not be created
y
opening the file – This type of exception can also be thrown when a program 
attempts to open a file for reading and there is no such file
– If the file already exists, then doing this causes the old 
contents to be lost
contents to be lost • It
It is therefore necessary to enclose this code in exception 
is therefore necessary to enclose this code in exception
handling blocks
– If the file does not exist, then a new, empty file named  – The file should be opened inside a try block
FileName is created – A catch
A catch block should catch and handle the possible exception
block should catch and handle the possible exception
• After doing this, the methods print and println – The variable that refers to the PrintWriter object should be 
can be used to write to the file declared outside the block (and initialized to null) so that it is 
not local to the block
not local to the block

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐9 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐10

Writing to a Text File


Writing to a Text File Writing to a Text File
Writing to a Text File
• When a program is finished writing to a file, it should  • O
Output streams connected to files are usually 
d fil ll
always close the stream connected to that file buffered
outputStreamName.close(); –RRather than physically writing to the file as soon as 
th th h i ll iti t th fil
possible, the data is saved in a temporary location (buffer)
– This allows the system to release any resources used to 
– When enough data accumulates, or when the method 
When enough data accumulates or when the method
connect the stream to the file flush is invoked, the buffered data is written to the file 
– If the program does not close the file before the program  all at once
ends, Java will close it automatically, but it is safest to close 
d J ill l i i ll b i i f l – This is more efficient, since physical writes to a file can be 
it explicitly slow

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐11 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐12


Writing to a Text File
Writing to a Text File File Names
File Names
• Th
The method close
th d l i k th
invokes the method flush, 
th d fl h • The rules for how file names should be formed 
h l f h fil h ld b f d
thus insuring that all the data is written to the file depend on a given operating system, not Java
– If
If a program relies on Java to close the file, and the 
a program relies on Java to close the file and the
program terminates abnormally, then any output that was  – When a file name is given to a java constructor for 
buffered may not get written to the file a stream, it is just a string, not a Java identifier 
– Also, if a program writes to a file and later reopens it to 
Also if a program rites to a file and later reopens it to (
(e.g., "fileName.txt") )
read from the same file, it will have to be closed first 
anyway – Any suffix used, such as .txt has no special 
– The sooner a file is closed after writing to it, the less likely  meaning to a Java program
it is that there will be a problem

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐13 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐14

A File Has Two Names


A File Has Two Names IOException
• EEvery input file and every output file used by a 
i t fil d t t fil db • Wh
When performing file I/O there are many situations in which 
f i fil I/O h i i i hi h
program has two names: an exception, such as FileNotFoundException, may be 
1. The real file name used by the operating system
1 The real file name used by the operating system thrown
2. The name of the stream that is connected to the file • Many of these exception classes are subclasses of the class 
• The actual file name is used to connect to the  IOException
stream – The class IOException is the root class for a variety of exception 
classes having to do with input and/or output
• The stream name serves as a temporary name for  • These exception classes are all checked exceptions
These exception classes are all checked exceptions
the file, and is the name that is primarily used 
h fil di h h i i il d – Therefore, they must be caught or declared in a throws clause
within the program

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐15 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐16


Unchecked Exceptions
Unchecked Exceptions Pitfall: a try Block is a Block
Pitfall:  a try Block is a Block
• In contrast, the exception classes  • Si
Since opening a file can result in an exception, it should be 
i fil l i i i h ld b
placed inside a try block
NoSuchElementException,  p • If the variable for a PrintWriter
If the variable for a PrintWriter object needs to be used 
object needs to be used
InputMismatchException, and  outside that block, then the variable must be declared outside 
the block
IllegalStateException are all  are all – Otherwise it would be local to the block, and could not be used 
unchecked exceptions elsewhere
– If it were declared in the block and referenced elsewhere, the 
– Unchecked exceptions are not required to be 
U h k d i i d b compiler will generate a message indicating that it is an undefined 
identifier
caught or declared in a throws clause

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐17 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐18

Appending to a Text File


Appending to a Text File toString Helps with Text File Output
Helps with Text File Output

• To create a PrintWriter object and connect  • If a class has a suitable toString() method, and 


it to a text file for appending, a second  anObject is an object of that class, then 
argument set to true must be used in the
argument, set to true, must be used in the  anObject can be used as an argument to 
constructor for the FileOutputStream
object System.out.println, and it will produce 
outputStreamName = new PrintWriter(new sensible output
FileOutputStream(FileName, true));
• The same thing applies to the methods print and 
– After this statement, the methods print, println println of the class PrintWriter
and/or printf can be used to write to the file
– The new text will be written after the old text
The new text will be written after the old text in the 
in the outputStreamName.println(anObject);
file

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐19 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐20


Some Methods of the Class PrintWriter Some Methods of the Class PrintWriter
(Part 1 of 3) (Part 2 of 3)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐21 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐22

Some Methods of the Class PrintWriter
Reading From a Text File Using Scanner
Reading From a Text File Using Scanner
(Part 3 of 3)
• Th
The class Scanner
l S can be used for reading from the 
b df di f th
keyboard as well as reading from a text file
– Simply replace the argument System.in
S p y ep ace t e a gu e t Syste . (to (to the Scanner
t e Sca e
constructor) with a suitable stream that is connected to the text file
Scanner StreamObject =
new Scanner(new FileInputStream(FileName));
• Methods of the Scanner class for reading input behave the 
g y g
same whether reading from the keyboard or reading from a 
text file
– For example, the nextInt and nextLine methods

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐23 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐24


Reading Input from a Text File Using Scanner Reading Input from a Text File Using Scanner
(Part 1 of 4) (Part 2 of 4)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐25 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐26

Reading Input from a Text File Using Scanner Reading Input from a Text File Using Scanner
(Part 3 of 4) (Part 4 of 4)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐27 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐28


Checking for the End of a Text File with 
Testing for the End of a Text File with Scanner
Testing for the End of a Text File with Scanner
hasNextLine (Part 1 of 4)
• A program that tries to read beyond the end of a 
file using methods of the Scanner class will 
cause an exception to be thrown
i b h
• However, instead of having to rely on an 
exception to signal the end of a file, the 
ti t i l th d f fil th
Scanner class provides methods such as 
hasNextInt and hasNextLine
and hasNextLine
– These methods can also be used to check that the 
next token to be input is a suitable element of the
next token to be input is a suitable element of the 
appropriate type

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐29 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐30

Checking for the End of a Text File with  Checking for the End of a Text File with 
hasNextLine (Part 2 of 4) hasNextLine (Part 3 of 4)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐31 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐32


Checking for the End of a Text File with  Checking for the End of a Text File with 
hasNextLine (Part 4 of 4) hasNextInt (Part 1 of 2)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐33 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐34

Checking for the End of a Text File with  Methods in the Class Scanner
hasNextInt (Part 2 of 2) (Part 1 of 11)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐35 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐36


Methods in the Class Scanner Methods in the Class Scanner
(Part 2 of 11) (Part 3 of 11)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐37 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐38

Methods in the Class Scanner Methods in the Class Scanner
(Part 4 of 11) (Part 5 of 11)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐39 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐40


Methods in the Class Scanner Methods in the Class Scanner
(Part 6 of 11) (Part 7 of 11)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐41 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐42

Methods in the Class Scanner Methods in the Class Scanner
(Part 8 of 11) (Part 9 of 11)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐43 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐44


Methods in the Class Scanner Methods in the Class Scanner
(Part 10 of 11) (Part 11 of 11)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐45 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐46

Reading From a Text File Using 
Reading From a Text File Using BufferedReader
Reading From a Text File Using BufferedReader
BufferedReader
• Th
The class BufferedReader
l B ff dR d is a stream class that can be 
i t l th t b • Like the classes PrintWriter and Scanner,
used to read from a text file BufferedReader has no constructor that takes a file 
– An object of the class BufferedReader
object o t e c ass u e ed eade has the methods read
as t e et ods ead aand 
d name as its argument
name as its argument
readLine
– It needs to use another class, FileReader, to convert the file 
• A program using BufferedReader, like one using  name to an object that can be used as an argument to its (the 
PrintWriter will start with a set of import statements:
PrintWriter, will start with a set of import BufferedReader) constructor
BufferedReader) constructor
import java.io.BufferedReader; • A stream of the class BufferedReader is created and 
import
p j
java.io.FileReader; connected to a text file as follows:
import java.io.FileNotFoundException; BufferedReader readerObject;
import java.io.IOException; readerObject = new BufferedReader(new
FileReader(FileName));
FileReader(FileName))
– This opens the file for reading

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐47 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐48


Reading Input from a Text File Using 
Reading From a Text File
Reading From a Text File BufferedReader (Part 1 of 3)
• Aft
After these statements, the methods read
th t t t th th d d and 
d
readLIne can be used to read from the file
– The
The readLine
readLine method is the same method used to read 
method is the same method used to read
from the keyboard, but in this case it would read from a 
file
– The read
The d method reads a single character, and returns a 
method reads a single character and returns a
value (of type int) that corresponds to the character read
– Since the read method does not return the character itself, 
a type cast must be used:
char next = (char)(readerObject.read());

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐49 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐50

Reading Input from a Text File Using  Reading Input from a Text File Using 
BufferedReader (Part 2 of 3) BufferedReader (Part 3 of 3)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐51 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐52


Some Methods of the Class BufferedReader
Reading From a Text File
Reading From a Text File (Part 1 of 2)

• A program using a BufferedReader object in 
this way may throw two kinds of exceptions
– An attempt to open the file may throw a 
FileNotFoundException (which in this case 
has the expected meaning)
– An invocation of readLine may throw an 
IOE
IOException
ti
– Both of these exceptions should be handled 

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐53 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐54

Some Methods of the Class BufferedReader
(Part 2 of 2) Reading Numbers
Reading Numbers
• Unlike the Scanner class, the class 
BufferedReader has no methods to read a number 
from a text file
from a text file
– Instead, a number must be read in as a string, and then 
converted to a value of the appropriate numeric type using one 
of the wrapper classes
of the wrapper classes
– To read in a single number on a line by itself, first use the 
method readLine, and then use Integer.parseInt, 
D bl t t t th t i i t
Double.parseDouble, etc. to convert the string into a 
D bl
number
– If there are multiple numbers on a line,  StringTokenizer
can be used to decompose the string into tokens, and then the 
b d d h i i k d h h
tokens can be converted as described above

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐55 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐56


Testing for the End of a Text File
Testing for the End of a Text File Path Names
Path Names
• Th
The method readLine
th d dLi of the class 
f th l • When a file name is used as an argument to a 
BufferedReader returns null when it tries to 
read beyond the end of a text file
read beyond the end of a text file p g
constructor for opening a file, it is assumed 
– A program can test for the end of the file by testing for the  that the file is in the same directory or folder 
value null when using readLine
• The method read
h h d of the class BufferedReader
f h l
as the one in which the program is run
as the one in which the program is run
returns -1 when it tries to read beyond the end of a  • If it is not in the same directory, the full or 
text file
text file
– A program can test for the end of the file by testing for the 
relative path name must be given
l h b
value -1 when using read

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐57 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐58

Path Names
Path Names Path Names
Path Names
• A path name
h not only gives the name of the 
l i h f h • The way path names are specified depends on the 
file, but also the directory or folder in which  operating system
the file exists – A typical UNIX path name that could be used as a file 
• A full path name
f p ggives a complete path name, 
p p , name argument is
"/user/sallyz/data/data.txt"
starting from the root directory
– A BufferedReader input stream connected to this 
• A relative path name
A relative path name gives the path to the file, 
gives the path to the file fil i
file is created as follows:
d f ll
starting with the directory in which the  BufferedReader inputStream =
program is located
program is located new BufferedReader(new
FileReader("/user/sallyz/data/data.txt"));

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐59 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐60


Path Names
Path Names Path Names
Path Names
• The Windows operating system specifies path names in a  • A
A double backslash (\\) must be used for a Windows 
d bl b k l h (\\) tb df Wi d
different way path name enclosed in a quoted string
– A typical Windows path name is the following:
– This
This problem does not occur with path names read in from 
problem does not occur with path names read in from
the keyboard
C:\dataFiles\goodData\data.txt
– A
A BufferedReader
BufferedReader input stream connected to this file is 
input stream connected to this file is • Problems with escape characters can be avoided 
created as follows: altogether by always using UNIX conventions when 
l h b l h
BufferedReader inputStream = new writing a path name
B ff
BufferedReader(new
dR d ( FileReader
Fil R d –A
A Java program will accept a path name written in either 
Java program will accept a path name written in either
("C:\\dataFiles\\goodData\\data.txt")); Windows or Unix format regardless of the operating 
– Note that in Windows \\ must be used in place of \, since a  system on which it is run
single backslash denotes an the beginning of an escape sequence

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐61 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐62

Nested Constructor Invocations


Nested Constructor Invocations Nested Constructor Invocations
Nested Constructor Invocations
• Each of the Java I/O library classes serves only 
h f h / lib l l new BufferedReader(new
ff d d ( FileReader("stuff.txt"))
il d ( ff ))

one function, or a small number of functions • Above, the anonymous FileReader object establishes a 


connection with the stuff txt file
connection with the stuff.txt
– Normally two or more class constructors are  – However, it provides only very primitive methods for input
combined to obtain full functionality
• The
The constructor for BufferedReader
constructor for BufferedReader takes this 
takes this
• Therefore, expressions with two constructors  FileReader object and adds a richer collection of input 
g /
are common when dealing with Java I/O  methods
classes – This transforms the inner object into an instance variable of the outer 
object

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐63 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐64


System.in, System.out, and  System.in, System.out, and 
System.err System.err
• Th
The standard streams System.in, System.out, and 
t d d t S t i S t t d • U
Using these methods, any of the three standard 
i th th d f th th t d d
System.err are automatically available to every Java  streams can be redirected 
program
– System.out is used for normal screen output
– For
For example, instead of appearing on the screen, error 
example instead of appearing on the screen error
messages could be redirected to a file
– System.err is used to output error messages to the screen
• The System
yste class provides three methods (setIn, setOut, 
p (set , set ut, • In order to redirect a standard stream, a new stream 
and setErr)  for redirecting these standard streams: object is created
b d
public static void setIn(InputStream inStream) – Like other streams created in a program, a stream object 
public static void setOut(PrintStream outStream) used for redirection must be closed after I/O is finished
used for redirection must be closed after I/O is finished
public static void setErr(PrintStream outStream) – Note, standard streams do not need to be closed

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐65 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐66

System.in, System.out, and  System.in, System.out, and 
System.err System.err
• Redirecting System.err: catch(FileNotFoundException e)
{
public void getInput()
System.err.println("Input file not found");
{
}
. . .
finally
PrintStream errStream = null;
{
try
. . .
{
errStream.close();
();
errStream
St = new P
PrintStream(new
i tSt (
}
FileOuptputStream("errMessages.txt"));
}
System.setErr(errStream);
. . . //Set up input stream and read
}

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐67 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐68


Some Methods in the Class File
The File Class
The File (Part 1 of 5)
• The File class is like a wrapper class for file names
– The constructor for the class File takes a name, (known 
as the abstract name) as a string argument, and produces 
an object that represents the file with that name 
– The File
Th Fil object and methods of the class File
bj t d th d f th l Fil can be  b
used to determine information about the file and its 
properties

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐69 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐70

Some Methods in the Class File Some Methods in the Class File
(Part 2 of 5) (Part 3 of 5)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐71 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐72


Some Methods in the Class File Some Methods in the Class File
(Part 4 of 5) (Part 5 of 5)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐73 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐74

Binary Files
Binary Files Writing Simple Data to a Binary File
Writing Simple Data to a Binary File
• Bi
Binary files store data in the same format used by 
fil t d t i th f t db • Th
The class ObjectOutputStream
l Obj tO t tSt i
is a stream class that can 
t l th t
computer memory to store the values of variables be used to write to a binary file
– No
No conversion needs to be performed when a value is 
conversion needs to be performed when a value is – An
An object of this class has  methods to write strings, values of 
object of this class has methods to write strings, values of
stored or retrieved from a binary file primitive types, and objects to a binary file
• Java binary files, unlike other binary language files,  • A program using ObjectOutputStream needs to import 
are portable
bl several classes from package java io:
several classes from package java.io:
import java.io.ObjectOutputStream;
– A binary file created by a Java program can be moved from 
one computer to another
one computer to another import
p j
java.io.FileOutStream;
import java.io.IOException;
– These files can then be read by a Java program, but only by 
a Java program

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐75 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐76


Opening a Binary File for Output
Opening a Binary File for Output Opening a Binary File for Output
Opening a Binary File for Output
• A
An ObjectOutputStream
Obj tO t tSt object is created and 
bj t i t d d • Aft
After opening the file, ObjectOutputStream
i th fil Obj tO t tSt methods 
th d
connected to a binary file as follows: can be used to write to the file
ObjectOutputStream
bject utput t ea outputStreamName
output t ea a e = new
e – Methods used to output primitive values include writeInt, 
et ods used to output p t e a ues c ude te t,
ObjectOutputStream(new writeDouble, writeChar, and writeBoolean
FileOutputStream(FileName)); • UTF is an encoding scheme used to encode Unicode 
– The
The constructor for FileOutputStream
constructor for FileOutputStream may throw a 
may throw a characters that favors the ASCII character set
characters that favors the ASCII character set
FileNotFoundException – The method writeUTF can be used to output values of type 
– The constructor for ObjectOutputStream may throw  String
an IOException • The stream should always be closed after writing
– Each of these must be handled

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐77 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐78

Some Methods in the Class  Some Methods in the Class 
ObjectOutputStream (Part 1 of 5) ObjectOutputStream (Part 2 of 5)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐79 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐80


Some Methods in the Class  Some Methods in the Class 
ObjectOutputStream (Part 3 of 5) ObjectOutputStream (Part 4 of 5)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐81 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐82

Some Methods in the Class 
Reading Simple Data from a Binary File
Reading Simple Data from a Binary File
ObjectOutputStream (Part 5 of 5)
• Th
The class ObjectInputStream
l Obj tI tSt i
is a stream class that can 
t l th t
be used to read from a binary file
– An
An object of this class has  methods to read strings, values of primitive 
object of this class has methods to read strings, values of primitive
types, and objects from a binary file
• A program using ObjectInputStream needs to import 
several classes from package java io:
several classes from package java.io:
import java.io.ObjectInputStream;
import
p j
java.io.FileInputStream;
p
import java.io.IOException;

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐83 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐84


Opening a Binary File for Reading
Opening a Binary File for Reading Opening a Binary File for Reading
Opening a Binary File for Reading
• A
An ObjectInputStream
bj object is created and 
bj i d d • Aft
After opening the file, ObjectInputStream
i th fil Obj tI tSt methods can 
th d
connected to a binary file as follows: be used to read to the file
ObjectInputStream inStreamName = new – Methods used to input primitive values include readInt, 
et ods used to put p t e a ues c ude ead t,
readDouble, readChar, and readBoolean
ObjectInputStream(new
– The method readUTF is used to input values of type String
FileInputStream(FileName));
• If
If the file contains multiple types, each item type must be 
the file contains multiple types each item type must be
– The constructor for FileInputStream may throw a 
read in exactly the same order it was written to the file
FileNotFoundException
• The stream should be closed after reading
The stream should be closed after reading
– The constructor for ObjectInputStream
Th f Obj S may throw 
h
an IOException
– Each of these must be handled
Each of these must be handled

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐85 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐86

Some Methods in the Class ObjectInputStream Some Methods in the Class ObjectInputStream
(Part 1 of 5) (Part 2 of 5)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐87 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐88


Some Methods in the Class ObjectInputStream Some Methods in the Class ObjectInputStream
(Part 3 of 5) (Part 4 of 5)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐89 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐90

Some Methods in the Class ObjectInputStream Checking for the End of a Binary File the Correct 
(Part 5 of 5) Way
• All
All of the ObjectInputStream
f th Obj tI tSt methods that 
th d th t
read from a binary file throw an EOFException
when trying to read beyond the end of a file
when trying to read beyond the end of a file
– This can be used to end a loop that reads all the data in a 
file
• Note that different file‐reading methods check for 
h d ff fl d h d h kf
the end of a file in different ways
– Testing
Testing for the end of a file in the wrong way can cause a 
for the end of a file in the wrong way can cause a
program to go into an infinite loop or terminate 
abnormally

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐91 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐92


Binary I/O of Objects
Binary I/O of Objects Binary I/O of Objects
Binary I/O of Objects
• Objects can also be input and output from a binary file
Obj l b i d f bi fil • It is best to store the data of only one class type in any one file
I i b h d f l l i fil
– Use the writeObject method of the class  – Storing objects of multiple class types or objects of one class type 
ObjectOutputStream to write an object to a binary file mixed with primitives can lead to loss of data
– Use the readObject method of the class ObjectInputStream • In addition, the class of the object being read or written must 
to read an object from a binary file implement the Serializable interface
– In order to use the value returned by readObject
In order to use the value returned by readObject as an object of a 
as an object of a – Th
The Serializable
S i li bl interface is easy to use and requires no 
i f i d i
class, it must be type cast first: knowledge of interfaces
SomeClass someObject = – A class that implements the Serializable interface is said to be a 
(SomeClass)objectInp tStream readObject()
(SomeClass)objectInputStream.readObject(); serializable class

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐93 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐94

The Serializable Interface


The Serializable Array Objects in Binary Files
Array Objects in Binary Files
• In order to make a class serializable, simply add  • Si
Since an array is an object, arrays can also be read 
i bj l b d
implements Serializable to the   and written to binary files using readObject and 
writeObject
heading  of the class definition
– If the base type is a class, then it must also be serializable, 
public class SomeClass implements Serializable
just like any other class type
just like any other class type
• When a serializable class has instance variables  – Since readObject returns its value as type Object (like 
of a class type, then all those classes must be  any other object), it must be type cast to the correct array 
serializable also type:
SomeClass[] someObject =
– A class is not serializable unless the classes for all  (SomeClass[])objectInputStream readObject();
(SomeClass[])objectInputStream.readObject();
instance variables are also serializable for all levels of 
instance variables within classes

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐95 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐96


Random Access to Binary Files
Random Access to Binary Files Reading and Writing to the Same File
Reading and Writing to the Same File

• The streams for sequential access to files are 
h f i l fil • Th
The stream class RandomAccessFile, which is in the 
t l R d A Fil hi h i i th
java.io package, provides both read and write random 
the ones most commonly used for file access  access to a file in Java
in Java • A random access file consists of a sequence of numbered 
• However, some applications require very rapid 
, pp q y p bytes
– There is a kind of marker called the file pointer that is always 
access to records in very large databases positioned at one of the bytes
– These applications need to have random access to 
These applications need to have random access to – All reads and writes take place starting at the file pointer location
p g f p
particular parts of a file – The file pointer can be moved to a new location with the method 
seek

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐97 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐98

Reading and Writing to the Same File


Reading and Writing to the Same File Opening a File
Opening a File
• Al
Although a random access file is byte oriented, there 
h h d fil i b i d h • Th
The constructor for RandomAccessFile
t t f R d A Fil takes 
t k
are methods that allow for reading or writing values  either a string file name or an object of the class 
of the primitive types as well as string values to/from
of the primitive types as well as string values to/from  File as its first argument
as its first argument
a random access file • The second argument must be one of four strings:  
– These
These include readInt, readDouble, and readUTF
include readInt readDouble and readUTF – "rw",, meaning the code can both read and write to the 
g
for input, and writeInt, writeDouble, and  file after it is open
writeUTF for output – "r", meaning the code can read form the file, but not 
write to it
write to it
– It does no have writeObject or readObject – "rws" or "rwd" (See Table of methods from 
methods, however RandomAccessFile)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐99 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐100


Pitfall:  A Random Access File Need Not Start  Some Methods of the Class RandomAccessFile
(P t 1 f 7)
(Part 1 of 7)
Empty
• If
If the file already exists, then when it is opened, the 
th fil l d i t th h it i d th
length is not reset to 0, and the file pointer will be 
positioned at the start of the file
positioned at the start of the file
– This ensures that old data is not lost, and that the file 
pointer is set for the most likely position for reading (not 
writing)
• The length of the file can be changed with the 
setLength method
– In particular, the setLength method can be used to 
empty the file

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐101 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐102

Some Methods of the Class RandomAccessFile Some Methods of the Class RandomAccessFile
(P t 2 f 7)
(Part 2 of 7) (P t 3 f 7)
(Part 3 of 7)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐103 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐104


Some Methods of the Class RandomAccessFile Some Methods of the Class RandomAccessFile
(P t 4 f 7)
(Part 4 of 7) (P t 5 f 7)
(Part 5 of 7)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐105 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐106

Some Methods of the Class RandomAccessFile Some Methods of the Class RandomAccessFile
(P t 6 f 7)
(Part 6 of 7) (P t 7 f 7)
(Part 7 of 7)

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐107 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 10‐108

You might also like