Copying the Contents of One text file to Another in Java
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();
}
}
}
More efficient way is...
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File(".");
String source = dir.getCanonicalPath() + File.separator + "Code.txt";
String dest = dir.getCanonicalPath() + File.separator + "Dest.txt";
File fin = new File(source);
FileInputStream fis = new FileInputStream(fin);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
FileWriter fstream = new FileWriter(dest, true);
BufferedWriter out = new BufferedWriter(fstream);
String aLine = null;
while ((aLine = in.readLine()) != null) {
//Process each line and add output to Dest.txt file
out.write(aLine);
out.newLine();
}
// do not forget to close the buffer reader
in.close();
// close buffer writer
out.close();
}
}