40
COMP 121 Week 6: Files and Streams

COMP 121

  • 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

Page 1: COMP 121

COMP 121

Week 6: Files and Streams

Page 2: COMP 121

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

Page 3: COMP 121

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.

Page 4: COMP 121

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.

Page 5: COMP 121

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.

Page 6: COMP 121

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.

Page 7: COMP 121

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.

Page 8: COMP 121

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.

Page 9: COMP 121

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.

Page 10: COMP 121

Question:

What package includes the Scanner class (needed for the import statement)?

Page 11: COMP 121

Answer: java.util

Page 12: COMP 121

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.

Page 13: COMP 121

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.

Page 14: COMP 121

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.

Page 15: COMP 121

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.

Page 16: COMP 121

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.

Page 17: COMP 121

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.

Page 18: COMP 121

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.

Page 19: COMP 121

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.

Page 20: COMP 121

Random Access vs. Sequential Access

Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.

Page 21: COMP 121

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.

Page 22: COMP 121

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.

Page 23: COMP 121

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.

Page 24: COMP 121

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.

Page 25: COMP 121

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.

Page 26: COMP 121

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.

Page 27: COMP 121

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.

Page 28: COMP 121

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.

Page 29: COMP 121

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.

Page 30: COMP 121

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.

Page 31: COMP 121

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.

Page 32: COMP 121

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.

Page 33: COMP 121

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.

Page 34: COMP 121

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.

Page 35: COMP 121

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.

Page 36: COMP 121

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.

Page 37: COMP 121

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.

Page 38: COMP 121

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.

Page 39: COMP 121

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.

Page 40: COMP 121

Any Questions?