java - 是否可以在不读取和写入整个文件(Java)的情况下更改 txt 文件中的一行?

标签 java file text replace line

假设我有一个文本文件:

I love bananas.
<age> 23 </age> years old.
I like beaches.

我只想打开所述文件并将年龄更改为 24 或 25。有什么方法可以在 Java 中执行此操作而无需读取和写入整个文件?我知道缓冲读取器和写入器是可能的,但是当文件变得很大时,我正在寻找一种内存密集度较低的方法。

最佳答案

简短的回答:没有。

长答案: 并不真地。如果您知道您插入的文本直接替换了您要删除的文本,您可以通过查找文件部分、读取一个小块、替换新文本并替换该 block 来执行替换。这适用于的年龄替换示例,但如果您将 9 替换为 10,或将 99 替换为 100,则无效。

但是,还有其他困难:

你可能有可变长度的行,所以你不知道去哪里寻找。您仍然需要读取文件直到您进行替换的地方,即使您一次执行一个 block 并丢弃不需要的内容也是如此。

使用像 UTF-8 这样的多字节字符集会更加复杂。您的传入文本可能显示为与传出文本相同的长度,但可能会更短或更长,具体取决于替换内容。

e (U+0065) 编码为一个字节,é (U+00E9) 编码为两个。

但是,如果您只是在寻找一种内存密集度较低的方法,您可以一次读取一个文件的一行,然后在处理它时将每一行写入一个新文件。完成后,删除旧文件并重命名新文件。这可能会很慢,因此将读取和写入缓冲到 20 行(或 100 行或 1000 行,或您选择的任何内容......)将提高性能。

关于java - 是否可以在不读取和写入整个文件(Java)的情况下更改 txt 文件中的一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631668/

相关文章:

Java 多线程性能提升

mysql - 使用 Rails 提取博客文章的 "preview"

Python libxml2 : querying xml using xpath

java - 异常处理错误

file - 多个磁盘读/写操作会导致瓶颈?

java - 如果少于 3 个条目,则用零填充列表

c# - 加载一定数量的文件而不是扫描并加载目录中的所有文件

python - 打开巨大的文本文件,unicode 问题

java - 解决 javax.net.ssl.SSLHandshakeException : sun. security.validator.ValidatorException : PKIX path building failed Error?

java - 安卓:java.text.ParseException:无法解析的日期