我试图将一个包含2-3个整数(例如:1 2 3)的文本文件("1.txt")的内容复制到另一个文本文件("2.txt")中,但在编译时遇到以下错误
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();
}
}
}命令提示符:-
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但是在检查代码时,我发现finally()块被正确地关闭了。
发布于 2013-05-02 13:32:15
是finally,不是finally()
try {
//...
} catch(IOException e) {
//...
} finally {
//...
}顺便说一句,你有一个无尽的循环:
int c=fr.read();
while(c!=-1) {
fw.write(c);
}您必须读取循环中的数据才能使其完成:
int c=fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}在finally块中,找不到fr和fw变量,因为它们是在try块的作用域中声明的。在外部声明它们:
FileReader fr = null;
FileWriter fw = null;
try {
//...现在,因为它们是用null值初始化的,所以在关闭它们之前还必须执行null检查:
finally {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
}而且两者上的close方法都会抛出必须处理的IOException:
finally {
if (fr != null) {
try {
fr.close();
} catch(IOException e) {
//...
}
}
if (fw != null) {
try {
fw.close();
} catch(IOException e) {
//...
}
}
}最后,由于您不希望有很多代码来关闭基本流,因此只需将其移动到处理Closeable的方法中(请注意,FileReader和FileWriter都实现了此接口):
public static void close(Closeable stream) {
try {
if (stream != null) {
stream.close();
}
} catch(IOException e) {
//...
}
}最后,您的代码应该如下所示:
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) {
//...
}
}
}从Java7开始,我们就有了try-with-resources,所以上面的代码可以重写为:
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();
}
}
}发布于 2014-10-03 15:50:19
更有效的方法是...
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();
}
} 发布于 2013-05-02 13:32:34
这是一个编译错误
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 // finally doesn't accept any arguments like catch
{
fr.close();
fw.close();
}
}https://stackoverflow.com/questions/16330960
复制相似问题