ppt version - University of Pittsburgh

Download Report

Transcript ppt version - University of Pittsburgh

Lec.9 Midterm &
Files (Chapter 10)
Jiang (Jen) ZHENG
June 20th, 2005
Outline
 About Midterm
 Remaining for Chapter 7: wrapper & casting
 About Assignment 3
 Intro. To Java Files
 Writing Text Files
PrintWriter & FileWriter
 PrintWriter & FileOutputStream
 Reading Text Files
 BufferedReader & FileReader

 Object Stream
 Writing & Reading Binary Files
 DataInputStream & DataOutputStream
 End of the Input Stream
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
2
About Midterm
 Two Things to Emphasize:


statistic variable
How to implement interface (the last problem)
…
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
3
Wrappers
 We know each primitive type has a
Integer
wrapper class:


The wrapper classes also provide
extra useful functionality for these
types
 Ex: Integer.parseInt() is a static
method that enables us to
convert from a String into an int
 Ex: Character.isLetter() is a static
method that tests if a letter is a
character or not
See more in API
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
int
Double
double
4
Wrappers and Casting
 Ex:
Object [] A = new Object[10];
// A[0] = 50; // This is illegal, since 50 is not
// an Object
A[0] = new Integer(50); // This is fine
A[1] = new Integer(30);


Note that an array of Object can store any Java class
(including any wrapper class)
However, because the reference is Object, we are
restricted in the methods that we can use
 Recall from our discussion of polymorphism that the
superclass reference cannot “see down” into the
subclass details
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
5
Wrappers and Casting

Thus, if we want to access anything specific to
our wrapper class, we must first cast the
reference:
Integer i = (Integer) A[0];
Integer j = (Integer) A[1];
if (i.compareTo(j) == 0)
System.out.println(i + “ == “ + j);

We would get an error if we tried
if (A[i].compareTo(A[j]))

Also note that if we want to do any “math” with
our wrappers, we need to get the underlying
primitive values
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
6
“Operations” with Wrappers
// Integer k = i + j; // This is illegal

The actual computation is actually quite roundabout:
Integer k = new Integer(i.intValue() +
j.intValue());
 In words: Get the primitive value of each Integer object,
add them, then create a new Integer object with the result

This leads back to the question:
 Why do we want to bother with this?
 Aren’t we better off just using int values instead of these
wrappers?

There are definite benefits to having the data
represented in a class
 Let’s see what they are
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
7
“Generic” Operations

Let’s look at a simple example that should already be
familiar to you: Sorting
 Earlier in the term we looked at SelectionSort
 See Slides 88-89

The code was written to specifically sort ints:
static void sort(int[] data)

What if we want to sort floats, or doubles, or Strings, or
any other Java type?
 We need to write a new method for each one!!!
 The argument array must match the parameter array

Or do we??
 Can we write a single method that can sort anything?
 Discuss
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
8
“Generic” Operations

Consider the Comparable interface:
 It contains one method:
int compareTo(Object r);
Returns a negative number if the current object is less than r,
0 if the current object equals r and a positive number if the
current object is greater than r
 Look at Comparable in the API
Consider what we need to know to sort data:
 is A[i] less than, equal to or greater than A[j]
Thus, we can sort Comparable data without knowing
anything else about it
 Awesome!
 Polymorphism allows this to work



CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
9
“Generic” Operations

Think of the objects we want to sort as “black boxes”
 We know we can compare them because they
implement Comparable
 We don’t know (or need to know) anything else about
them
 Show on board

Thus, a single sort method will work for an array of any
Comparable class
 Let’s write it now, altering the code we already know
from our simple sort method
 See Sorting.java and ex17.java
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
10
Assignment 3
 One Extra Credit Option (proposed by Shaleah):
 Besides the Batter statistics, you can define the Pitcher
statistics as well.
 Earned Run Average (ERA) (calculated by 9*Earned
Runs / Innings Pitched)
 So for each pitcher, there are two scores Earned Runs
and Innings Pitched.
 You program should be able to sort Pitchers based on
the ERA score like what you can do for batters.
 Think about how to use the inheritance and
polymorphisms concepts.
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
11
Intro. to Java Files
 So far
 Our programs have read input from the keyboard and
written output to the monitor
 This works fine in some situations, but is not so good in
others:



What if we have a large amount of output that we need to
save?
What if we need to initialize a database that is used in our
program?
What if output from one program must be input to another?
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
12
Intro. to Java Files

In these situations we need to use files

Most files can be classified into two groups:
1)
Text Files

Data is a sequence of ASCII characters stored
sequentially

Any “larger” data types are still stored as characters
and must be “built” when they are read in


