Java I/O using Scanner, Files For CS2110, SW Development Methods. Topics: I/O Streams Scanner class Reading from Files and Strings Reminder slides Adopted from slides for: CS 101, Chapter 2, Spring 2005 Aaron Bloomfield 1 What is the object System.out? System.out : PrintStream - destination = - ... + println(String s) : void + print(String s) : void + ... Variable System.out gives access to an output stream of type PrintStream The printing destination attribute for this PrintStream object is the console window The behaviors of a PrintStream object support a high-level view of printing 2 Selection The period indicates that we want to select an individual class member of System The period indicates that we want to select an individual class member of out The method we are calling System . out . print ( " string " ) Member out of System is an output Literal character string that is stream object automatically the parameter to print(). associated with the console window running the application Class System is defined in the standard Method member of out. The execution of member print() package java.lang causes its parameter to be displayed to the output stream 3 I/O streams System.out Prints to standard output Equivalent to cout in C++, and print() in C System.err Prints to standard error Equivalent to cerr in C++, and fprintf(stderr) in C System.in Reads from standard input Equivalent to cin in C++, and scanf() in C 4 Support for interactive console programs Variable System.in Associated with the standard input stream – the keyboard Class Scanner Makes obtaining input from the keyboard easy Scanner stdin = new Scanner (System.in); stdin : Scanner - source = - ... Variable stdin gives Scanner access to an input stream Input source attribute for this Scanner is the keyboard + nextDouble() : double + ... Behaviors of a Scanner support high-level view of inputting text 5 How to make Java work with the Scanner class In Java 1.5 and later, do a: import java.util.*; To create a new Scanner (for the keyboard): Scanner stdin = new Scanner (System.in); Do NOT use the following (it won’t work): Scanner stdin = Scanner.create (System.in); This was correct for a short-time in the beta of Java 5.0, but was dropped in the final version. Java API Documentation for Scanner: http://download.oracle.com/javase/6/docs/api/java/util/Scanner. 6 html Scanner API public Scanner(InputStream in) // Scanner(): constructor for reading from a // InputStream public Scanner(File f) // Scanner(): constructor to read from a file object public Scanner(String s) // Scanner(): constructor to scan from a string public int nextInt() // nextInt(): next input value as an int public short nextShort() // nextShort(): next input value as a short public long nextLong() // nextLong(): next input value as a long public double nextDouble() // nextDouble(): next next input value as a double public float nextFloat() // nextFloat(): next next input value as a float public String next() // next(): get next whitespace-free string public String nextLine() // nextLine(): return contents of input line buffer public boolean hasNext() // hasNext(): is there a value to next 7 A Simple Example import java.util.*; public class MathFun { public static void main(String[] args) { // set up the Scanner object Scanner stdin = new Scanner(System.in); // have the user input the values for x and y System.out.print("Enter a decimal number: "); double x = stdin.nextDouble(); System.out.print("Enter another decimal number: "); double y = stdin.nextDouble(); double squareRootX = Math.sqrt(x); System.out.println ("Square root of " + x + " is " + squareRootX); } } 8 Typical Use of Scanner Construct a scanner object Use hasNext() to see if possible to read next item Get the item with one of the “next” methods Repeat as necessary Example: read all input until “end of file” or “end of input” Scanner theInput = new Scanner( some-argument ); while ( theInput.hasNext() ) { String token = theInput.next(); // do something with the String you just read } Note we could have called any of the “next methods” Sometimes you must make sure there’s something to read before reading: if ( theInput.hasNext() ) anInt = theInput.nextInt(); 9 You Can “Read” from Strings When you create a scanner object, you can associate it with a String object Pass a String to the constructor Allows you to extract or scan values of various types from a string Very useful! Could you write this code? Read an entire line from the input Then, read each item in that line Hint: need loop like the previous page, nextLine() and a second loop using a second scanner 10 You Can Read from a File Instead of the Keyboard When you create a scanner object, associate it with a File object instead of System.in The Java type File is an object that represents a file on disk Need to have: import java.io.*; Create a Java File object that’s linked to a disk-file: Pass the File constructor a String containing the file-name and pathBut, this may fail! Bad file-name File not available for reading 11 Catching Exceptions when Opening a File The File constructor may throw an exception Exception is a Java object created when an error occurs Handle this with a try-catch block try { … } surrounds the code that might throw the exception catch (Exception e) { … } follows the try-block and contains code to be executed if an exception of type Exception just occurred Follow this example when opening a file: String fname = "mydata.txt"; try { Scanner myInput = new Scanner( new File(fname) ); } catch (Exception e) { System.out.println("Error: Cannot open file: " + fname); 12 } Some Reminder Slides Here are some additional slides from that lecture in CS101 You may know all the following But maybe a quick review won’t hurt 13 System.out.println() public static void main(String[] args) { System.out.print("I think there is a world market for"); System.out.println(" maybe five computers."); System.out.println(" Thomas Watson, IBM, 1943."); } Class System supplies objects that can print and read values System variable out references the standard printing object Known as the standard output stream Variable out provides access to printing methods print(): displays a value println(): displays a value and moves cursor to the next line 14 Escape sequences Java provides escape sequences characters \b backspace \n newline \t tab \r carriage return \\ backslash \" double quote \' single quote for printing special 15 Escape sequences What do these statements output? System.out.println("Person\tHeight\tShoe size"); System.out.println("========================="); System.out.println("Hannah\t5‘1\"\t7"); System.out.println("Jenna\t5'10\"\t9"); System.out.println("JJ\t6'1\"\t14"); Output Person Height Shoe size ========================= Hannah 5‘1" 7 Jenna 5'10" 9 JJ 6'1" 14 16 Casting Consider the following code double d = 3.6; int x = Math.round(d); Java complains (about loss of precision). Why? Math.round() returns a long, not an int So this is forcing a long value into an int variable How to fix this double d = 3.6; int x = (int) Math.round(d); You are telling Java that it is okay to do this This is called “casting” The type name is in parenthesis 17 More casting examples Consider double d = 3.6; int x = (int) d; At this point, x holds 3 (not 4!) This truncates the value! Consider int x = 300; byte b = (byte) x; System.out.println (b); What gets printed? Recall that a byte can hold values -128 to 127 44! This is the “loss of precision” 18