在Java中将一个文本文件的内容复制到另一个文本文件

Sal*_*man 7 java filereader filewriter

我试图将包含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();
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

命令提示符:-

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
Run Code Online (Sandbox Code Playgroud)

但是在检查代码时,我发现finally()块已正确关闭.

Lui*_*oza 28

finally不是finally():

try {
    //...
} catch(IOException e) {
    //...
} finally {
    //...
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你有一个无限循环:

int c=fr.read();
while(c!=-1) {
    fw.write(c);
}
Run Code Online (Sandbox Code Playgroud)

您必须读取循环内的数据才能完成:

int c=fr.read();
while(c!=-1) {
    fw.write(c);
    c = fr.read();
}
Run Code Online (Sandbox Code Playgroud)

finally块中,您frfw变量无法找到,因为它们是在try块的范围内声明的.在外面声明它们:

FileReader fr = null;
FileWriter fw = null;
try {
    //...
Run Code Online (Sandbox Code Playgroud)

现在,由于它们是使用nullvalue 初始化的,因此null在关闭它们之前还必须进行检查:

finally {
    if (fr != null) {
        fr.close();
    }
    if (fw != null) {
        fw.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且close两者都可以抛出的方法IOException也必须处理:

finally {
    if (fr != null) {
        try {
            fr.close();
        } catch(IOException e) {
            //...
        }
    }
    if (fw != null) {
        try {
            fw.close();
        } catch(IOException e) {
            //...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,由于您不希望有很多代码来关闭基本流,只需将其移动到一个处理a的方法中Closeable(注意两者FileReaderFileWriter实现此接口):

public static void close(Closeable stream) {
    try {
        if (stream != null) {
            stream.close();
        }
    } catch(IOException e) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您的代码应如下所示:

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) {
            //...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从Java 7开始,我们就可以了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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)