10/23/18 File class in Java n Programmers refer to input/output as "I/O". n The File class represents files as objects. n The class is defined in the java.io package. File Input and Output n Creating a File object allows you to get information about a file on the disk. TOPICS n Creating a File object does NOT create a new file on your disk. • File Input File f = new File("example.txt"); • Exception Handling if (f.exists() && f.length() > 1000) { • File Output f.delete(); } 2 Files Scanner reminder n Some methods in the File class: n The Scanner class reads input and processes strings Method name Description and numbers from the user. n When constructor is called with System.in , the character returns whether file can be canRead() stream is input typed to the console. read n Instantiate Scanner by passing the input character delete() removes file from disk stream to the constructor: exists() whether this file exists on disk Scanner scan = new Scanner(System.in); getName() returns name of file returns number of characters length() in file renameTo( filename ) changes name of file 3 4 Scanner reminder Opening a file for reading n To read a file, pass a File object as a parameter when n Common methods called on Scanner : constructing a Scanner String variable q Read a line or string literal n Scanner for a file: String str = scan.nextLine(); Scanner <name> = new Scanner(new File( <filename> )); q Read a string (separated by whitespace) n Example: String str = scan.next( ); Scanner scan= new Scanner(new File("numbers.txt")); q Read an integer n or: int ival = scan.nextInt( ); q Read a double File file = new File("numbers.txt"); double dval = scan.nextDouble( ); Scanner scan= new Scanner(file); 5 6 1
10/23/18 File names and paths File names and paths n relative path : does not specify any top-level folder, so n When you construct a File object with a relative path, Java the path is relative to the current directory: assumes it is relative to the current directory . q "names.dat" Scanner scan = q "code/Example.java" new Scanner(new File(”data/input.txt”)); n absolute path : The complete pathname to a file starting q If our program is in ~/workspace/P4 at the root directory /: q Scanner will look for ~/workspace/P4/data/input.txt q In Linux : ”/users/cs160/programs/Example.java” q In Windows: ”C:/Documents/cs160/programs/data.csv” 7 8 Compiler error with files Compiler error with files n Here is the compilation error that is produced: n Question: Why will the following program NOT compile? ReadFile.java:6: unreported exception import java.io.*; // for File java.io.FileNotFoundException; import java.util.*; // for Scanner must be caught or declared to be thrown Scanner scan = new Scanner(new File("data.txt")); public class ReadFile { n The problem has to do with error reporting. public static void main(String[] args) { File file = new File(“input.txt”); n What to do when a file cannot be opened? Scanner scan = new Scanner(file); n File may not exist, or may be protected. String text = scan.next(); n Options: exit program, return error, or throw exception System.out.println(text); } n Exceptions are the normal error mechanism in Java. } n Answer: Because of Java exception handling! 9 10 Exceptions Checked exceptions n checked exception : An error that must be n exception : An object that represents a program handled by our program (otherwise it will not error. compile). q Programs with invalid logic will cause exceptions. q We must specify what our program will do to handle q Examples: any potential file I/O failures. dividing by zero n calling charAt on a String with an out of range index n q We must either: trying to read a file that does not exist n declare that our program will handle (" catch ") the exception, or n q We say that a logical error results in an exception state that we choose not to handle the exception n being thrown . (and we accept that the program will crash if an exception q It is also possible to catch (handle) an exception. occurs) 11 12 2
10/23/18 Throwing Exceptions Handling Exceptions n throws clause : Keywords placed on a method's header n When doing file I/O, we use IOException . to state that it may generate an exception. public static void main(String[] args) { n It's like a waiver of liability: try { q "I hereby agree that this method might throw an exception, and I File file = new File(“input.txt); accept the consequences (crashing) if this happens.” Scanner scan = new Scanner(file); q General syntax: String firstLine = scan.nextLine(); public static <type> <name> ( <params> ) throws <type> ... { … } } catch (IOException e) { q When doing file open, we throw IOException . System.out.println(“Unable to open input.txt”); public static void main(String[] args) System.exit(-1); throws IOException { } } 13 14 Fixing the compiler error Using Scanner to read file data n Consider a file numbers.txt that contains n Throwing an exception or handling the exception both this text: resolve the compiler error. 308.2 n Throwing Exceptions: User will see program terminate 14.9 7.4 2.8 with exception, that’s not very friendly. 3.9 4.7 -15.4 n Handling Exceptions: User gets a clear indication of 2.8 problem with error message, that’s much better. n A Scanner views all input as a stream of n We will handle exceptions when reading and writing files in programming assignments. characters: q 308.2\n 14.9 7.4 2.8\n\n\n3.9 4.7 -15.4\n2.8\n 15 16 Consuming tokens First problem n Each call to next , nextInt, nextDouble , etc. n Write code that reads the first 5 double advances the position of the scanner to the end of the values from a file and prints. current token, skipping over any whitespace: 308.2\n 14.9 7.4 2.8\n\n\n3.9 4.7 -15.4\n2.8\n ^ scan.nextDouble(); 308.2 \n 14.9 7.4 2.8\n\n\n3.9 4.7 -15.4\n2.8\n ^ scan.nextDouble(); 308.2\n 14.9 7.4 2.8\n\n\n3.9 4.7 -15.4\n2.8\n ^ 17 18 3
10/23/18 First solution Second problem public static void main(String[] args) n How would we modify the program to read all try { the file? File file = new File(“input.txt”); Scanner scan = new Scanner(file); for (int i = 0; i <= 4; i++) { double next = scan.nextDouble(); System.out.println("number = " + next); } } catch (IOException e) { System.out.println(“Unable to open input.txt”); System.exit(-1); } } 19 20 Second solution Refining the problem public static void main(String[] args) n Modify the program again to handle files that try { also contain non-numeric tokens. File file = new File(“input.txt”); Scanner scan = new Scanner(file); q The program should skip any such tokens. while (scan.hasNextDouble() { n For example, it should produce the same double next = scan.nextDouble(); output as before when given this input file: System.out.println("number = " + next); } } catch (IOException e) { 308.2 hello System.out.println(“Unable to open input.txt”); 14.9 7.4 bad stuff 2.8 System.exit(-1); 3.9 4.7 oops -15.4 } :-) 2.8 @#*($& } 21 22 Refining the program Reading input line-by-line n Given the following input data: 23 3.14 John Smith "Hello world" while (scan.hasNext()) { 45.2 19 if (scan.hasNextDouble()) { n The Scanner can read it line-by-line: double next = scan.nextDouble(); 23\t3.14 John Smith\t"Hello world"\n\t\t45.2 19\n System.out.println("number = " + next); ^ } else { scan.nextLine() 23\t3.14 John Smith\t"Hello world" \n\t\t45.2 19\n // consume the bad token ^ scan.next(); scan.nextLine() 23\t3.14 John Smith\t"Hello world"\n \t\t45.2 19 \n } } ^ n The \n character is consumed but not returned. 23 24 4
10/23/18 File processing question Solution n Write a program that reads a text file and int count = 0; adds line numbers at the beginning of each while (scan.hasNextLine()) { line String line = scan.nextLine(); System.out.println(count + “ “ + line); count++; } 25 26 Problem Scanner on strings n Given a file with the following contents: n A Scanner can tokenize a String , such as a line of a file. 123 Susan 12.5 8.1 7.6 3.2 Scanner <name> = new Scanner( <String> ); 456 Brad 4.0 11.6 6.5 2.7 12 789 Jennifer 8.0 8.0 8.0 8.0 7.5 q Example: q Consider the task of computing hours worked by each person String text = "1.4 3.2 hello 9 27.5"; Scanner scan = new Scanner(text) ; q Approach: System.out.println(scan.next()); // 1.4 System.out.println(scan.next()); // 3.2 Break the input into lines. n System.out.println(scan.next()); // hello Break each line into tokens. n 27 28 Tokenize an entire file Example n Example: Count the tokens on each line of a file. n We can use string Scanner(s) to tokenize each line of a file: Scanner scan = new Scanner(new File("input.txt")); while (scan.hasNextLine()) { Scanner scan = new Scanner(new File( <file name )); String line = scan.nextLine(); while (scan.hasNextLine()) { Scanner lineScan = new Scanner(line); int count = 0; String line = scan.nextLine(); while (lineScan.hasNext()) { Scanner lineScan = new Scanner(line); String token = lineScan.next(); <process this line...> ; count++; } } System.out.println("Line has “+count+" tokens"); } Input file input.txt : Output to console: 23 3.14 John Smith "Hello world" Line has 6 tokens 45.2 19 Line has 2 tokens 29 30 5
Recommend
More recommend