Ex: Strings are sequences of characters
Ex: ints are also sequences of characters, but interpreted
in a different way
 To create an actual int we need to convert the
characters – this is what the parseInt method in the
Integer class does
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
13
Text Files

Ex: “12345” in a file is simply 5 ASCII characters:
(5 bytes)
49 50 51 52 53

To convert it into an actual int requires processing
the characters:
 We know ‘0’ is ASCII 48
 So our integer is
(49-48)x104 + (50-48)x103 + (51-48)x102
+ (52-48)x101 + (53-48)x100
 This can be done in a nice efficient way using a simple
loop, and is what the parseInt method does
 Let’s do it ourselves to see how it can be done
 Any suggestions on how to start?

See MyInteger.java and ex18.java
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
14
Text Files


Advantage of text files:
 Can read them outside of the program by many
different editors or programs
 Easy to create
Disadvantage of text files:
 Must be converted into the desired types as they are
read in (as demonstrated with parseInt)
 This takes time to do and slows I/O

Not the most efficient way to store non-String data
 Ex: int 12345678 requires 8 bytes in a text file, but only
needs 4 bytes in the computer as an int or in a binary file
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
15
Binary Files
2)


Binary Files
Data in the file is stored in the same way (or in a
“serialized” version) that it is stored in the program
We can store arbitrary bytes or we can store “whole”
data types, including primitive types (int, double, etc.)
and objects (String, any other serializable object type)


We will discuss serializable more shortly
Advantages:



Since data is already in its binary form, reading and
writing require little if any conversion and is faster than for
text files
Non-string data can often be stored more efficiently in its
binary form than in ASCII form
Question: How to store “12345” in a binary file?
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
16
Binary Files

Disadvantage:
 Data in the files is not readable except via a specific
computer program
 Ex: A Java object in a file can only be read in by
a Java program

There are reasons to use both of these types
of files in various applications
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
17
File Streams
 In Java, file access is provided through a hierarchy of
file and stream classes


These allow various different access functionalities
implemented in a systematic, consistent way
Often we “wrap” streams around others to provide
more specific access
 Stream wrappers are a similar notion to our primitive
type wrappers – in both cases we are wrapping an
object around other data to increase the functionality
of the data
 However, in this case the data being “wrapped” is already
an object
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
18
File and Stream classes Hierarchy in
Java (For Writing Text Files)
 java.lang.Object
 java.io.Writer
 java.io.PrintWriter
PrintWriter(OutputStream out)
PrintWriter(Writer out)
 java.lang.Object
 java.io.Writer
 java.io.OutputStreamWriter
 java.io.FileWriter
 java.lang.Object
 java.io.OutputStream
 java.io.FileOutputStream
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
19
File and Stream classes Hierarchy in
Java (For Reading Text Files)
 java.lang.Object

java.io.Reader

java.io.BufferedReader
BufferedReader(Reader in)
 java.lang.Object

java.io.Reader

java.io.InputStreamReader
 java.io.FileReader
FileReader(File file)
FileReader(String fileName)
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
20
File and Stream classes Hierarchy in
Java (For Reading/Writing Binary Files)
 java.lang.Object

java.io.OutputStream

java.io.FilterOutputStream
 Java.io.DataOutputStream
DataOutputStream(OutputStream out)

java.io.FileOutputStream
FileOutputStream(File file)
FileOutputStream(String name)
 java.lang.Object

java.io.InputStream

java.io.FileInputStream
 java.io.DataInputStream
DataInputStream(InputStream in)

java.io.FileInputStream
FileInputStream(File file)
FileInputStream(String name)
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
21
Writing Text Files (I)

One example for writing text to an output file:
 First we create a FileWriter object:
