Upload
duncan
View
40
Download
0
Embed Size (px)
DESCRIPTION
COMP 121. Week 6: Files and Streams. Objectives. To be able to read and write text files To become familiar with the concepts of text and binary formats To understand when to use sequential and random file access To be able to read and write objects using serialization. - PowerPoint PPT Presentation
Citation preview
COMP 121
Week 6: Files and Streams
Objectives
To be able to read and write text files To become familiar with the concepts of
text and binary formats To understand when to use sequential and
random file access To be able to read and write objects using
serialization
Reading Text Files Scanner class
Simplest way to read text To read a disk file:
Construct a FileReader objectUse the FileReader object when constructing
a Scanner object
Use Scanner methods to read data from file next, nextLine, nextInt, and nextDouble
FileReader reader = new FileReader("input.txt"); Scanner in = new Scanner(reader);
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Writing Text Files
To write to a text file, construct a PrintWriter object
If file already exists, it is reset before the new data are written to it
If file doesn't exist, a new, empty file is created
PrintWriter out = new PrintWriter("output.txt");
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Writing Text Files (continued) Use print and println to write to a PrintWriter
You must close a file when you are done processing it
Otherwise, some output may not be written to the disk file
out.println(29.95); out.println(new Rectangle(5, 10, 15, 25)); out.println("Hello, World!");
out.close();
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Example Program
Reads all lines of a file and writes them to the output file, preceded by line numbers Can be used to number lines in a Java source
file Sample input file
Mary had a little lamb Whose fleece was white as snow. And everywhere that Mary went, The lamb was sure to go!
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Example Program (continued)
Program produces the output file:
/* 1 */ Mary had a little lamb /* 2 */ Whose fleece was white as snow. /* 3 */ And everywhere that Mary went, /* 4 */ The lamb was sure to go!
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
LineNumberer.java
import java.io.FileReader;import java.io.IOException;import java.io.PrintWriter;import java.util.Scanner;
public class LineNumberer{ public static void main(String[] args) { Scanner console = new Scanner(System.in); System.out.print("Input file: "); String inputFileName = console.next(); System.out.print("Output file: "); String outputFileName = console.next();
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
LineNumberer.java (continued) try { FileReader reader = new FileReader(inputFileName); Scanner in = new Scanner(reader); PrintWriter out = new PrintWriter(outputFileName); int lineNumber = 1; try { while (in.hasNextLine()) { String line = in.nextLine(); out.println("/* " + lineNumber + " */ " + line); lineNumber++; } } finally { out.close(); } } catch (IOException exception) { System.out.println("Error processing file:" + exception); } }}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Question:
What package includes the Scanner class (needed for the import statement)?
Answer: java.util
Text and Binary Formats
Two ways to store data Text format Binary format
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Text Format Human-readable form Sequence of characters
1234567890 stored as 10 characters, one byte each
Use Reader and Writer and their subclasses to process input and output
For input:
For output:
FileReader reader = new FileReader("input.txt");
FileWriter writer = new FileWriter("output.txt");
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Reading a Single Character from a File (not using Scanner) Use read method of Reader class to
read a single character returns the next character as an int or the
integer -1 at end of file
Reader reader = . . .; int next = reader.read(); char c; if (next != -1) c = (char) next;
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Binary Format
Data items are represented in bytes 1234567890 in binary format is stored in 4
bytes (int) Use InputStream and OutputStream
and their subclasses to read and write More compact and more efficient
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Binary Format For input:
For output:
FileInputStream inputStream = new FileInputStream("input.bin");
FileOutputStream outputStream = new FileOutputStream("output.bin");
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Reading a Single Byte from a File
Use read method of InputStream class to read a single byte returns the next byte as an int or the integer -1 at end of file
InputStream in = . . .; int next = in.read(); byte b;
if (next != -1) b = (byte) next;
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Using Streams, Readers, and Writers Use read to read a single character or byte Use write to write a single character or byte read and write are the only input and output
methods provided by the file input and output classes
Each class has a very focused responsibility To read numbers, strings, or other objects, you
combine stream, reader, and writer classes with other classes (like Scanner and Serializable)
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Random Access vs. Sequential Access Sequential access
A file is processed a byte at a time, starting at the beginning of the file
It can be inefficient Random access
Allows access at arbitrary locations in the file Only disk files support random access
System.in and System.out do notEach disk file has a special file pointer
position You can read or write at the position where the
pointer is pointingHorstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Random Access vs. Sequential Access
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
RandomAccessFile You can open a file either for
Reading only ("r") Reading and writing ("rw")
To move the file pointer to a specific byte
RandomAccessFile f = new RandomAcessFile("bank.dat","rw");
f.seek(n);
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
RandomAccessFile (continued) To get the current position of the file
pointer:
To find the number of bytes in a file:
// Return type is "long" because files can be very large
long n = f.getFilePointer();
fileLength = f.length();
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Using Random Access Files
Give each “field” a fixed size that is sufficiently large to hold the largest value
Every record has the same “fields” and is the same size
Easy to skip quickly to a given record
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Using Random Access Files (continued) RandomAccessFile class stores binary data readInt and writeInt read/write integers
(stored in 4 bytes)
readDouble and writeDouble read/write doubles (stored in 8 bytes)
double x = f.readDouble(); f.writeDouble(x);
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Example
To find out how many bank accounts are in the file
public int size() throws IOException { // RECORD_SIZE is 12 bytes: // 4 bytes for the account number and // 8 bytes for the balance
return (int) (file.length() / RECORD_SIZE); }
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Example (continued)
To read the nth account in the file
public BankAccount read(int n) throws IOException { file.seek(n * RECORD_SIZE); int accountNumber = file.readInt(); double balance = file.readDouble(); return new BankAccount(accountNumber, balance); }
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Example (continued)
To write the nth account in the file
public void write(int n, BankAccount account) throws IOException { file.seek(n * RECORD_SIZE); file.writeInt(account.getAccountNumber()); file.writeDouble(account.getBalance()); }
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Object Streams
ObjectOutputStream class can save entire objects to disk
ObjectInputStream class can read objects back in from disk
Objects are saved in binary format; therefore, you use streams
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Writing a BankAccount Object to a File The ObjectOutputStream saves all
instance variables when writeObject is called
BankAccount b = . . .; ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("bank.dat")); out.writeObject(b);
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Reading a BankAccount Object From a File readObject returns an Object
reference Need to remember the type of the object
that you saved and use a cast
ObjectInputStream in = new ObjectInputStream(new FileInputStream("bank.dat"));
BankAccount b = (BankAccount) in.readObject();
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Reading an Object From a File
readObject method can throw a ClassNotFoundException
It is a checked exception You must catch or declare it
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Serializable Interface Objects that are written to an object stream
must belong to a class that implements the Serializable interface
Serializable interface has no methods
class BankAccount implements Serializable { . . . }
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Serialization
The process of saving objects to a stream Each object is assigned a serial number on
the stream If the same object is saved twice, only serial
number is written out the second time When reading, duplicate serial numbers are
restored as references to the same object
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
SerialDemo.javaimport java.io.File;import java.io.IOException;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;
/** This program tests serialization of a Bank object. If a file with serialized data exists, then it is loaded. Otherwise the program starts with a new bank. Bank accounts are added to the bank. Then the bank object is saved.*/public class SerialDemo{
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
SerialDemo.java (continued)public static void main(String[] args)
throws IOException, ClassNotFoundException{ Bank firstBankOfJava;
File f = new File("bank.dat"); if (f.exists()) { ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)); firstBankOfJava = (Bank) in.readObject(); in.close(); } else { firstBankOfJava = new Bank(); firstBankOfJava.addAccount(new BankAccount(1001, 20000));
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
SerialDemo.java (continued) firstBankOfJava.addAccount(new BankAccount(1015, 10000)); }
// Deposit some money BankAccount a = firstBankOfJava.find(1001); a.deposit(100); System.out.println(a.getAccountNumber() + ":" + a.getBalance()); a = firstBankOfJava.find(1015); System.out.println(a.getAccountNumber() + ":" + a.getBalance());
ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(f)); out.writeObject(firstBankOfJava); out.close(); }}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Summary When reading text files, use the Scanner class When writing text files, use the PrintWriter
class and the print and println methods Close all files when you are done processing
them A File object is used for a file or directory A File object can be passed into the
constructor of a file reader, writer, or stream Streams access sequences of bytes. Readers
and writers access sequences of characters
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Summary (continued) Use FileReader, FileWriter, FileInputStream, and FileOutputStream to read and write disk files
The read method returns an integer (-1 at the end of the file) which you must cast to a char or byte
Sequential access processes a file one byte at a time
Random access allows access at arbitrary locations in a file without first reading the preceding bytes
A file pointer is the position in a random access file
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Summary (continued) Object streams can be used to save and
restore all instance fields of an object Objects saved to an object stream must
belong to classes that implement the Serializable interface
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Any Questions?