在Java文本文件的开头写入
我需要在文本文件的开头写点东西。我有一个包含内容的文本文件,我想在这个内容之前写一些东西。说我有 下午好,先生,今天好吗?在Java文本文件的开头写入,java,file,text,Java,File,Text,我需要在文本文件的开头写点东西。我有一个包含内容的文本文件,我想在这个内容之前写一些东西。说我有 下午好,先生,今天好吗? 我很好,你好吗? 谢谢你的邀请,我很好 修改后,我希望它是这样的: 第1页-场景59 2011年5月25日 下午好,先生,今天好吗? 我很好,你好吗? 谢谢你的邀请,我很好 刚编好内容:)我怎样才能这样修改文本文件?你不能这样修改它-文件系统通常不允许你在任意位置插入数据-但是你可以: 创建一个新文件 写上前缀 将数据从旧文件复制到新文件 将旧文件移动到备份位置 将新文件
我很好,你好吗?
谢谢你的邀请,我很好 修改后,我希望它是这样的: 第1页-场景59
2011年5月25日 下午好,先生,今天好吗?
我很好,你好吗?
谢谢你的邀请,我很好 刚编好内容:)我怎样才能这样修改文本文件?你不能这样修改它-文件系统通常不允许你在任意位置插入数据-但是你可以:
- 创建一个新文件
- 写上前缀
- 将数据从旧文件复制到新文件
- 将旧文件移动到备份位置
- 将新文件移动到旧文件的位置
- 可以选择删除旧备份文件
- 复制一个块
- 用你的新东西覆盖
- 复制下一个块
- 用以前复制的块覆盖
- 返回到3,直到没有更多的块
- 我想你想要的是随机访问。看看这本书。但是,我不相信您可以在文件中的任意点插入数据;如果我没记错的话,你只会覆盖数据。如果你想插入,你必须有你的代码
正如@atk所建议的,
java.nio.channels.seekablebytechnel
是一个很好的接口。但它仅从1.7版开始提供
更新:如果使用FileUtils没有问题,那么使用
String fileString = FileUtils.readFileToString(file);
这不是对这个问题的直接回答,但文件通常是通过InputStreams访问的。如果这是您的用例,那么您可以通过链接输入流来实现相同的结果。例如
InputStream inputStream = new SequenceInputStream(new ByteArrayInputStream("my line\n".getBytes()), new FileInputStream(new File("myfile.txt")));
为了以防万一,这里有一个方法的完整源代码,可以使用库将行预先添加到文件中。该代码不会将整个文件读入内存,因此可以处理任何大小的文件
public static void prependPrefix(File input, String prefix) throws IOException {
LineIterator li = FileUtils.lineIterator(input);
File tempFile = File.createTempFile("prependPrefix", ".tmp");
BufferedWriter w = new BufferedWriter(new FileWriter(tempFile));
try {
w.write(prefix);
while (li.hasNext()) {
w.write(li.next());
w.write("\n");
}
} finally {
IOUtils.closeQuietly(w);
LineIterator.closeQuietly(li);
}
FileUtils.deleteQuietly(input);
FileUtils.moveFile(tempFile, input);
}
@Turuko您首先必须标识的是分隔符。如果没有分隔符(无论是显式的还是隐式的),就无法实现目标。通过问自己这样一个问题,“我如何知道何时在对话框上方插入页面和场景标题?”更容易理解这一点。如果您无法确定您在文本文件中的位置,那么您就不能这样做。@Matthew:我看不出这一问题-它是在文本文件的最开始处写入一个固定的文本位。没有必要承认任何事情,至少就问题的提出而言。@Jon也许我误解了这个问题。我理解这个问题的意思是,“我有这个文本文件,我如何修改它以在整个文件的某些部分之间添加元数据”@Jon和@Turuko如果您只想在文件开头插入一次标题信息,那么您可以忽略我的评论=PSee:这看起来对我的问题是可行的。谢谢你的回答。非常感谢。我马上就开始。这是一个巨大的资源浪费过程吗?我正在寻找一种经济高效的实施方式。@Poutrathor:你说的“经济高效”到底是什么意思?(如果效率低下会带来实际成本,那么这与“高效”是一样的。)基本上,如果你想能够执行随机插入/删除,你可能不想将其存储为纯文本文件…@JonSkeet English不是我的强项,sry。我在一个硬件设备上工作(这个设备没有那么强大)。因此,我应该尝试实现对CPU和RAM负载要求较少的解决方案。文件操作可能很繁重,尤其是当我必须复制时。上下文:我希望以相反的时间显示日志:首先显示最后一个日志。我只看到两种方法:在文件顶部写入最后一个日志,从下到上读取文件。我不知道哪一个最好。因为这是一个开放的问题,我也不知道在哪里提问,所以我浏览了一下答案,以便自己找到:)@Poutrathor:在这种情况下,我肯定会实现向后读取文件。。。可能将文件分割成块(例如每小时新的日志文件)以使它更简单。随机访问通常允许你在任意点重写数据——而不是在文件中插入数据。乔恩,是的,我在评论的时候正在编辑我的回答: