Java中将一个文件附加到另一个文件 - 为什么我的代码会覆盖?

5

我是一名有一定C ++经验的人,正在学习Java,并且在这个网站上学习非常愉快。 最近,我进行了一些关于如何将一个文件附加到另一个文件的Java研究。 假设我有两个文件。 这里是C:\ tmp \ permFile.txt:

Line A:   abcef
Line B:   ghijk
Line C:   lmnop

这里是C:\tmp\tmpFile.txt:

line 1:   1234567890
line 2:   0123456789
line 3:   9012345678
line 4:   8901234567

这里的目标很简单:我想要将tmpFile.txt追加到permFile.txt的末尾。我查阅了相关代码,认为我已经解决了这个问题。只是今天我注意到运行代码后,permFile.txt看起来像这样:

Line A:   abcef
Line B:   ghijk
Line C:   lmnop:   9012345678
line 4:   8901234567

我认为这里发生的情况是permFile有48个字符(每行16个字符)。我的代码在tmpFile中准确地计算了48个字符,并从第49个字符开始追加。很奇怪,对吧?

下面是代码:

import java.io.*;

public class myProgram {
   public static void main(String[] args) throws IOException {

      // Define two filenames:
      String permFile = "C:\tmp\permFile.txt";
      String tmpFile =  "C:\tmp\tmpFile.txt";

      appendFiles appender = new appendFiles(permFile, tmpFile);
      }
}

public class appendFiles {
    public static void appendFiles(String permFile, String tmpFile) throws IOException {
    // Appends file "tmpFile" to the end of "permFile"
    // Code adapted from:  https://www.daniweb.com/software-development/java/threads/44508/appending-two-java-text-files

        try {
        // create a writer for permFile
        BufferedWriter out = new BufferedWriter(new FileWriter(permFile, true));
        // create a reader for tmpFile
        BufferedReader in = new BufferedReader(new FileReader(tmpFile));
        String str;
        while ((str = in.readLine()) != null) {
            out.write(str);
            }
        in.close();
        out.close();
        } catch (IOException e) {
        }
    }
}

我怀疑我需要做的是添加一行代码,将“out” BufferedWriter 指向 permFile 的 END 而不是开头。但是我的尝试都很失败,这里不值得详细说明。另外,如果“out”指向 permFile 开头,为什么 tmpFile 的内容不会覆盖 permFile 的所有内容,这一点我不明白。我怀疑我犯了一个简单的新手错误。

非常感谢!-P

PS - 无法形容我有多喜欢这个网站。我总是尝试自己研究解决方案,但当遇到特定问题时,向真正的人寻求帮助是无可替代的。


我猜测"C:\tmp\permFile.txt"是虚构的,否则这段代码无法编译。你需要使用\转义字符串字面值中的\。 - toddlermenot
2个回答

2
只需在您的打印语句中添加一个换行符,如下所示:
out.write("\n" + str);

这对我很有帮助。 perm 文件包含在方法运行后的内容:

Line A:   abcef
Line B:   ghijk
Line C:   lmnop
line 1:   1234567890
line 2:   0123456789
line 3:   9012345678
line 4:   8901234567

1
在循环之前和每次迭代结束时添加out.newline();,它就可以工作了。
out.newline();
while ((str = in.readLine()) != null) {
    out.write(str);
    out.newline();
}

此外,小小的建议,当你捕获异常时应该打印出来,否则它们将不会被注意到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接