【问题标题】:Writing something to a text file at a specific point Java在特定点向文本文件写入内容 Java
【发布时间】:2014-04-05 01:12:24
【问题描述】:

所以我想在文本文件的特定点写一个字符串。应该很容易,但这是我第一次使用 BufferedWriter 类。我的来源如下:

public static String readFile(String fileName) throws IOException {
    String toReturn = "";
    BufferedReader br = null;

    try {
        String sCurrentLine;
        br = new BufferedReader(new FileReader("test.txt"));
        while ((sCurrentLine = br.readLine()) != null) {
            toReturn = toReturn+"\n"+sCurrentLine;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return toReturn;
}

public static void addAfter(String toAdd, char after, String fileName) throws IOException {
    String file = readFile(fileName);
    int length = file.length();
    char[] chr = file.toCharArray();
    boolean pos[] = new boolean[length];
    for(int i = 0; i < length; i++) {
        if(chr[i] == after) {
            pos[i] = true;
        }
    }

    BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true));
}

我想使用 BufferedWriter 类将 String toAdd 添加到位置 i。我将如何跳转到所需的点并写入 toAdd?

提前致谢

【问题讨论】:

  • RandomAccessFile 具有跳转到文件中特定字节的方法。我认为方法是skipBytes() 或类似的东西。但是,如果您尝试插入文本,这将有点棘手,因为默认情况下,文件 IO 是作为覆盖完成的。您需要做的是从那时起读取原始文件并附加它。
  • 要做到这一点,我认为你必须将文件的内容读入一个字符串,用你的编辑创建一个新的字符串,然后用你的新字符串覆盖文件。见stackoverflow.com/questions/3935791/…
  • @ktm5124 感谢您的链接,我使用了与那里描述的方法类似的方法

标签: java file text bufferedreader bufferedwriter


【解决方案1】:

一种方法是将整个文本文件读入内存,修改/替换要插入的行,然后将字符串写回文本文件,覆盖源文件。

一种更安全的方法是改为写入第二个文件,然后在完成保存输出后,删除源文件并将输出文件重命名为源文件的名称。如果由于某种原因写入过程引发异常,这将防止损坏数据。

【讨论】:

    【解决方案2】:

    正如 CodeChimp 在对您的问题的评论中指出的那样,插入后的所有文本都必须重写到文件中。因此,您最好的解决方案是打开一个新的临时文件,读取原始文件并将文本复制到新文件直到插入点,将新文本写入新文件,复制旧文件的其余部分,关闭两个文件,删除原文件,重命名新文件。或者,将原文件重命名为临时文件名,以待修改文件的原名新建一个空文件,执行与上述相同的复制和插入过程,然后删除重命名的原文件。您选择的两个选项中的哪一个将取决于错误处理以及是否使用锁来控制并发访问。

    【讨论】:

    • 使用索引文件格式,插入可能效率更高,但文本文件不是索引文件的一种形式。正如其他几个人所建议的那样,另一个可能更有效的选择是跳过临时文件并将原始文件读入内存,在需要的位置插入新文本,然后在之前完成将原始文件内容添加到缓冲区的末尾将所有内容写回原始文件。但是,这在很大程度上取决于要更新的​​文件的大小,并且可能不会比我建议的相对简单的方法更有效。
    • @Ned_Nowotny 我最终使用了搜索和替换选项。无需创建/删除文件
    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 2011-05-20
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2015-06-15
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多