Java替换文本文件中的行

时间:2014-08-09 15:54:07

标签: java file-io

我从另一个问题中找到了这段代码

private void updateLine(String toUpdate, String updated) throws IOException {
    BufferedReader file = new BufferedReader(new FileReader(data));
    String line;
    String input = "";

    while ((line = file.readLine()) != null)
        input += line + "\n";

    input = input.replace(toUpdate, updated);

    FileOutputStream os = new FileOutputStream(data);
    os.write(input.getBytes());

    file.close();
    os.close();
}

这是我替换某些行之前的文件

example1
example2
example3

但是当我替换一行时,该文件现在看起来像这样

example1example2example3

当文件中有很多行时,无法读取文件。

如何编辑上面的代码以使我的文件在开始时看起来像什么?

3 个答案:

答案 0 :(得分:9)

使用System.lineSeparator()代替\n

while ((line = file.readLine()) != null)
    input += line + System.lineSeparator();

问题是在Unix系统上,行分隔符是\n,而在Windows系统上,它是\r\n

在早于Java 7的Java版本中,您必须使用System.getProperty("line.separator")代替。

正如评论中指出的那样,如果你担心内存使用情况,那么将整个输出存储在一个变量中是明智的,但是在你使用的循环中逐行写出来处理输入。

答案 1 :(得分:3)

如果你逐行阅读和修改,这有一个好处,你不需要将整个文件放在内存中。不确定在您的情况下这是否可行,但通常以流式传输为目标是一件好事。在你的情况下,这将除了连接字符串的需要,你不需要选择行终止符,因为你可以用println()编写每个单独的转换行。它需要写入不同的文件,这通常是一件好事,因为它是安全的。如果重写文件并中止,则会丢失数据。

private void updateLine(String toUpdate, String updated) throws IOException {
    BufferedReader file = new BufferedReader(new FileReader(data));
    PrintWriter writer = new PrintWriter(new File(data+".out"), "UTF-8");
    String line;

    while ((line = file.readLine()) != null)
    {
        line = line.replace(toUpdate, updated);
        writer.println(line);
    }
    file.close();
    if (writer.checkError())
        throw new IOException("cannot write");
    writer.close();
}

在这种情况下,它假定您只需要在完整的行上进行替换,而不是多行。我还添加了一个显式编码并使用了一个编写器,因为你有一个要输出的字符串。

答案 2 :(得分:1)

这是因为您使用OutputStream,它更适合处理二进制数据。尝试使用PrintWriter,不要在行尾添加任何行终止符。示例是here