File IO and Recursion
Download
Report
Transcript File IO and Recursion
File IO and Recursion
CS0007: Introduction to Computer Programming
Review
The steps taken when reading or writing to a file:
Open the file.
Data is written or read from a file.
When the program is finished with the file, the file must be closed.
Two kinds of files in input and output:
Input File – File in which data is read from.
Output File – File in which data is written to.
The Java API provides a class for writing to a file called
PrintWriter.
The parameter supplied to the PrintWriter constructor is…
A filename
Review
Two methods used to write to a file:
print
println
Two classes needed to read from a file:
File
Scanner
Method that reads a single line from a file:
readLine
Method that detects if there is anything left in a file:
hasNext
Appending to a File
When you create a PrintWriter object by passing the file’s name as an argument to the
constructor, it will erase the contents of the file if it exists.
What can I do if I want to retain the text already in the file and add to the end of it?
Answer: You can append to the file
Appending means adding to the end.
You can append text to the end of a file by creating a FileWriter object and passing
it to the PrintWriter’s constructor:
FileWriter fwriter = new FileWriter("names.txt", true);
PrintWriter outputFile = new PrintWriter(fwriter);
Notes:
FileWriter throws an IOException, if you do the same steps for handling the
FileNotFoundException, but with IOException instead, you can handle
both the FileNotFoundException and the IOException.
The second argument for the FileWriter’s constructor indicates that you want to append
to the file
Example: Append.java
Specifying the File Path
When you give a file’s name as an argument, you can specify
the entire path to the file if you want it to be read or written
to a speciffic location.
For instance, if the path to a file on my desktop on the windows
machine in my office would be:
\\ad.cs.pitt.edu\Users\Users1\eth13\Desktop\myFile.txt
If I had to supply this as a parameter, what would be the problem?
o Answer: Windows uses backslashes as file separators. Strings in
Java uses backslashes to begin escape sequences.
o Solution: Java gives you the ability to replace all backslashes with
forward slashes.
• //ad.cs.pitt.edu/Users/Users1/eth13/Desktop/myFile.txt
Example: FilePath.java
Detecting Whether a File Exists
The File class has a method called exists that checks to see if
the file specified by the path already exists.
This can be used in both reading and writing to a file:
In reading, instead of having your program end abnormally with a
runtime error, you can display an error message.
Example: ReadExists.java
In writing, you can warn the user if she is about to overwrite an existing
file.
Example: WriteExists.java
Recursion
Recursion is the process of repeating something in a self-similar way.
The way this appears in programming is recursive methods.
A recursive method is a method that calls itself.
What is the problem with this: BadRecursion.java?
This method has no way of stopping the calls to itself, so it runs forever!
o What it needs is a base case.
• A base case is a condition in which the method stops calling itself.
So a recursive method has two parts:
A base case.
A recursive case (A case in which it calls itself)
Example: GoodRecursion.java
Usually, the number of recursive calls (depth of recursion) is dependent on
an argument passed to a method.
Each time a method is called, a new copy of the parameter is made for that method
call.
Recursion
Recursion is confusing…why does anyone use it?
Good Question! The fact of the matter is that all recursive problems can be solved iteratively (with
loops), and iterative solutions are often more efficient than recursive ones.
Answer: Some problems are easily defined a solved recursively.
If a problem can be broken down into successive smaller parts that are identical to the original problem, it is
often easy to think of their solutions as recursive ones.
o For example, consider factorial.
In general, a recursive method works like this:
If the problem can be solved now, without recursion, then the method solves it and returns the value.
If the problem, cannot be solved now, then the method reduces it to a smaller but similar problem
ands calls itself to solve the smaller problem.
The way you design a recursive method is to identify the recursive and base cases.
Now you try: Factorial.java
Many problems can be solved recursively:
Fibonacci Numbers
Fibonacci.java
Towers of Hanoi
Hanoi.java
HanoiDemo.java