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

Pet*_*ete 5 java file append

我是一名经验丰富的 C++ 人,正在学习 Java 并在此网站上度过了愉快的学习时光。最近,我对 Java 如何将一个文件附加到另一个文件进行了一些研究。假设我有两个文件。这是 C:\tmp\permFile.txt:

Line A:   abcef
Line B:   ghijk
Line C:   lmnop
Run Code Online (Sandbox Code Playgroud)

这是 C:\tmp\tmpFile.txt:

line 1:   1234567890
line 2:   0123456789
line 3:   9012345678
line 4:   8901234567
Run Code Online (Sandbox Code Playgroud)

这里的目标很简单;我想将 tmpFile.txt 附加到 permFile.txt 的末尾。我研究了代码来做到这一点,并认为我已经解决了问题。直到今天我才注意到运行代码后 permFile.txt 看起来像这样:

Line A:   abcef
Line B:   ghijk
Line C:   lmnop:   9012345678
line 4:   8901234567
Run Code Online (Sandbox Code Playgroud)

我认为这里发生的是 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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑我需要做的就是添加一行其中“点”的“出”的BufferedWriter到END permFile的,而不是开始。但是我这样做的尝试是灾难性的,不值得在此详述。另外,我不明白的是,如果在 permFile 的开头指向“out”,那么为什么 tmpFile 的内容不会覆盖所有 permFile。怀疑我犯了一个简单的菜鸟错误。

非常感谢!-P

PS - 无法告诉你我有多喜欢这个网站。我总是尝试研究自己的解决方案,但是当您遇到特定问题时,除了向真人寻求帮助外,别无他法。

brs*_*o05 2

只需在打印中添加换行符,例如:

out.write("\n" + str);
Run Code Online (Sandbox Code Playgroud)

这对我有用。方法运行后,perm 文件包含:

Line A:   abcef
Line B:   ghijk
Line C:   lmnop
line 1:   1234567890
line 2:   0123456789
line 3:   9012345678
line 4:   8901234567
Run Code Online (Sandbox Code Playgroud)