Title: Streams and File I/O (That is, Input/Output)
1Streams and File I/O (That is,
Input/Output)
- OR
- How you read data from files and write data to
files
2Streams
- Abstractly, a stream is a flow of data
- Data could be characters, numbers, bytes
consisting of binary digits, bytes consisting of
binary encoding of objects, etc. - If the data flows out of your program (and,
say, to a file or the monitor) then the stream is
an output stream - If the data flows in to your program, then the
stream is an input stream
3Streams
- In Java, file I/O (and also simple
keyboard/monitor I/O) is handled by streams - In Java, a stream is an object that either
delivers data to its destination (such as a file
or monitor) or takes data from a source (such as
a file or keyboard) and delivers it to your
program - System.out is an example of an output stream
4Streams
File, Monitor, Network, Etc.
output stream
Program
File, Keyboard, Network, Etc.
input stream
5Remember
- An input stream moves data into your program (not
into a file) - An output stream moves data out of your program
(not out of the file)
6Binary vs Text Files
- All data in any file is stored as a sequence of
bits. But, sometimes we think of the file as
consisting of a sequence of characters (for
example, your Java source code files), and some
we think of as simply containing a sequence of
binary digits (such as a file containing the
machine code for a program) - The files of characters are called text files
- The files of bits are called binary files
- Java has objects to handle I/O to both kinds of
files. Well only work with text files
7Text File I/O
- Best to just start with an example well add
some file I/O to StudentRecord
Must be here!
8Text File I/O (cont.)
- We use the println() method in the class
PrintWriter (not System.out.println(), but acts
the same)
Returns a reference to an OutputStream object
9(No Transcript)
10(No Transcript)
11Whats with these?!
12Another Look
13Whats With This trycatch Thing?!
- This is an example of exception handling in Java
(which we may cover more completely at a later
date) - For now, know that this says execute the
statements in the try block. If something goes
wrong, then stop and execute the statements in
the catch block - Lots can go wrong with file I/O (e.g. the file
may not exist, or you may not have permission to
access it)
14Subtle and Very Important
If written this way, the variable outputStream
is local to the try block!
15Still Another Look
Here its visible throughout the whole method
Whats with this?!
16So, How Do We Use These Things?!
- Just like you use System.out.println(), though
there are also methods specially designed to
print doubles, chars, etc.
17Writing To a File (cont.)
18Writing To a File (cont.)
Why dont I need to use getName() here?
19Still More Writing To a File
20(No Transcript)
21close() the Stream!
- Calling the close() method
- Flushes the stream
- Operating system releases all resources needed to
connect the stream to the file, and performs
other housekeeping - If stream isnt closed, Java closes it when the
program ends, but youre taking a chance - If program ends abnormally, then Java may not be
able to automatically close the stream and you
could lose data - You need to close a stream before reading from
the same file
22A True Story
23Why Ever flush() a Stream?
- There are situations where you want the stream to
remain open (youre still using it), but you need
to be sure data goes to output device - Writing to a network interface
- During long operations on a file, flush stream in
case there is some kind of abnormality - OS crash, etc.
24Miscellaneous
- File names The file name you give Java is simply
a String. It doesnt know about suffixes and the
like. Thats the OSs thing. - Opening a text file for appending
Indicates open for appending
25Streams and File I/O Part II
26BufferedReader Class
- The BufferedReader class is the input stream
equivalent of the PrintWriter class - The constructor requires a similar setup
- The class methods are analogous
- Remember to import java.io.
- Remember this is for reading text files
27(No Transcript)
28The FileReader class is a subclass of the Reader
class, so using it in the constructor is legal
29(No Transcript)
30Whats with this override thing?
Note the exceptions that can be thrown
31Reading From Files
- As with writing to files, you need to know
where you are in the file when reading - Unlike with writing, you need to know when you
have run out of stuff to read in the file - When reading, you generally need to have a place
(i.e. a variable) to put the data you have read - Beware there are many subtleties here
32(No Transcript)
33(No Transcript)
34Example
- Some new file-reading code added to the code that
created the file profsGrades.txt
35Example (cont.)
Adding a simple cast to a char will fix this
problem, but there are others (see next slide)
36(No Transcript)
37Note the Changes
- The entirety of the input code is in the try
block (including closing the stream), not just
the memory allocation for the stream - There are two different classes of exceptions
that are caught here FileNotFoundException and
IOException - This is how you should write your I/O code!
38Running the Example Code
39Augmenting Our Code
- What the read documentation didnt tell you is
that the read() method returns the integer value
?1 if there is no more file to read - Well use this to modify our code to read (and
print to standard output) the entire file
40NOTE! (see next slide)
41Notes From Last Slide
- myChar is declared an int, since well need to
check an integer value to see if were at the end
of the file - We use an infinite loop to keep iterating until
weve read the entire file - We call the read() method within the conditional
for the if statement. Regardless of whether the
condition is true, the call to read() occurs
(this is a standard hack for this kind of code)
42More Notes
- We use the print() method as opposed to the
println() method when a newline character is
encountered, this will cause a new line in the
output - We perform the cast to char inside the
System.out.print () statement
43There Are Easier Ways
- Use another version of the read() method to read
characters into a char array - Use the readline() method, which reads a whole
line at a time into a String
44(No Transcript)
45More read() Documentation
46Often the Best Way
47A problem
48The Problem
- The readLine() method returns the value null if
it reaches the end of file. When this happens,
the variable currentLine is assigned the value
null, which causes a NullPointerException when we
try to call its equals() method in the if
statement. See the fix on either of the next two
slides (the first is the recommended fix)
49A fix
50Another fix
51Reading Numeric Data Types
- Note that using any of the BufferedReader methods
results in reading either a String or a char. To
read a double or int or other numerical data
type, you need to - Use methods like stringToInt()
- Use methods like Double.parseDouble(String input)
- The method Integer.parseInt(String input) is the
exact equivalent of stringToInt()
52Finally, Reading Input From the Keyboard
- The keyboard is an input device like any other,
and we can read it with an input stream - We use the read() method in System.in
- This works like our other read() method, but
reads from the keyboard - We use the above read() method to create a static
readLine() method that we can call to read from
the keyboard
53(No Transcript)
54This is needed in order to handle both Unix and
Windows style end of line conventions
55A Tester For KeyboardIn
- Dont forget that we need to use a try block with
this