这一次我们着重来讨论如何用NIO来修改较大文件里的内容。如果是较小的文件,利用传统IO来进行修改并不难,思路是:
(1)使用输入流读出文件内容。
(2)读的过程中判断符合替换条件的内容。
(3)如果符合,把这些内容写入到输出流,这个输出流最后会写入文件的原始位置。
其实这个过程相当于重新写了一份文件,然后将原来的文件替换掉。然后在替换的过程中,去处理数据。
但是一旦文件较大,而且改动又很小,这种模式其实是十分浪费资源的。比如说我要把一个较大文件里的所有某种所有字符,修改为另一种字符。有没有一种方法能够边读边换呢?
我们先把整体的框架写出来:
/**
* 利用NIO替换大文件内容。
*/
public class NIOFileContentReplace {
public static void main(String[] args) {
//创建channel对象
try(FileChannel channel = FileChannel.open(Paths.get("f:/test.txt"), StandardOpenOption.READ,StandardOpenOption.WRITE);) {
//读取文件内容,读取buffer
ByteBuffer buffer = ByteBuffer.allocate(4);
int flag = channel.read(buffer);
while(-1 != flag) {
buffer.flip();
//替换内容
//写回文件
buffer.clear();
flag = channel.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();