Download presentation
Presentation is loading. Please wait.
Published byMarjory Johnston Modified over 7 years ago
1
Introduction to OOP with Java 4th Ed, C. Thomas Wu
Chapter 12 File Input and Output ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. © The McGraw-Hill Companies, Inc.
2
Intro to OOP with Java, C. Thomas Wu
Chapter 12 Objectives After you have read and studied this chapter, you should be able to Include a JFileChooser object in your program to let the user specify a file. Write bytes to a file and read them back from the file, using FileOutputStream and FileInputStream. Write values of primitive data types to a file and read them back from the file, using DataOutputStream and DataInputStream. Write text data to a file and read them back from the file, using PrintWriter and BufferedReader Read a text file using Scanner Write objects to a file and read them back from the file, using ObjectOutputStream and ObjectInputStream ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
3
Intro to OOP with Java, C. Thomas Wu
The File Class To operate on a file, we must first create a File object (from java.io). Opens the file sample.dat in the current directory. File inFile = new File(“sample.dat”); File inFile = new File (“C:/SamplePrograms/test.dat”); Opens the file test.dat in the directory C:\SamplePrograms using the generic file separator / and providing the full pathname. When a program that manipulates a large amount of data practical, we must save the data to a file. If we don’t, then the user must reenter the same data every time he or she runs the program because any data used by the program will be erased from the main memory at program termination. If the data were saved, then the program can read them back from the file and rebuild the information so the user can work on the data without reentering them. In this chapter you will learn how to save data to and read data from a file. We call the action of saving data to a file file output and the action of reading data from a file file input. Note: The statements new File( “C:\\SamplePrograms”, “one.txt”); and new File(“C:\\SamplePrograms\\one.text”); will open the same file. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
4
Intro to OOP with Java, C. Thomas Wu
Some File Methods if ( inFile.exists( ) ) { To see if inFile is associated to a real file correctly. if ( inFile.isFile() ) { To see if inFile is associated to a file or not. If false, it is a directory. File directory = new File("C:/JavaPrograms/Ch12"); String filename[] = directory.list(); for (int i = 0; i < filename.length; i++) { System.out.println(filename[i]); } List the name of all files in the directory C:\JavaProjects\Ch12 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
5
The JFileChooser Class
Intro to OOP with Java, C. Thomas Wu The JFileChooser Class A javax.swing.JFileChooser object allows the user to select a file. JFileChooser chooser = new JFileChooser( ); chooser.showOpenDialog(null); To start the listing from a specific directory: We can start the listing from a current directory by writing String current = System.getProperty("user.dir"); JFileChooser chooser = new JFileChooser(current); or equivalently JFileChooser chooser = new JFileChooser( ); chooser.setCurrentDirectory(new File(current)); JFileChooser chooser = new JFileChooser(“C:/JavaPrograms/Ch12"); chooser.showOpenDialog(null); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
6
Getting Info from JFileChooser
Intro to OOP with Java, C. Thomas Wu Getting Info from JFileChooser int status = chooser.showOpenDialog(null); if (status == JFileChooser.APPROVE_OPTION) { System.out.println("Open is clicked"); } else { //== JFileChooser.CANCEL_OPTION System.out.println("Cancel is clicked"); } File selectedFile = chooser.getSelectedFile(); File currentDirectory = chooser.getCurrentDirectory(); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
7
Intro to OOP with Java, C. Thomas Wu
Applying a File Filter A file filter may be used to restrict the listing in JFileChooser to only those files/directories that meet the designated filtering criteria. To apply a file, we define a subclass of the javax.swing.filechooser.FileFilter class and provide the accept and getDescription methods. public boolean accept(File file) public String getDescription( ) See the JavaFilter class that restricts the listing to directories and Java source files. The accept method returns true if the parameter file is a file to be included in the list. The getDescription method returns a text that will be displayed as one of the entries for the “Files of Type:” drop-down list. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
8
Intro to OOP with Java, C. Thomas Wu
Low-Level File I/O To read data from or write data to a file, we must create one of the Java stream objects and attach it to the file. A stream is a sequence of data items, usually 8-bit bytes. Java has two types of streams: an input stream and an output stream. An input stream has a source form which the data items come, and an output stream has a destination to which the data items are going. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
9
Streams for Low-Level File I/O
Intro to OOP with Java, C. Thomas Wu Streams for Low-Level File I/O FileOutputStream and FileInputStream are two stream objects that facilitate file access. FileOutputStream allows us to output a sequence of bytes; values of data type byte. FileInputStream allows us to read in an array of bytes. Data is saved in blocks of bytes to reduce the time it takes to save all of our data. The operation of saving data as a block is called data caching. To carry out data caching, part of memory is reserved as a data buffer or cache, which is used as a temporary holding place. Data are first written to a buffer. When the buffer becomes full, the data in the buffer are actually written to a file. If there are any remaining data in the buffer and the file is not closed, those data will be lost. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
10
Sample: Low-Level File Output
Intro to OOP with Java, C. Thomas Wu Sample: Low-Level File Output //set up file and stream File outFile = new File("sample1.data"); FileOutputStream outStream = new FileOutputStream( outFile ); //data to save byte[] byteArray = {10, 20, 30, 40, 50, 60, 70, 80}; //write data to the stream outStream.write( byteArray ); //output done, so close the stream outStream.close(); class TestFileOutputStream { public static void main (String[] args) throws IOException //set up file and stream File outFile = new File("sample1.data"); FileOutputStream outStream = new FileOutputStream(outFile); //data to output byte[] byteArray = {10, 20, 30, 40, 50, 60, 70, 80}; //write data to the stream outStream.write(byteArray); //output done, so close the stream outStream.close(); } The main method throws an exception. Exception handling is described in Section 11.4. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
11
Sample: Low-Level File Input
Intro to OOP with Java, C. Thomas Wu Sample: Low-Level File Input //set up file and stream File inFile = new File("sample1.data"); FileInputStream inStream = new FileInputStream(inFile); //set up an array to read data in int fileSize = (int)inFile.length(); byte[] byteArray = new byte[fileSize]; //read data in and display them inStream.read(byteArray); for (int i = 0; i < fileSize; i++) { System.out.println(byteArray[i]); } //input done, so close the stream inStream.close(); import javabook.*; import java.io.*; class TestFileInputStream { public static void main (String[] args) throws IOException MainWindow mainWindow = new MainWindow(); OutputBox outputBox = new OutputBox(mainWindow); mainWindow.setVisible( true ); outputBox.setVisible( true ); //set up file and stream File inFile = new File("sample1.data"); FileInputStream inStream = new FileInputStream(inFile); //set up an array to read data in int fileSize = (int)inFile.length(); byte[] byteArray = new byte[fileSize]; //read data in and display them inStream.read(byteArray); for (int i = 0; i < fileSize; i++) { outputBox.printLine(byteArray[i]); } //input done, so close the stream inStream.close(); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
12
Streams for High-Level File I/O
Intro to OOP with Java, C. Thomas Wu Streams for High-Level File I/O FileOutputStream and DataOutputStream are used to output primitive data values FileInputStream and DataInputStream are used to input primitive data values To read the data back correctly, we must know the order of the data stored and their data types ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
13
Setting up DataOutputStream
Intro to OOP with Java, C. Thomas Wu Setting up DataOutputStream A standard sequence to set up a DataOutputStream object: File outFile = new File( "sample2.data" ); FileOutputStream outFileStream = new FileOutputStream(outFile); DataOutputStream outDataStream = new DataOutputSteam(outFileStream); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
14
Intro to OOP with Java, C. Thomas Wu
Sample Output import java.io.*; class Ch12TestDataOutputStream { public static void main (String[] args) throws IOException { . . . //set up outDataStream //write values of primitive data types to the stream outDataStream.writeInt( ); outDataStream.writeLong( L); outDataStream.writeFloat( F); outDataStream.writeDouble( D); outDataStream.writeChar('A'); outDataStream.writeBoolean(true); //output done, so close the stream outDataStream.close(); } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
15
Setting up DataInputStream
Intro to OOP with Java, C. Thomas Wu Setting up DataInputStream A standard sequence to set up a DataInputStream object: File inFile = new File( "sample2.data" ); FileOutputStream inFileStream = new FileOutputStream(inFile); DataOutputStream inDataStream = new DataOutputSteam(inFileStream); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
16
Intro to OOP with Java, C. Thomas Wu
Sample Input import java.io.*; class Ch12TestDataInputStream { public static void main (String[] args) throws IOException { . . . //set up inDataStream //read values back from the stream and display them System.out.println(inDataStream.readInt()); System.out.println(inDataStream.readLong()); System.out.println(inDataStream.readFloat()); System.out.println(inDataStream.readDouble()); System.out.println(inDataStream.readChar()); System.out.println(inDataStream.readBoolean()); //input done, so close the stream inDataStream.close(); } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
17
Reading Data Back in Right Order
Intro to OOP with Java, C. Thomas Wu Reading Data Back in Right Order The order of write and read operations must match in order to read the stored primitive data back correctly. outStream.writeInteger(…); outStream.writeLong(…); outStream.writeChar(…); outStream.writeBoolean(…); <integer> <long> <char> <boolean> inStream.readInteger(…); inStream.readLong(…); inStream.readChar(…); inStream.readBoolean(…); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
18
Textfile Input and Output
Intro to OOP with Java, C. Thomas Wu Textfile Input and Output Instead of storing primitive data values as binary data in a file, we can convert and store them as a string data. This allows us to view the file content using any text editor To output data as a string to file, we use a PrintWriter object To input data from a textfile, we use FileReader and BufferedReader classes From Java 5.0 (SDK 1.5), we can also use the Scanner class for inputting textfiles ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
19
Sample Textfile Output
Intro to OOP with Java, C. Thomas Wu Sample Textfile Output import java.io.*; class Ch12TestPrintWriter { public static void main (String[] args) throws IOException { //set up file and stream File outFile = new File("sample3.data"); FileOutputStream outFileStream = new FileOutputStream(outFile); PrintWriter outStream = new PrintWriter(outFileStream); //write values of primitive data types to the stream outStream.println( ); outStream.println("Hello, world."); outStream.println(true); //output done, so close the stream outStream.close(); } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
20
Intro to OOP with Java, C. Thomas Wu
Sample Textfile Input import java.io.*; class Ch12TestBufferedReader { public static void main (String[] args) throws IOException { //set up file and stream File inFile = new File("sample3.data"); FileReader fileReader = new FileReader(inFile); BufferedReader bufReader = new BufferedReader(fileReader); String str; str = bufReader.readLine(); int i = Integer.parseInt(str); //similar process for other data types bufReader.close(); } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
21
Sample Textfile Input with Scanner
Intro to OOP with Java, C. Thomas Wu Sample Textfile Input with Scanner import java.io.*; class Ch12TestScanner { public static void main (String[] args) throws IOException { //open the Scanner Scanner scanner = new Scanner(new File("sample3.data")); //get integer int i = scanner.nextInt(); //similar process for other data types scanner.close(); } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
22
Intro to OOP with Java, C. Thomas Wu
Object File I/O It is possible to store objects just as easily as you store primitive data values. We use ObjectOutputStream and ObjectInputStream to save to and load objects from a file. To save objects from a given class, the class declaration must include the phrase implements Serializable. For example, class Person implements Serializable { . . . } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
23
Intro to OOP with Java, C. Thomas Wu
Saving Objects File outFile = new File("objects.data"); FileOutputStream outFileStream = new FileOutputStream(outFile); ObjectOutputStream outObjectStream = new ObjectOutputStream(outFileStream); Person person = new Person("Mr. Espresso", 20, 'M'); outObjectStream.writeObject( person ); You can even mix objects and primitive data type values. For example, outObjectStream.writeInt ( ); outObjectStream.writeObject( account1 ); outObjectStream.writeChar ( 'X' ); account1 = new Account(); bank1 = new Bank(); outObjectStream.writeObject( account1 ); outObjectStream.writeObject( bank1 ); Could save objects from the different classes. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
24
Intro to OOP with Java, C. Thomas Wu
Reading Objects File inFile = new File("objects.data"); FileInputStream inFileStream = new FileInputStream(inFile); ObjectInputStream inObjectStream = new ObjectInputStream(inFileStream); Person person = (Person) inObjectStream.readObject( ); Must type cast to the correct object type. You can even mix objects and primitive data type values. For example, outObjectStream.writeInt ( ); outObjectStream.writeObject( account1 ); outObjectStream.writeChar ( 'X' ); Account account1 = (Account) inObjectStream.readObject( ); Bank bank1 = (Bank) inObjectStream.readObject( ); Must read in the correct order. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
25
Saving and Loading Arrays
Intro to OOP with Java, C. Thomas Wu Saving and Loading Arrays Instead of processing array elements individually, it is possible to save and load the whole array at once. Person[] people = new Person[ N ]; //assume N already has a value //build the people array . . . //save the array outObjectStream.writeObject ( people ); { class FindSum private int sum; private boolean success; public int getSum() return sum; } public boolean isSuccess() return success; void computeSum (String fileName ) success = true; try { File inFile = new File(fileName); FileInputStream inFileStream = new FileInputStream(inFile); DataInputStream inDataStream = new DataInputStream(inFileStream); //read three integers int i = inDataStream.readInt(); int j = inDataStream.readInt(); int k = inDataStream.readInt(); sum = i + j + k; inDataStream.close(); catch (IOException e) { success = false; //read the array Person[ ] people = (Person[]) inObjectStream.readObject( ); ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
26
Intro to OOP with Java, C. Thomas Wu
Problem Statement Write a class that manages file I/O of an AddressBook object. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
27
Intro to OOP with Java, C. Thomas Wu
Development Steps We will develop this program in four steps: Implement the constructor and the setFile method. Implement the write method. Implement the read method. Finalize the class. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
28
Intro to OOP with Java, C. Thomas Wu
Step 1 Design We identify the data members and define a constructor to initialize them. Instead of storing individual Person objects, we will deal with a AddressBook object directly using Object I/O techniques. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
29
Intro to OOP with Java, C. Thomas Wu
Step 1 Code Directory: Chapter12/Step1 Source Files: AddressBookStorage.java TestAddressBookStorage.java Program source file is too big to list here. From now on, we ask you to view the source files using your Java IDE. Please use your Java IDE to view the source files and run the program. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
30
Intro to OOP with Java, C. Thomas Wu
Step 1 Test We include a temporary output statement inside the setFile method. We run the test main class and verify that the setFile method is called correctly. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
31
Intro to OOP with Java, C. Thomas Wu
Step 2 Design Design and implement the write method The data member filename stores the name of the object file to store the address book. We create an ObjectOutputStream object from the data member filename in the write method. The write method will propagate an IOException when one is thrown. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
32
Intro to OOP with Java, C. Thomas Wu
Step 2 Code Directory: Chapter12/Step2 Source Files: AddressBookStorage.java TestAddressBookWrite.java ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
33
Intro to OOP with Java, C. Thomas Wu
Step 2 Test We run the test program several times with different sizes for the address book. We verify that the resulting files indeed have different sizes. At this point, we cannot check whether the data are saved correctly or not. We can do so only after finishing the code to read the data back. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
34
Intro to OOP with Java, C. Thomas Wu
Step 3 Design Design and implement the read method. The method returns an AddressBook object read from a file (if there's no exception) The method will propagate an IOException when one is thrown. Here's the pseudocode to locate a person with the designated name. Notice that for this routine to work correctly, the array must be packed with the real pointers in the first half and null pointers in the last half. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
35
Intro to OOP with Java, C. Thomas Wu
Step 3 Code Directory: Chapter12/Step3 Source Files: AddressBookStorage.java TestAddressBookRead.java ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
36
Intro to OOP with Java, C. Thomas Wu
Step 3 Test We will write a test program to verify that the data can be read back correctly from a file. To test the read operation, the file to read the data from must already exist. We will make this test program save the data first by using the TestAddressBookWrite class from . ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
37
Intro to OOP with Java, C. Thomas Wu
Step 4: Finalize We perform the critical review of the final program. We run the final test ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. ©The McGraw-Hill Companies, Inc.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.