Presentation is loading. Please wait.

Presentation is loading. Please wait.

Text File Input & Output

Similar presentations


Presentation on theme: "Text File Input & Output"— Presentation transcript:

1 Text File Input & Output

2 Outcomes Know the difference between files and streams
Use a Scanner to read from a file add “throws” annotations to methods use the hasNext family of methods to read every element in a file Use a PrintWriter object to write to a file Know when and why to close file streams how to use autoclose to ensure they get closed Know how to read an entire text file

3 Input & Output Streams System.in and System.out are streams
carry information from one place to another System.in: from keyboard to program System.out: from program to monitor System.in (kbd) System.out keyboard Program monitor

4 File Streams Can get program to read from/write to files
connect Scanner to a file instead of System.in use a PrintWriter instead of System.out carry information to/from files fileIn.txt myprog.exe fileOut.txt fin (Scanner) fout (PrintWriter)

5 Read3NumbersFromFile.class
Streams and Files File exists as a whole, on the disk (or key) Stream just connects it to the program data comes in/goes out in pieces Input File 3Numbers.txt Program Read3NumbersFromFile.class Output File SumOf3.txt Scanner fin fout PrintWriter

6 Read3NumbersFromFile.class
Streams and Files File exists in secondary memory File has a name Data is in the file Scanner carries the data 3Numbers.txt Read3NumbersFromFile.class

7 (Possible) Program Variables
A String variable for the file name A File variable for the file A Scanner variable for the Scanner Variable(s) for the data “3Numbers.txt” 3Numbers.txt Read3NumbersFromFile.class

8 Text Files We will only read from text files
have .txt extension on a Windows system tho’ Windows may hide it from you! Text files can contain numbers (numerals) and may contain only numbers Twas brillig and the slithy toves 3Numbers.txt poem.txt

9 Why Use Files? Permanence Accuracy Ease of use
can re-use input; don’t need to copy output can use output of one program as input to next Accuracy correct before the program gets it even “invisible” output characters stored Ease of use large quantities of input hard to type correctly

10 Using Files Need to import some classes
import java.util.Scanner; import java.io.PrintWriter; import java.io.File; import java.io.FileNotFoundException; File I/O like console I/O, except: file streams need to be declared file streams need to be opened before use file streams should be closed when done there are pesky “exceptions” to deal with

11 Declaring File Streams
Create a file stream Scanner inStream; input file stream(*) PrintWriter outStream; output file stream(*) Typical names for file stream variables in, fin, inStream, inFile out, fout, outStream, outFile also names that suggest the file contents stuNumFile, encodedFile, …

12 (*) File Streams There are actually classes called InputFileStream and OutputFileStream these are the very basic file streams they’re not very useful (for us) Also lots of other kinds of file streams useful for different kinds of tasks Scanners and PrintWriters are more useful for the kinds of things we want to do

13 Using File Streams Our input streams are Scanner objects
int n = fileIn.nextInt(); String line = fileIn.nextLine(); fileIn acts just like kbd Our output streams are PrintWriter objects fileOut.println("The number you entered was " + n); fileOut.print("The line was: '" + line + "'\n"); fileOut acts very much like System.out Actually, System.out is a PrintStream, not a PrintWriter. PrintWriters are “new and improved” PrintStreams.

14 Opening a File for Input
Create a String object for the file’s name String fileName = "3Numbers.txt"; Create a File object to represent the file File dataFile = new File(fileName); Create a Scanner to read data from the file Scanner fin = new Scanner(dataFile); Or combine it all into one command Scanner fin = new Scanner(new File("3Numbers.txt")); NOTE: new File(…) does not mean that the file is new! We’re just creating a new object to represent that file.

15 Files & Folders Files exist inside folders
J:\ NetBeans Projects\Lab03\src\myProg.java J:\ NetBeans Projects\Lab05\Lab05Data.txt src Lab03 myProg.java J: NetBeans Projects myProg.class classes Lab05Data.txt Lab05

