一个面试问题:小内存如何查找大文件?

一天十小时 2012-10-26 06:38:57
前些面试碰到两个问题:

1. 一台电脑的内存只有512M,要从一个1G的文件中查找出某个字符,可以怎么做?


2. 客户A、管理员C。 A可以读取某个数据,但不能修改; C可以修改数据。 A在读取数据data1后,C可以对这个数据进行修改。 有什么方法可以使A读取的数据data1是最新的?
...全文
619 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
一天十小时 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
设置缓冲区
FileInputStream f=new FileInputStream(path);
FileChannel channel=f.getChannel();
MappedByteBuffer map=channel.map(FileChannel.MapMode.READ_ONLY,begin,length);
上面begin为long,表示在文件中的起始位置,length……
[/Quote]
这个貌似可以
zengt110 2012-10-28
  • 打赏
  • 举报
回复
我也不会,面试也遇到过这样的问题,希望有高手解答
wzfnju 2012-10-28
  • 打赏
  • 举报
回复
设置缓冲区
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再搞一遍。。。。。
snow-is-my-Love 2012-10-27
  • 打赏
  • 举报
回复
b/s,c/s?
一天十小时 2012-10-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
嘿嘿,数据结构里有个外存的查询,你参考一个
[/Quote]
逐行读取文件不行吗?
zhouhaiyangqq 2012-10-27
  • 打赏
  • 举报
回复
嘿嘿,数据结构里有个外存的查询,你参考一个
LiangGzone 2012-10-27
  • 打赏
  • 举报
回复
第一题,个人觉得,可以不可以调用缓冲区呢。
一天十小时 2012-10-27
  • 打赏
  • 举报
回复
wapigzhu 2012-10-26
  • 打赏
  • 举报
回复
另外第二个题是要考观察者模式?
wapigzhu 2012-10-26
  • 打赏
  • 举报
回复
最近正在看nio,第一个问题也许能回答

public static void main(String[] args) throws IOException {
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的
希望有经验的大大指正
qingqingcao22009 2012-10-26
  • 打赏
  • 举报
回复
这个题我笔试也遇到过,现在还不会
bad_liu 2012-10-26
  • 打赏
  • 举报
回复
同问。。等大神
ldq67123 2012-10-26
  • 打赏
  • 举报
回复
字符是几位的?目的是输出该字符有无还是位置?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