Java Input/Output 11 April 2013 OSU CSE 1
Overview •  The Java I/O (Input/Output) package java.io contains a group of interfaces and classes similar to the OSU CSE components’ SimpleReader and SimpleWriter component families – Except that java.io is far more general, configurable, and powerful (and messy) – Hence, the names SimpleReader and SimpleWriter 11 April 2013 OSU CSE 2
I/O Streams •  An input/output stream is a (conceptually not necessarily finite) series of data items – An input stream is a “flow” of data items from a source to a program •  The program reads from the source (or from the stream) – An output stream is a “flow” of data items from a program to a destination •  The program writes to the destination (or to the stream) 11 April 2013 OSU CSE 3
Input Streams 11 April 2013 OSU CSE 4 source input stream program single data item
Input Streams 11 April 2013 OSU CSE 5 source input stream program single data item Source may be the keyboard, a file on disk, a physical device, another program, even an array or String in the same program.
Output Streams 11 April 2013 OSU CSE 6 program single data item desti- nation output stream
Output Streams 11 April 2013 OSU CSE 7 program single data item desti- nation output stream Destination may be the console window, a file on disk, a physical device, another program, even an array or String in the same program.
Part I: Beginner’s Guide •  This part is essentially a “how-to” guide for using java.io that assumes knowledge of the OSU CSE components’ SimpleReader and SimpleWriter component families 11 April 2013 OSU CSE 8
Keyboard Input (SimpleReader) •  Here’s some code in main to read input from the keyboard, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L(); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 9
Keyboard Input (SimpleReader) •  Here’s some code in main to read input from the keyboard, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L(); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 10 Advice (except for the simplest programs): to guard against the user entering “unexpected” input, read a line at a time into a String and then parse it to see whether it looks like expected.
Overview of java.io Input 11 April 2013 OSU CSE 11 InputStream- Reader Readable Reader Closeable FileReader BufferedReader There are more classes and interfaces not discussed here!
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 12
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 13 Some methods in java.io throw exceptions (discussed later) under certain circumstances, and you either need to catch them or let them propagate “up the call chain”, like this.
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 14 The variable System.in is a Java standard stream (discussed later), so you may use it without declaring it; but it is a byte stream (discussed later), so you want to wrap it ...
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 15 ... in a character stream (discussed later) like this ...
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 16 ... and then you want to wrap that character stream in a buffered stream (discussed later), like this, so ...
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 17 ... you can read one line at a time into a String, like this.
Keyboard Input (java.io) •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 18 The declared types of variables when you use java.io are class types rather than interface types.
Keyboard Input (java.io)to •  Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 19 This technique of slightly extending features or capabilities of an object by wrapping it inside another object is a popular object-oriented design pattern called the decorator pattern.
An Alternative (java.util) •  An attractive alternative to using java.io.BufferedReader is to use java.util.Scanner – Important difference: no IOExceptions can be raised, so you don’t need to worry about catching or throwing them – Features for parsing input are powerful, e.g., the use of regular expressions to describe delimiters between data items 11 April 2013 OSU CSE 20
An Alternative (java.util) •  Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 21
An Alternative (java.util) •  Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 22 Now, main does not declare that it throws IOException; in this sense it is similar to using SimpleReader.
An Alternative (java.util) •  Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 23 Notice that initialization does not involve layers of wrapping of one object inside another; Scanner also has different constructors so it can be used with files.
An Alternative (java.util) •  Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 24 The method for reading a line into a String has a different name than for BufferedReader: it is nextLine (like SimpleReader).
End-of-Stream (SimpleReader) public static void main(String[] args) { SimpleReader input = new SimpleReader1L(); while (!input.atEOS()) { s = input.nextLine(); ... } ... input.close(); } 11 April 2013 OSU CSE 25
End-of-Stream (SimpleReader) public static void main(String[] args) { SimpleReader input = new SimpleReader1L(); while (!input.atEOS()) { s = input.nextLine(); ... } ... input.close(); } 11 April 2013 OSU CSE 26 SimpleReader has a method to report “at end-of-stream”, and it can tell you this before you read “past the end of the input stream”; similarly, Scanner has method hasNext.
End-of-Stream (java.io) public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); while (s != null) { ... s = input.readLine(); } ... input.close(); } 11 April 2013 OSU CSE 27
End-of-Stream (java.io) public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); while (s != null) { ... s = input.readLine(); } ... input.close(); } 11 April 2013 OSU CSE 28 BufferedReader has no method to detect when you cannot read any more input, so you can check it only after you try to read “past the end of the stream”.
End-of-Stream (java.io) public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); while (s != null) { ... s = input.readLine(); } ... input.close(); } 11 April 2013 OSU CSE 29 Before checking again, you must try to read another line.
File Input (SimpleReader) •  Here’s some code in main to read input from a file, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L("data/test.txt"); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 30
File Input (SimpleReader) •  Here’s some code in main to read input from a file, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L("data/test.txt"); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 31 SimpleReader has a constructor from a String, which is the name of the file you want to read from.
File Input (java.io) •  Here’s some code in main to read input from a file, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new FileReader("data/test.txt")); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 32
File Input (java.io) •  Here’s some code in main to read input from a file, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new FileReader("data/test.txt")); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 33 Now, you wrap a BufferedReader around a FileReader (which has a constructor from a String, which is the name of the file you want to read from).
Independence From Source •  With SimpleReader, BufferedReader, and Scanner used as shown, the source is identified in a constructor call, and subsequent code to read data is independent of the source – This is a really handy feature in many software maintenance situations – But notice: methods differ between BufferedReader and the other two! 11 April 2013 OSU CSE 34
Console Output (SimpleWriter) •  Here’s some code in main to write output to the console, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L(); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 35
Console Output (SimpleWriter) •  Here’s some code in main to write output to the console, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L(); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 36 Both print and println are available, and the latter should be used to output the line separator string for the current “platform” (i.e., the system the Java program is running on).
Overview of java.io Output 11 April 2013 OSU CSE 37 OutputStream- Writer Flushable Writer Closeable FileWriter BufferedWriter Appendable PrintWriter There are more classes and interfaces not discussed here!
Console Output (java.io) •  Here’s some code in main to write output to the console, using java.io: public static void main(String[] args) { ... System.out.print("foo"); System.out.println(" and bar"); ... } 11 April 2013 OSU CSE 38
Console Output (java.io) •  Here’s some code in main to write output to the console, using java.io: public static void main(String[] args) { ... System.out.print("foo"); System.out.println(" and bar"); ... } 11 April 2013 OSU CSE 39 System.out is another Java standard stream (discussed later), which you neither declare nor close; both print and println are available.
Console Output (java.io) •  Here’s some code in main to write output to the console, using java.io: public static void main(String[] args) { ... System.out.print("foo"); System.out.println(" and bar"); ... } 11 April 2013 OSU CSE 40 It is fine to use System.out for console output, but there are potential problems using (unwrapped) System.in for keyboard input.
File Output (SimpleWriter) •  Here’s some code in main to write output to a file, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L("data/test.txt"); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 41
File Output (SimpleWriter) •  Here’s some code in main to write output to a file, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L("data/test.txt"); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 42 SimpleWriter has a constructor from a String, which is the name of the file you want to write to.
File Output (java.io) •  Here’s some code in main to write output to a file, using java.io: public static void main(String[] args) throws IOException { PrintWriter output = new PrintWriter( new BufferedWriter ( new FileWriter("data/test.txt"))); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 43
File Output (java.io) •  Here’s some code in main to write output to a file, using java.io: public static void main(String[] args) throws IOException { PrintWriter output = new PrintWriter( new BufferedWriter ( new FileWriter("data/test.txt"))); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 44 PrintWriter is needed for convenient output, and is added as yet another wrapper—to get print and println.
Independence From Destination •  With SimpleWriter, System.out, and PrintWriter used as shown, the destination is identified in a constructor call, and subsequent code to write data is independent of the destination – This is a really handy feature in many software maintenance situations – Unlike input, methods (print and println) for all three have same names and behaviors 11 April 2013 OSU CSE 45
Part II: Some Details •  There are way too many details about java.io to cover here; see the Javadoc and the Java Tutorials trail on “Basic I/O” •  A few details previously promised ... 11 April 2013 OSU CSE 46
IOException •  A general discussion of exceptions in Java is to come later still, but for now… •  A number of java.io constructors and methods might throw (raise) an IOException – Examples: files to be used as sources/ destinations may not exist, may not be readable and/or writeable by the user of the program, etc. 11 April 2013 OSU CSE 47
Try-Catch •  As an alternative to letting an exception propagate “up the call chain” to the client (as in the earlier examples), you may deal with an IOException by catching (handling) it, e.g.: – Report that there has been an I/O error and exit “gracefully” – Try to recover from it (which is usually much harder) 11 April 2013 OSU CSE 48
Example •  Here’s the overall structure of an example main in a simple application that reads input from a file, using java.io: public static void main(String[] args) { // Code to open file // Code to read from file // Code to close file } 11 April 2013 OSU CSE 49
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 50
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 51 Now, main does not declare that it throws IOException if it (always) catches the exception.
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 52 This variable must be declared (but not initialized) here, so it is in scope later where the code reads from the file—if the file is opened successfully.
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 53 The try block contains the code that might throw an IOException ...
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 54 ... which this constructor might throw, e.g., if the file does not exist.
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 55 The catch block states the exception it handles, and is executed iff code in the try block throws that exception (which is called e in the catch block).
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 56 Here, the code prints an error message to System.err, another Java standard stream (discussed later), and “aborts” main by returning from it.
Example: Opening a File public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 57 In either case (even after the catch block, if it did not return as it does here), execution proceeds with the next statement.
Example: Reading From a File public static void main(String[] args) { // Code to open file try { String s = input.readLine(); while (s != null) { ... s = input.readLine(); } } catch (IOException e) { System.err.println("Error reading from file"); } // Code to close file } 11 April 2013 OSU CSE 58
Example: Reading From a File public static void main(String[] args) { // Code to open file try { String s = input.readLine(); while (s != null) { ... s = input.readLine(); } } catch (IOException e) { System.err.println("Error reading from file"); } // Code to close file } 11 April 2013 OSU CSE 59 We need this try-catch because the method readLine might throw an IOException.
Example: Reading From a File public static void main(String[] args) { // Code to open file try { String s = input.readLine(); while (s != null) { ... s = input.readLine(); } } catch (IOException e) { System.err.println("Error reading from file"); } // Code to close file } 11 April 2013 OSU CSE 60 As before, even after the catch block (which in this case does not end with a return), execution proceeds with the next statement.
Example: Closing a File public static void main(String[] args) { // Code to open file // Code to read from file try { input.close(); } catch (IOException e) { System.err.println("Error closing file"); } } 11 April 2013 OSU CSE 61
Example: Closing a File public static void main(String[] args) { // Code to open file // Code to read from file try { input.close(); } catch (IOException e) { System.err.println("Error closing file"); } } 11 April 2013 OSU CSE 62 We need this try-catch because even the method close might throw an IOException.
The Standard Streams •  The utility class System in java.lang declares three standard streams: – System.in – System.out – System.err •  You do not declare, open, or close these streams; but you can always use them without worrying about exceptions 11 April 2013 OSU CSE 63
The Standard Streams •  The utility class System in java.lang declares three standard streams: – System.in – System.out – System.err •  You do not declare, open, or close these streams; but you can always use them without worrying about exceptions 11 April 2013 OSU CSE 64 A utility class is a class that cannot be instantiated, i.e., there is no public constructor; it is not a type, so you cannot create “an object of that type”.
The Standard Streams •  The utility class System in java.lang declares three standard streams: – System.in – System.out – System.err •  You do not declare, open, or close these streams; but you can always use them without worrying about exceptions 11 April 2013 OSU CSE 65 System.err is intended for error messages; System.out is intended for normal output.
Byte and Character Streams •  Java has two categories of streams: – Byte streams are streams of 8-bit bytes •  This is a kind of low-level I/O that you rarely need – Character streams are streams of Unicode characters •  This is preferred for text I/O because it accounts for the “local” character set and supports internationalization with little additional effort •  Best practice is to use character streams with textual I/O 11 April 2013 OSU CSE 66
Buffered Streams •  Buffered streams minimize disk access for reading/writing files, and generally have performance advantages over unbuffered streams •  Best practice is to “wrap” input and output character streams to create buffered versions – This is done with BufferedReader and BufferedWriter, as seen earlier 11 April 2013 OSU CSE 67
Files and Paths •  The File class (an original part of Java) and the Path interface (new in Java 1.7) allow you to manipulate directories and files and the “paths” to them in the file system, e.g.: – Check file existence and permissions, create files and set permissions, delete files, etc. •  See the Java Tutorials: Basic I/O and the Java libraries’ Javadoc for details 11 April 2013 OSU CSE 68
Resources •  The Java Tutorials: Basic I/O –  http://docs.oracle.com/javase/tutorial/essential/io/index.html 11 April 2013 OSU CSE 69

sasasasasasas

  • 1.
  • 2.
    Overview •  The JavaI/O (Input/Output) package java.io contains a group of interfaces and classes similar to the OSU CSE components’ SimpleReader and SimpleWriter component families – Except that java.io is far more general, configurable, and powerful (and messy) – Hence, the names SimpleReader and SimpleWriter 11 April 2013 OSU CSE 2
  • 3.
    I/O Streams •  Aninput/output stream is a (conceptually not necessarily finite) series of data items – An input stream is a “flow” of data items from a source to a program •  The program reads from the source (or from the stream) – An output stream is a “flow” of data items from a program to a destination •  The program writes to the destination (or to the stream) 11 April 2013 OSU CSE 3
  • 4.
    Input Streams 11 April2013 OSU CSE 4 source input stream program single data item
  • 5.
    Input Streams 11 April2013 OSU CSE 5 source input stream program single data item Source may be the keyboard, a file on disk, a physical device, another program, even an array or String in the same program.
  • 6.
    Output Streams 11 April2013 OSU CSE 6 program single data item desti- nation output stream
  • 7.
    Output Streams 11 April2013 OSU CSE 7 program single data item desti- nation output stream Destination may be the console window, a file on disk, a physical device, another program, even an array or String in the same program.
  • 8.
    Part I: Beginner’sGuide •  This part is essentially a “how-to” guide for using java.io that assumes knowledge of the OSU CSE components’ SimpleReader and SimpleWriter component families 11 April 2013 OSU CSE 8
  • 9.
    Keyboard Input (SimpleReader) • Here’s some code in main to read input from the keyboard, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L(); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 9
  • 10.
    Keyboard Input (SimpleReader) • Here’s some code in main to read input from the keyboard, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L(); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 10 Advice (except for the simplest programs): to guard against the user entering “unexpected” input, read a line at a time into a String and then parse it to see whether it looks like expected.
  • 11.
    Overview of java.ioInput 11 April 2013 OSU CSE 11 InputStream- Reader Readable Reader Closeable FileReader BufferedReader There are more classes and interfaces not discussed here!
  • 12.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 12
  • 13.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 13 Some methods in java.io throw exceptions (discussed later) under certain circumstances, and you either need to catch them or let them propagate “up the call chain”, like this.
  • 14.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 14 The variable System.in is a Java standard stream (discussed later), so you may use it without declaring it; but it is a byte stream (discussed later), so you want to wrap it ...
  • 15.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 15 ... in a character stream (discussed later) like this ...
  • 16.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 16 ... and then you want to wrap that character stream in a buffered stream (discussed later), like this, so ...
  • 17.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 17 ... you can read one line at a time into a String, like this.
  • 18.
    Keyboard Input (java.io) • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 18 The declared types of variables when you use java.io are class types rather than interface types.
  • 19.
    Keyboard Input (java.io)to • Here’s some code in main to read input from the keyboard, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 19 This technique of slightly extending features or capabilities of an object by wrapping it inside another object is a popular object-oriented design pattern called the decorator pattern.
  • 20.
    An Alternative (java.util) • An attractive alternative to using java.io.BufferedReader is to use java.util.Scanner – Important difference: no IOExceptions can be raised, so you don’t need to worry about catching or throwing them – Features for parsing input are powerful, e.g., the use of regular expressions to describe delimiters between data items 11 April 2013 OSU CSE 20
  • 21.
    An Alternative (java.util) • Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 21
  • 22.
    An Alternative (java.util) • Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 22 Now, main does not declare that it throws IOException; in this sense it is similar to using SimpleReader.
  • 23.
    An Alternative (java.util) • Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 23 Notice that initialization does not involve layers of wrapping of one object inside another; Scanner also has different constructors so it can be used with files.
  • 24.
    An Alternative (java.util) • Here’s some code in main to read input from the keyboard, using Scanner: public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 24 The method for reading a line into a String has a different name than for BufferedReader: it is nextLine (like SimpleReader).
  • 25.
    End-of-Stream (SimpleReader) public staticvoid main(String[] args) { SimpleReader input = new SimpleReader1L(); while (!input.atEOS()) { s = input.nextLine(); ... } ... input.close(); } 11 April 2013 OSU CSE 25
  • 26.
    End-of-Stream (SimpleReader) public staticvoid main(String[] args) { SimpleReader input = new SimpleReader1L(); while (!input.atEOS()) { s = input.nextLine(); ... } ... input.close(); } 11 April 2013 OSU CSE 26 SimpleReader has a method to report “at end-of-stream”, and it can tell you this before you read “past the end of the input stream”; similarly, Scanner has method hasNext.
  • 27.
    End-of-Stream (java.io) public staticvoid main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); while (s != null) { ... s = input.readLine(); } ... input.close(); } 11 April 2013 OSU CSE 27
  • 28.
    End-of-Stream (java.io) public staticvoid main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); while (s != null) { ... s = input.readLine(); } ... input.close(); } 11 April 2013 OSU CSE 28 BufferedReader has no method to detect when you cannot read any more input, so you can check it only after you try to read “past the end of the stream”.
  • 29.
    End-of-Stream (java.io) public staticvoid main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String s = input.readLine(); while (s != null) { ... s = input.readLine(); } ... input.close(); } 11 April 2013 OSU CSE 29 Before checking again, you must try to read another line.
  • 30.
    File Input (SimpleReader) • Here’s some code in main to read input from a file, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L("data/test.txt"); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 30
  • 31.
    File Input (SimpleReader) • Here’s some code in main to read input from a file, using SimpleReader: public static void main(String[] args) { SimpleReader input = new SimpleReader1L("data/test.txt"); String s = input.nextLine(); ... input.close(); } 11 April 2013 OSU CSE 31 SimpleReader has a constructor from a String, which is the name of the file you want to read from.
  • 32.
    File Input (java.io) • Here’s some code in main to read input from a file, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new FileReader("data/test.txt")); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 32
  • 33.
    File Input (java.io) • Here’s some code in main to read input from a file, using java.io: public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader( new FileReader("data/test.txt")); String s = input.readLine(); ... input.close(); } 11 April 2013 OSU CSE 33 Now, you wrap a BufferedReader around a FileReader (which has a constructor from a String, which is the name of the file you want to read from).
  • 34.
    Independence From Source • With SimpleReader, BufferedReader, and Scanner used as shown, the source is identified in a constructor call, and subsequent code to read data is independent of the source – This is a really handy feature in many software maintenance situations – But notice: methods differ between BufferedReader and the other two! 11 April 2013 OSU CSE 34
  • 35.
    Console Output (SimpleWriter) • Here’s some code in main to write output to the console, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L(); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 35
  • 36.
    Console Output (SimpleWriter) • Here’s some code in main to write output to the console, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L(); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 36 Both print and println are available, and the latter should be used to output the line separator string for the current “platform” (i.e., the system the Java program is running on).
  • 37.
    Overview of java.ioOutput 11 April 2013 OSU CSE 37 OutputStream- Writer Flushable Writer Closeable FileWriter BufferedWriter Appendable PrintWriter There are more classes and interfaces not discussed here!
  • 38.
    Console Output (java.io) • Here’s some code in main to write output to the console, using java.io: public static void main(String[] args) { ... System.out.print("foo"); System.out.println(" and bar"); ... } 11 April 2013 OSU CSE 38
  • 39.
    Console Output (java.io) • Here’s some code in main to write output to the console, using java.io: public static void main(String[] args) { ... System.out.print("foo"); System.out.println(" and bar"); ... } 11 April 2013 OSU CSE 39 System.out is another Java standard stream (discussed later), which you neither declare nor close; both print and println are available.
  • 40.
    Console Output (java.io) • Here’s some code in main to write output to the console, using java.io: public static void main(String[] args) { ... System.out.print("foo"); System.out.println(" and bar"); ... } 11 April 2013 OSU CSE 40 It is fine to use System.out for console output, but there are potential problems using (unwrapped) System.in for keyboard input.
  • 41.
    File Output (SimpleWriter) • Here’s some code in main to write output to a file, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L("data/test.txt"); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 41
  • 42.
    File Output (SimpleWriter) • Here’s some code in main to write output to a file, using SimpleWriter: public static void main(String[] args) { SimpleWriter output = new SimpleWriter1L("data/test.txt"); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 42 SimpleWriter has a constructor from a String, which is the name of the file you want to write to.
  • 43.
    File Output (java.io) • Here’s some code in main to write output to a file, using java.io: public static void main(String[] args) throws IOException { PrintWriter output = new PrintWriter( new BufferedWriter ( new FileWriter("data/test.txt"))); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 43
  • 44.
    File Output (java.io) • Here’s some code in main to write output to a file, using java.io: public static void main(String[] args) throws IOException { PrintWriter output = new PrintWriter( new BufferedWriter ( new FileWriter("data/test.txt"))); output.print("foo"); output.println(" and bar"); ... output.close(); } 11 April 2013 OSU CSE 44 PrintWriter is needed for convenient output, and is added as yet another wrapper—to get print and println.
  • 45.
    Independence From Destination • With SimpleWriter, System.out, and PrintWriter used as shown, the destination is identified in a constructor call, and subsequent code to write data is independent of the destination – This is a really handy feature in many software maintenance situations – Unlike input, methods (print and println) for all three have same names and behaviors 11 April 2013 OSU CSE 45
  • 46.
    Part II: SomeDetails •  There are way too many details about java.io to cover here; see the Javadoc and the Java Tutorials trail on “Basic I/O” •  A few details previously promised ... 11 April 2013 OSU CSE 46
  • 47.
    IOException •  A generaldiscussion of exceptions in Java is to come later still, but for now… •  A number of java.io constructors and methods might throw (raise) an IOException – Examples: files to be used as sources/ destinations may not exist, may not be readable and/or writeable by the user of the program, etc. 11 April 2013 OSU CSE 47
  • 48.
    Try-Catch •  As analternative to letting an exception propagate “up the call chain” to the client (as in the earlier examples), you may deal with an IOException by catching (handling) it, e.g.: – Report that there has been an I/O error and exit “gracefully” – Try to recover from it (which is usually much harder) 11 April 2013 OSU CSE 48
  • 49.
    Example •  Here’s theoverall structure of an example main in a simple application that reads input from a file, using java.io: public static void main(String[] args) { // Code to open file // Code to read from file // Code to close file } 11 April 2013 OSU CSE 49
  • 50.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 50
  • 51.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 51 Now, main does not declare that it throws IOException if it (always) catches the exception.
  • 52.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 52 This variable must be declared (but not initialized) here, so it is in scope later where the code reads from the file—if the file is opened successfully.
  • 53.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 53 The try block contains the code that might throw an IOException ...
  • 54.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 54 ... which this constructor might throw, e.g., if the file does not exist.
  • 55.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 55 The catch block states the exception it handles, and is executed iff code in the try block throws that exception (which is called e in the catch block).
  • 56.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 56 Here, the code prints an error message to System.err, another Java standard stream (discussed later), and “aborts” main by returning from it.
  • 57.
    Example: Opening aFile public static void main(String[] args) { BufferedReader input; try { input = new BufferedReader( new FileReader("data/test.txt")); } catch (IOException e) { System.err.println("Error opening file"); return; } // Code to read from file // Code to close file } 11 April 2013 OSU CSE 57 In either case (even after the catch block, if it did not return as it does here), execution proceeds with the next statement.
  • 58.
    Example: Reading Froma File public static void main(String[] args) { // Code to open file try { String s = input.readLine(); while (s != null) { ... s = input.readLine(); } } catch (IOException e) { System.err.println("Error reading from file"); } // Code to close file } 11 April 2013 OSU CSE 58
  • 59.
    Example: Reading Froma File public static void main(String[] args) { // Code to open file try { String s = input.readLine(); while (s != null) { ... s = input.readLine(); } } catch (IOException e) { System.err.println("Error reading from file"); } // Code to close file } 11 April 2013 OSU CSE 59 We need this try-catch because the method readLine might throw an IOException.
  • 60.
    Example: Reading Froma File public static void main(String[] args) { // Code to open file try { String s = input.readLine(); while (s != null) { ... s = input.readLine(); } } catch (IOException e) { System.err.println("Error reading from file"); } // Code to close file } 11 April 2013 OSU CSE 60 As before, even after the catch block (which in this case does not end with a return), execution proceeds with the next statement.
  • 61.
    Example: Closing aFile public static void main(String[] args) { // Code to open file // Code to read from file try { input.close(); } catch (IOException e) { System.err.println("Error closing file"); } } 11 April 2013 OSU CSE 61
  • 62.
    Example: Closing aFile public static void main(String[] args) { // Code to open file // Code to read from file try { input.close(); } catch (IOException e) { System.err.println("Error closing file"); } } 11 April 2013 OSU CSE 62 We need this try-catch because even the method close might throw an IOException.
  • 63.
    The Standard Streams • The utility class System in java.lang declares three standard streams: – System.in – System.out – System.err •  You do not declare, open, or close these streams; but you can always use them without worrying about exceptions 11 April 2013 OSU CSE 63
  • 64.
    The Standard Streams • The utility class System in java.lang declares three standard streams: – System.in – System.out – System.err •  You do not declare, open, or close these streams; but you can always use them without worrying about exceptions 11 April 2013 OSU CSE 64 A utility class is a class that cannot be instantiated, i.e., there is no public constructor; it is not a type, so you cannot create “an object of that type”.
  • 65.
    The Standard Streams • The utility class System in java.lang declares three standard streams: – System.in – System.out – System.err •  You do not declare, open, or close these streams; but you can always use them without worrying about exceptions 11 April 2013 OSU CSE 65 System.err is intended for error messages; System.out is intended for normal output.
  • 66.
    Byte and CharacterStreams •  Java has two categories of streams: – Byte streams are streams of 8-bit bytes •  This is a kind of low-level I/O that you rarely need – Character streams are streams of Unicode characters •  This is preferred for text I/O because it accounts for the “local” character set and supports internationalization with little additional effort •  Best practice is to use character streams with textual I/O 11 April 2013 OSU CSE 66
  • 67.
    Buffered Streams •  Bufferedstreams minimize disk access for reading/writing files, and generally have performance advantages over unbuffered streams •  Best practice is to “wrap” input and output character streams to create buffered versions – This is done with BufferedReader and BufferedWriter, as seen earlier 11 April 2013 OSU CSE 67
  • 68.
    Files and Paths • The File class (an original part of Java) and the Path interface (new in Java 1.7) allow you to manipulate directories and files and the “paths” to them in the file system, e.g.: – Check file existence and permissions, create files and set permissions, delete files, etc. •  See the Java Tutorials: Basic I/O and the Java libraries’ Javadoc for details 11 April 2013 OSU CSE 68
  • 69.
    Resources •  The JavaTutorials: Basic I/O –  http://docs.oracle.com/javase/tutorial/essential/io/index.html 11 April 2013 OSU CSE 69