1 / 40

COMP 121

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.

duncan
Download Presentation

COMP 121

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. COMP 121 Week 6: Files and Streams

  2. 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

  3. Reading Text Files • Scanner class • Simplest way to read text • To read a disk file: • Construct a FileReader object • Use 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. Question: • What package includes the Scanner class (needed for the import statement)?

  11. Answer: java.util

  12. 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.

  13. 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.

  14. 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.

  15. 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.

  16. 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.

  17. 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.

  18. 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.

  19. 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 not • Each disk file has a special file pointer position • You can read or write at the position where the pointer is pointing Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.

  20. Random Access vs. Sequential Access Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.

  21. 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.

  22. 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.

  23. 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.

  24. 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.

  25. 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.

  26. Example (continued) • To read the nth account in the file publicBankAccount 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.

  27. 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.

  28. 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.

  29. 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.

  30. 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.

  31. 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.

  32. 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.

  33. 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.

  34. SerialDemo.java import 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.

  35. 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.

  36. 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.

  37. 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.

  38. 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.

  39. 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.

  40. Any Questions?

More Related