16 Files & Folders If you just give the name of the file…
myData.txt …then looks in the project folder not the src folder! But you can specify other folders absolute/relative paths src Looks here… Lab03 …not there

17 File Paths Somewhat system dependent Absolute path
but can always use / to separate folder names remember to “escape” \ if inside quote marks Absolute path J:/JCreator LE/Lab05/Lab05Data.txt Relative path (from L03 folder) ../Lab05/Lab05Data.txt

18 File Paths Use / in Strings in your code
will work on any machine, not just Windows “..” means the folder my folder is in “../..” means the folder that it’s in and so on! Put data files in project folder Use relative paths Lab03 J: NetBeans Projects Project Folder .. ../..

19 Problem An error message when we try to open a file
“… java.io.FileNotFoundException must be caught or declared to be thrown” FNFExn is not a RuntimeException RuntimeExceptions are nicer don’t need to say you’re not catching them need to say you’re not catching FNFExn or, you know, actually catch it

20 Declaring an Exception
Say you’re not catching it public static void main(String[] args) throws FileNotFoundException { NOTE where it is – before the body’s opening brace Note: throws instead of throw throw is a command tells computer to do something throws is a description says what this method sometimes does

21 When to Use a throws Clause
Use throws FileNotFoundException in any method that opens a file (without catching) input or output any method that calls any method that has that throws clause (and doesn’t catch) public static void doFileIO() throws FileNotFoundException { ... } public static void main(String[] a) throws FileNotFoundException { doFileIO(); } doFileIO may throw FNFExn; main won’t catch it

22 Example (Part 1) import java.util.Scanner; import java.io.File;
import java.io.FileNotFoundException; public class Read3NumbersFromFile { public static void main(String[] args) throws FileNotFoundException { int n1, n2, n3; Scanner fin = new Scanner(new File("3Nums.txt")); Continued next slide…

23 Example (Part 2) no fin.nextLine(). Why not? n1 = fin.nextInt();
System.out.println("The numbers in the file are: " + n1 + ", " + n2 + ", and " + n3); } no fin.nextLine(). Why not? don’t expect file creator to press the enter key!

24 Names of Objects Name of the file itself: 3Nums.txt
the file has the numbers in it Name of the Scanner: fin the Scanner is “attached” to the file gets input from the file instead of from the user Don’t get them confused: int n1 = 3Nums.txt.nextInt(); errors: illegal name/unknown name

25 Exercise Modify the previous program to read four numbers and print their sum 3Nums.txt actually has four numbers in it. Last value is a sentinel (see next slide)

26 Javadoc @throws Tag Add @throws tag to javadoc comment
says that this method throws an exception says what kind(s) of exception it throws says why it might be thrown /** * … FileNotFoundException if 3Nums.txt cannot be found */

27 Reading a Whole File Suppose list of numbers is in a file
How shall we read the whole list? ask user how many numbers in file? have file start with many numbers it has? end file with “sentinel” value? But even better: we can ask the Scanner it can check to see if there are more numbers!

28 Ask the Scanner Can ask Scanner if file has more data
hasNextInt(), hasNextDouble(), … fin = new Scanner(new File("3Nums.txt")); double sum = 0.0; while(fin.hasNextDouble()) { sum += fin.nextDouble(); } System.out.println("The sum of the #s in the file is " + sum);

29 The hasNext Family There’s a “hasNext” for each “next”
nextDouble  hasNextDouble will nextDouble work? nextInt  hasNextInt will nextInt work? next  hasNext nextLine  hasNextLine hasNext... just checks if it’s there you have to use next... to read it

30 Exercise Write a program fragment to open “MyEssay.txt” for input
count the number of words in it report the number of words to the user

31 File Output Just like file input, except:
use PrintWriter instead of Scanner imported from java.io, not java.util use print & println instead of next, nextInt, &c. just like System.out import java.io.PrintWriter; PrintWriter fout = new PrintWriter(new File("t.txt")); fout.println("..."); // print to t.txt

32 Exercise Modify the number summing program to send the output to the file Summary.txt

33 Problem We open the file for output We write the sum to the file
But when we look at the file, it’s empty! Why? Buffering! takes a long time to find the place to print, but then the printing itself is (relatively) fast PrintWriter saves up output till it has lots But if the program ends before it prints it out….

34 Closing Streams Need to tell the PrintWriter when you’re done printing stuff to the file so it knows to send what’s remaining to the file fout.close(); You should also close Scanners when you’re done with them frees up the file and system resources fin.close();

35 Output Files Start Empty
Output files get created if they didn’t already exist If an output file did already exist, its contents get erased once you open it (don’t need to print to it) If you want to add to the old file PrintWriter fout = new PrintWriter( new FileOutputStream("out.txt", true));

36 Reading File Names Can mix file and user i/o
e.g. ask user for the name of the file Scanner kbd = new Scanner(System.in); System.out.print("Enter name of file: "); String fileName = kbd.nextLine(); Scanner fin = new Scanner(new File(fileName)); int n1 = fin.nextInt(); Reads file name from user Reads int value from the named file

37 Exercise Revise the summing program to read the name of the file the numbers are in use 3Nums.txt, 100Nums.txt, 1000Nums.txt use a file that doesn’t exist. What happens? Revise it again to ask for the output file use a file that doesn’t already exist use a file that does already exist what happens?

38 Read and Save a File’s Data
When reading from a file, you often don’t know how many elements there will be use an ArrayList to store the data Loop until file ends, adding elements while (fin.hasNext()) { myWords.add(fin.next()); } reads all the words of that file into myWords don’t need to check for filled array

39 Reading All Numbers from a File
Loop until no more numbers remember to use wrapper class ArrayList<Double> myNumbers = new ArrayList<Double>(); Scanner fin = new Scanner(new File(fileName)); while (fin.hasNextDouble()) { myNumbers.add(fin.nextDouble()); } fin.close(); (still need to catch/declare FileNotFoundException)

40 Exercise Revise this code to read integer values instead of doubles
ArrayList<Double> myNumbers = new ArrayList<Double>(); Scanner fin = new Scanner(new File(fileName)); while (fin.hasNextDouble()) { myNumbers.add(fin.nextDouble()); } fin.close();

41 The File Class Why do we write “new File(…)”? Creating a File object
it’s not always a new file, after all! Creating a File object a program object to represent the file (remember, the Scanner/PrintWriter is for communicating with the file) actually just holds the name of the file, but… …it knows it’s supposed to be the name of a file

42 Yet Another Variable You can create a variable for the File
File f = new File(fileName); You can ask the File object about the file does this file exist? f.exists() can we read from it? f.canRead() can we write to it? f.canWrite() is it a folder/directory? f.isDirectory() and more these methods may throw SecurityExceptions, but they don’t need to be checked (they are RunTime Exceptions)

43 Getting a Readable File
Keep asking for file names until we get one that says it’s readable String fileName; File f; do { System.out.print("Enter a readable file name: "); fileName = kbd.nextLine(); f = new File(fileName); } while (!f.canRead());

44 But Still Need to Catch…
Knowing that a file is readable/writable doesn’t mean you can skip the try/catch file could get deleted between the time you ask if it’s readable and the time you try to create the Scanner/PrintWriter!

45 Catching FNFExn Can use a try-catch block, of course Questions:
} catch (FileNotFoundException fnf) { } Questions: Where to put it? What goes inside the try block?

46 File Not Found Exceptions
In file i/o we have FileNotFoundExceptions generated when try to create a Scanner or a PrintWriter What do we want to happen? end the program (gracefully!) give user another chance maybe after 3 chances end the program use a default file or value

47 End the Program Catch block should also print error message try {
System.out.print("Enter file name: "); Scanner fin = new Scanner(new File(fileName)); // read from the file using fin here fin.close(); } catch (FileNotFoundException fnf) { System.err.println("File not found. Quitting."); System.exit(1); Error message (just before System.exit) should be printed to System.err instead of System.out.

48 System.exit End the program Usually only need (0) and (1)
takes one argument: program return code System.exit(0)  everything finished fine System.exit(1)  something went wrong System.exit(2)  something (else) went wrong System.exit(3)  something (else else) ... Usually only need (0) and (1) otherwise NAME your return codes (final vars)

49 Exercise Revise this code to exit program if the file SecretPlanet.txt can’t be found public Planet ReadPlanetFromFile() throws FileNotFoundException { Scanner fin = new Scanner(new File("SecretPlanet.txt")); String aName = fin.nextLine(); int aCode = fin.nextInt(); double aDist = fin.nextDouble(); fin.close(); return new Planet(aName, aDist, aCode); }

50 Give User Another Chance
Print warning message and try again need a loop with try-catch block inside it Scanner fin = null; while (fin == null) { try { System.out.print("Enter file name: "); String name = kbd.nextLine(); fin = new Scanner(new File(name)); } catch (FileNotFoundException fnf) { System.out.println("Not found! Try again."); } // read from the file using fin down here

51 Scanner Declared Outside Loop
We will need the Scanner fin after the loop declare it before the loop  use it after declare in loop  can’t use it after same applies to try block! initialize fin to null means there is no Scanner here create new Scanner inside loop assign to fin if it works, fin will not be null (loop ends) if it doesn’t, fin will still be null (loop will continue)

52 Give Three Chances Use a count-controlled loop + break
Scanner fin = null; for (int i = 0; i < 3; i++) { try { System.out.print("Enter file name: "); fin = new Scanner(new File(kbd.nextLine())); break; // exit from the loop } catch (FileNotFoundException fnf) { System.out.println("Can't find that file!"); } if (fin == null) {System.exit(1);} // add error msg // read from the file using fin down here

53 Count Control + break For loop  user gets only 3 chances
try-catch in case user gives bad file name error message printed and loop continues if no exception continues in try-block body break command  loop ends (even if user hasn’t taken all three chances) Need to check after loop if fin is still null user took three chances, but no good file given print error message and exit program

54 Use a Default File If user’s named file doesn’t exist, use a name hard-coded into the program Scanner fin = null; try { System.out.print("Enter file name: "); fin = new Scanner(new File(kbd.nextLine())); } catch (FileNotFoundException fnf) { fin = new Scanner(new File("DefaultData.txt")); } // read from the file using fin down here

55 But What if That Doesn’t Work?
If can’t open default file, program will crash it’s not in a try block! So add the try block! it’s just fine! Scanner fin = null; try { System.out.print("Enter file name: "); fin = new Scanner(new File(kbd.nextLine())); } catch (FileNotFoundException fnf) { fin = new Scanner(new File("DefaultData.txt")); } catch(FileNotFoundException fnf) { System.exit(1); // add error message! }

56 Exercise Revise this code to return Earth (code = 0 and distance = 149.6) if file not found don’t open a different file; return a different Planet! public Planet ReadPlanetFromFile() throws FileNotFoundException { Scanner fin = new Scanner(new File("SecretPlanet.txt")); String aName = fin.nextLine(); int aCode = fin.nextInt(); double aDist = fin.nextDouble(); fin.close(); return new Planet(aName, aDist, aCode); }

57 Try with Resources Better way to open/close files
try (Scanner fin = new Scanner(chosenFile)) { } catch (FileNotFoundException fnf) { } fin automatically closed when try block ends ditto if try block throws a different exception which was a hidden bug in our earlier code!

58 Try with Multiple Resources
Separate resources with semi-colons: try (Scanner fin = new Scanner(inFile); PrintWriter fout = new PrintWriter(outFile)) { int sum = 0; while (fin.hasNextInt()) { sum += fin.nextInt(); } fout.println("Sum was " + sum); } catch (FileNotFoundException fnf) { System.err.println("File open error!");

59 Questions? Next week… review of course material
BRING QUESTIONS! optional extra topics (not on exam) suggestions for previews of next year


Download ppt "Text File Input & Output"

Similar presentations


Ads by Google