前些面试碰到两个问题:1. 一台电脑的内存只有512M,要从一个1G的文件中查找出某个字符,可以怎么做?
2. 客户A、管理员C。 A可以读取某个数据,但不能修改; C可以修改数据。 A在读取数据data1后,C可以对这个数据进行修改。 有什么方法可以使A读取的数据data1是最新的?
2. 客户A、管理员C。 A可以读取某个数据,但不能修改; C可以修改数据。 A在读取数据data1后,C可以对这个数据进行修改。 有什么方法可以使A读取的数据data1是最新的?
RandomAccessFile f = new RandomAccessFile("jdk-7u7-windows-x64.exe", "r");
FileChannel fileChannel = f.getChannel();
ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024);
long pos = 0;
while(pos < f.length()){
pos += fileChannel.read(buffer, pos);
buffer.flip();
CharBuffer cBuffer = buffer.asCharBuffer();
/*
* 这里可以处理读字符
*
*/
buffer.clear();
System.out.println(pos);
}
}这个是按自己对nio的理解写的,
我没找到太大的文本文件测试,随便找了个文件,这个文件有90M,可以设置Xmx20,
至少从打印的pos来看是没有OOM的
希望有经验的大大指正
FileInputStream f=new FileInputStream(path);
FileChannel channel=f.getChannel();
MappedByteBuffer map=channel.map(FileChannel.MapMode.READ_ONLY,begin,length);
上面begin为long,表示在文件中的起始位置,length表示缓冲长度,
合起来表示把位于path的文件中从begin开始的length字节缓冲到缓冲区
Charset charset=Charset.forName("UTF-8"); //设置编码方式
CharBuffer buffer=charset.decode(map); //字符序列译码
while(buffer.hasRemaining()){
char c=buffer.get(); //顺序读取
}
读完了改一改begin为begin+length再搞一遍。。