Java Reference
In-Depth Information
12.9.5 Text input
The complement to the output of text with a
FileWriter
is the input with a
FileReader
. As you
might expect, a complementary set of three input steps is required: opening the file, reading from
it, and closing it. Just as the natural units for writing text are characters and strings, the obvious
units for reading text are characters and lines. However, although the
FileReader
class contains
a method to read a single character,
6
it does not contain a method to read a line. The problem with
reading lines from a file is that there is no predefined limit to the length of a line. This means that
any method to return the next complete line from a file must be able to read an arbitrary number of
characters. For this reason, we usually want to be working with the
BufferedReader
class, which
does define a
readLine
method. However,
BufferedReader
cannot open files! Therefore,
we must create a
FileReader
first and immediately wrap it in a
BufferedReader
object.
Thereafter, we ignore the
FileReader
object and work solely with the
BufferedReader
.
The line-termination character is always removed from the
String
that
readLine
returns, and
a
null
value is used to indicate the end of file.
This suggests the following basic pattern for reading the contents of a text file:
try {
BufferedReader reader = new BufferedReader(
new FileReader("
...
name of file
...
"));
String line = reader.readLine();
while(line != null) {
do something with line
line = reader.readLine();
}
reader.close();
}
catch(FileNotFoundException e) {
the specified file could not be found
}
catch(IOException e) {
something went wrong with reading or closing
}
Note that we don't even bother to store the
FileReader
object into a variable, but pass it
straight to the constructor of
BufferedReader
. This avoids the confusion of having two
Reader
variables referring to the same source of input, because we should access the file only
via the
BufferedReader
object.
With Java 7, we would use a try-with-resources statement here, as above, but also see below for
an alternative way to create the
BufferedReader
via the
Files
class.
Code 12.21 illustrates the practical use of a
BufferedReader
in the
tech-support
project from
Chapter 5. This has been done so that we can read the system's default responses from a file
rather than hardwiring them into the code of the
Responder
class (project:
tech-support-io
).
6
In fact, its
read
method returns each character as an
int
value rather than as a
char
, because it uses
an out-of-bounds value, -1, to indicate the end of the file. This is exactly the sort of technique we de-
scribed in Section 12.3.2.
Search WWH ::
Custom Search