【问题标题】:Appending One File to Another in Java - Why Does My Code Overwrite?在 Java 中将一个文件附加到另一个文件 - 为什么我的代码会覆盖?
【发布时间】:2015-01-23 21:21:44
【问题描述】:

我是一名经验适中的 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" 是编造的,否则这段代码将无法编译。您需要使用 \\. 转义字符串文字中的 \

标签: java file append


【解决方案1】:

在循环之前和每次迭代结束时添加 out.newline(); 即可。

out.newline();
while ((str = in.readLine()) != null) {
    out.write(str);
    out.newline();
}

同样是次要的挑剔,您应该在捕获异常时打印它们,否则它们会被忽视。

【讨论】:

  • 谢谢,这非常有帮助...!
【解决方案2】:

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

out.write("\n" + str);

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

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

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 2018-02-07
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多