首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中将一个文本文件的内容复制到另一个文本文件

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

Stack Overflow用户
提问于 2013-05-02 13:30:45
回答 9查看 76.5K关注 0票数 7

我试图将一个包含2-3个整数(例如:1 2 3)的文本文件("1.txt")的内容复制到另一个文本文件("2.txt")中,但在编译时遇到以下错误

代码语言:javascript
复制
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();
      }
    }
}

命令提示符:-

代码语言:javascript
复制
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()块被正确地关闭了。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-05-02 13:32:15

finally,不是finally()

代码语言:javascript
复制
try {
    //...
} catch(IOException e) {
    //...
} finally {
    //...
}

顺便说一句,你有一个无尽的循环:

代码语言:javascript
复制
int c=fr.read();
while(c!=-1) {
    fw.write(c);
}

您必须读取循环中的数据才能使其完成:

代码语言:javascript
复制
int c=fr.read();
while(c!=-1) {
    fw.write(c);
    c = fr.read();
}

finally块中,找不到frfw变量,因为它们是在try块的作用域中声明的。在外部声明它们:

代码语言:javascript
复制
FileReader fr = null;
FileWriter fw = null;
try {
    //...

现在,因为它们是用null值初始化的,所以在关闭它们之前还必须执行null检查:

代码语言:javascript
复制
finally {
    if (fr != null) {
        fr.close();
    }
    if (fw != null) {
        fw.close();
    }
}

而且两者上的close方法都会抛出必须处理的IOException

代码语言:javascript
复制
finally {
    if (fr != null) {
        try {
            fr.close();
        } catch(IOException e) {
            //...
        }
    }
    if (fw != null) {
        try {
            fw.close();
        } catch(IOException e) {
            //...
        }
    }
}

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

代码语言:javascript
复制
public static void close(Closeable stream) {
    try {
        if (stream != null) {
            stream.close();
        }
    } catch(IOException e) {
        //...
    }
}

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

代码语言:javascript
复制
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,所以上面的代码可以重写为:

代码语言:javascript
复制
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();
        }
    }
}
票数 30
EN

Stack Overflow用户

发布于 2014-10-03 15:50:19

更有效的方法是...

代码语言:javascript
复制
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();
}
} 
票数 4
EN

Stack Overflow用户

发布于 2013-05-02 13:32:34

这是一个编译错误

代码语言:javascript
复制
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();
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16330960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档