前些面试碰到两个问题:1. 一台电脑的内存只有512M,要从一个1G的文件中查找出某个字符,可以怎么做?
2. 客户A、管理员C。 A可以读取某个数据,但不能修改; C可以修改数据。 A在读取数据data1后,C可以对这个数据进行修改。 有什么方法可以使A读取的数据data1是最新的?

解决方案 »

  1.   

    最近正在看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的
    希望有经验的大大指正
      

  2.   

    设置缓冲区
    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再搞一遍。。