FileWriter fileW = new FileWriter(“hello.txt");

Next we wrap a PrintWriter around it
PrintWriter pw;
pw = new PrintWriter(fileW);

Writing to this file

 pw.println(“Hello World!”);
Closing the file when it is done!
 pw.close();
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
22
Writing Text Files (II)

Another simple example for writing text to an output file:

First we create a File object:
File theFile = new File("ex19out.txt");
 This will not necessarily create a file – it simply associates a
logical file with the file name provided

Next we wrap a FileOutputStream around it
FileOutputStream fo;
fo = new FileOutputStream(theFile);
 The above will start writing at the beginning of the file – we
could also open it for append
fo = new FileOutputStream(theFile, true);

At this point we could write to our file
 However, FileOutputStream only allows a few primitive writing
operations (see API)
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
23
Writing Text Files (II) (Cont. …)

To increase the writing functionality we can wrap
another stream around it – PrintWriter
PrintWriter outFile = new PrintWriter(fo);
 This allows us to use print and println for our primitive
types and object types

We don’t actually need all of the intermediate variables
in all cases:
PrintWriter p = new PrintWriter(new
FileOutputStream(new
File(“ex19out.txt”)));
– Note that we are still creating 3 objects, but we are
wrapping the inner two right away, thereby avoiding the
extra variables
–
See ex19.java
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
24
Reading Text Files
 What about input?




The process is very similar
However, now we want to use one or more
input streams rather than output streams
Let’s write a program to read in the file that we
just created and show it on the display
To show how console I/O is done in the same
way as file I/O, we will include this as well
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
25
Reading Text Files

This time we will first ask the user for a file name and read
it in
 However to do so we need to create a reader for our “standard
input stream”
 This is a predefined object called System.in (the object is a static
object call “in” in the System class – thus the access via
System.in)
 We wrap an InputStreamReader object and then a
BufferedReader object around System.in to give us access to the
readLine() method
 Allows us to read one line of String text at a time from the
keyboard
BufferedReader keyboard = new BufferedReader(new
InputStreamReader(System.in));
String fileName = keyboard.readLine();
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
26
Reading Text Files

Next we again create a File object, so that we can test
for the existence of the file
 This is important for reading, since it is an error to try to
read from a non-existent file
theFile = new File(fileName);

Now we need a FileReader and then a BuffereReader
 Use the constructors in the API to help determine how to
wrap your objects
BufferedReader fReader = new BufferedReader(
new FileReader(theFile));

Finally we can start reading using the readLine()
method
 The call returns the next line in the text file, or null if we
have reached the end of the file
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
27
Reading Text Files


See ex20.java
Remember that BufferedReader objects read
in String data, and that we must convert it to
the type of data we need once it is read in



Can use Integer.parseInt(), Double.parseDouble(),
etc. for the primitive types
Can use appropriate constructors for object types
However, we must know exactly how the file is
formatted so we can read it and parse it properly
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
28
Object Streams
 Can we read in complex Java types without
having to carefully parse the input?


Yes, as long as the types are Serializable
Serializable is an interface in Java that requires
the readObject() and writeObject() methods to be
implemented

However, if we are building a new class from other
classes that are already Serializable, we do not have
to implement the methods within our new class
 Rather we just have to declare that our new class
implements Serializable
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
29
Object Streams



If our class is Serializable, we can read and write entire
objects with a single readObject or writeObject method
call
Let’s look at an example:
Writing the objects:
ObjectOutputStream oos = new ObjectOutputStream(new
FileOutputStream("ex21data.txt"));
for (int i = 0; i < myCDs.length; i++)
oos.writeObject(myCDs[i]);


Note that the file generated here is NOT text and will not be
readable in normal text editors
However, restoring the data back to a Java program is now
very easy
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
30
Object Streams

Reading the objects:
ObjectInputStream ois = new ObjectInputStream(new
FileInputStream("ex21data.txt"));
for (int i = 0; i < myData.length; i++)
myData[i] = ois.readObject();


There are some important issues here that are somewhat
“hidden” in this example
They deal with the possibility of exceptions
 IO in Java can typically generate various different exceptions,
and some of them must be explicitly dealt with
 Thus the header says “throws exception”
 We are probably better off handling these, but since we haven’t
covered exceptions yet, we’ll defer for now. Exceptions will be
covered in Chapter 11.

See ex21a.java and ex21b.java
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
31
Reading/Writing Binary Files
 We discussed previously that numeric data can often be
stored more efficiently in binary form than in text form
 In this case we may want to use a binary file to store it

Not an object file, since the data is a primitive type
 For this we can use a DataOutputStream for output and a
DataInputStream for input

See API for methods
 Ex: writeInt(), writeDouble() – DataOutputStream

Ex: readInt(), readDouble() – DataInputStream
 See BinIOTest.java
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
32
Reading/Writing Binary Files
 Let’s try this and then compare the sizes of the
binary and text files During the Lab hours


We will generate a number of random ints and random
doubles
Store each in a text file and in a binary file and
compare sizes at the end
 Note that the size of the integer text file depends
greatly on the values of the integers, while the size of
the integer binary file is independent of the values
 If we are storing very small integers, using a text file will
actually save us space, but for large integers it will cost us
space
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
33
EOF (end-of-file) detection
Class
Method
readPrimitive()
java.io.DataInputStream
readLine()
read()
java.io.BufferedReader
readLine()
read()
CS401/COE401 Summer 2005.Department of
Computer Science.University of
Pittsburgh.Lecture 9
EOF Detected by
EOFException
returns null
returns -1
returns null
returns -1
34