我需要在文本文件的开头写一些东西。我有一个包含内容的文本文件,我想在这个内容之前写一些东西。说我有;
下午好,先生,你今天怎么样
我很好,你好吗
谢谢你的提问,我是伟大的
修改后,我希望它是这样的:
第1页-第59页
2011年5月25日下午好,先生,你今天怎么样
我很好,你好吗
谢谢你的提问,我是伟大的
刚刚编好了内容:)我怎么能这样修改文本文件?
你真的不能用这种方式修改-文件系统通常不允许你在任意位置插入数据-但你可以:
- 创建新文件
- 给它写前缀
- 将数据从旧文件复制到新文件
- 将旧文件移动到备份位置
- 将新文件移动到旧文件的位置
- (可选)删除旧备份文件
这里是使用Apache Commons IO库为文件预换行的方法的完整源代码,以防对某人有用。该代码不会将整个文件读取到内存中,因此可以处理任何大小的文件。
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);
}
我认为您想要的是随机访问。查看相关的java教程。但是,我不相信您可以在文件中的任意点插入数据;如果我没有记错的话,你只会覆盖数据。如果你想插入,你必须有你的代码
- 复制块
- 用你的新东西覆盖
- 复制下一个块
- 用先前复制的块重写
- 返回到3,直到没有更多块
正如@atk所建议的,java.nio.channels.SeekableByteChannel
是一个很好的接口。但它仅从1.7起提供。
更新:如果您使用FileUtils没有问题,请使用
String fileString = FileUtils.readFileToString(file);
这不是这个问题的直接答案,但文件通常是通过InputStreams访问的。如果这是您的用例,那么您可以通过SequenceInputStream
链接输入流以获得相同的结果。例如
InputStream inputStream = new SequenceInputStream(new ByteArrayInputStream("my linen".getBytes()), new FileInputStream(new File("myfile.txt")));
我会把它留在这里,以防有人需要
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (FileInputStream fileInputStream1 = new FileInputStream(fileName1);
FileInputStream fileInputStream2 = new FileInputStream(fileName2)) {
while (fileInputStream2.available() > 0) {
byteArrayOutputStream.write(fileInputStream2.read());
}
while (fileInputStream1.available() > 0) {
byteArrayOutputStream.write(fileInputStream1.read());
}
}
try (FileOutputStream fileOutputStream = new FileOutputStream(fileName1)) {
byteArrayOutputStream.writeTo(fileOutputStream);
}