Copying the Contents of One text file to Another in Java
filereader, filewriter, java
Solution
It's `finally`, not `finally()`:
try {
//...
} catch(IOException e) {
//...
} finally {
//...
}
By the way, you have an endless loop there:
int c=fr.read();
while(c!=-1) {
fw.write(c);
}
You must read the data inside the loop in order to let it finish:
int c=fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}
In the `finally` block, your `fr` and `fw` variables can't be found since they're declared in the scope of the `try` block. Declare them outside:
FileReader fr = null;
FileWriter fw = null;
try {
//...
Now, since they are initialized with `null` value, you must also do a `null` check before closing them:
finally {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
}
And the `close` method on both can throw `IOException` that must be handled as well:
finally {
if (fr != null) {
try {
fr.close();
} catch(IOException e) {
//...
}
}
if (fw != null) {
try {
fw.close();
} catch(IOException e) {
//...
}
}
}
In the end, since you don't want to have a lot of code to close a basic stream, just move it into a method that handles a `Closeable` (note that both `FileReader` and `FileWriter` implements this interface):
public static void close(Closeable stream) {
try {
if (stream != null) {
stream.close();
}
} catch(IOException e) {
//...
}
}
In the end, your code should look like:
import java.io.*;
class FileDemo {
public static void main(String args[]) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("1.txt");
fw = new FileWriter("2.txt");
int c = fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}
} catch(IOException e) {
e.printStackTrace();
} finally {
close(fr);
close(fw);
}
}
public static void close(Closeable stream) {
try {
if (stream != null) {
stream.close();
}
} catch(IOException e) {
//...
}
}
}
Since Java 7, we have `try-with-resources`, so code above could be rewritten like:
import java.io.*;
class FileDemo {
public static void main(String args[]) {
//this will close the resources automatically
//even if an exception rises
try (FileReader fr = new FileReader("1.txt");
FileWriter fw = new FileWriter("2.txt")) {
int c = fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
Problem
I am trying to copy the contents of one text file ("1.txt") which contains 2-3 integer numbers (ex: 1 2 3) to another text file ("2.txt") but I am getting the following error upon compilation ``` import java.io.*; class FileDemo { public static void main(String args[]) { try { FileReader fr=new FileReader("1.txt"); FileWriter fw=new FileWriter("2.txt"); int c=fr.read(); while(c!=-1) { fw.write(c); } } catch(IOException e) { System.out.println(e); } finally() { fr.close(); fw.close(); } } } ``` Command prompt:- ``` C:\Documents and Settings\Salman\Desktop>javac FileDemo.java FileDemo.java:20: error: '{' expected finally() ^ FileDemo.java:20: error: illegal start of expression finally() ^ FileDemo.java:20: error: ';' expected finally() ^ FileDemo.java:27: error: reached end of file while parsing } ^ 4 errors ``` But upon checking the code, I find that the finally() block is properly closed.