一个2G的文本文件,要求不使用中间临时文件,如何实现所有内容的完全颠倒?(行也颠倒过来,每行字符都颠倒过来)比如文件内容如下:abcde
12345
你们好实现内容完全颠倒后:好们你
54321
edcba不使用中间文件,就是说只能在内存中读写该文件,但是文件有2G,超过一般内存。如何实现之?请使用Java或C++解答。谢谢!

解决方案 »

  1.   

    用RandomAccessFile直接seek到文件尾开始往前读。
      

  2.   

    我突然想到二楼说的倒着读是什么意思了,做个循环,逐字节读取。但是这样没有考虑到内存的。2G的文件不能全部先读到内存,然后一次写入文件的。我个人的思路是每行作为一个字符串实现颠倒(比如abcd -> dcba),这个我已经能实现了。然后实现行交换,比如1行和n行交换,2行和n-1行交换...,但是我没能搞定。求教!
      

  3.   

    shenpipi(皮皮)我不是懒,而是二楼说的没实现要求,所以一时发蒙没明白。呵呵
      

  4.   

    先不考虑双字节字问题,假设全是单字节文字:
    RandomAccessFile raf = new RandomAccessFile("C:\\big.txt","r");
    long fLen = raf.length();
    for (long n=fLen-1; n>=0; n--) {
        raf.seek(n);
        byte b = raf.readByte();
        // write b to new file
    }上面是基本方式,然后你还要考虑双字节问题,以及效率问题(按buffer读,不一个个byte读)。
    如此。明白了没?
      

  5.   

    楼主,你是真糊涂了吧?
    谁让你从文件末尾倒着一次把文件读到内存中的?你不会读一个字节写一个字节吗?
    当然,要想提高效率肯定要使用buffer的,这点楼上很有经验,但是,对于java来说,是没有必要考虑双字节字符问题的,嘿嘿,楼主又可以省事了。
      

  6.   

    皮皮,
        我的确糊涂了。边读边写(因为是同一个文件),用randomAccessFile指针要跳来跳去?
    期待有更好的方法。
      

  7.   

    不过同一个文件以上方法也能实现,指针确实要象你说的那样跳来跳去了。把buffer定义的大一点就是了。
      

  8.   

    "rw"方式打开,然后从两头开始,分别读一段到内存,颠倒内存内容后换位写入,不断循环直到在文件中间会合。
    估计还是得考虑双字节问题。
    反正就是seek来seek去了。
    不知道同时开2个RandomAccessFile,2者同时读写一个文件会不会有lock问题。自己试试看吧。
      

  9.   

    调用操作系统API,映射到内存,再颠倒。具体实现,我不会……
      

  10.   

    <windows核心编程>里有这样的例子,他的调用windows的api  跟楼主的要求一样
      

  11.   

    同意楼上的,在windows下最好的最有效的办法就是使用file map
      

  12.   

    使用内存映射文件,把文件映射成可以操作的内存地址,再按照字符串进行操作就可以了。完全不需要缓冲区,不要临时文件。--------------------------
    国内专业的ACE网络编程、开发论坛开通:
    www.acejoy.com 
    www.acedevelop.com
    涉及ACE使用和开发,中间件、服务器端软件的设计,P2P技术,
    socket网络编程、应用开发等内容。
    欢迎加入,大家一起交流、学习成长!
      

  13.   

    hehe ,楼上说的好
    真么大的文本,一个好算法是很重要的
      

  14.   

    建议用内存映射文件,否则这么大的文本文件,根本打不开!═══════════════════
     免费的源码、工具网站,欢迎大家访问!
     http://www.j2soft.cn/
    ═══════════════════
      

  15.   

    啊,my god,2G
    还没试过能不能打开
    估计倒成了,也不知道有没有成功
      

  16.   

    新建个临时文件,用RandomAccessFile直接seek到文件尾,按行写倒临时文件,倒读完后,删除此文件,把临时文件改名为此文件
      

  17.   

    新建个临时文件,用RandomAccessFile直接seek到文件尾,按行写倒临时文件,倒读完后,删除此文件,把临时文件改名为此文件
    ------------------------
    要求不使用临时文件的
    要不然谁都会了
      

  18.   

    开2个线程,第一个线程从文件头读取buf个字符,然后对buf做颠倒,这个楼主已经实现,颠倒完成后往文件尾前buf个字符的地方开始写。另一个线程从文件尾读取buf个字符,然后颠倒,颠倒完成写文件头。这个要注意的是线程同步问题,在线程1/2未完成字符读取的时候,线程2/1不能写文件。就这两个线程交替,直到转换完
      

  19.   

    本人 的 想法和gongzhy(2369) 的相同
      

  20.   

    1.4新增的NEWIO里面有操作大文件的类,比如RandomAccessFile,建议楼主看看文档应该不能解决
      

  21.   

    这个的确要用到内存映射文件来处理,在《windows核心编程》里面找到答案了。凡是提到这个的都可以得分。比较遗憾的是我说了那么多,很多朋友没有看懂题目就开始回答问题,呵呵,希望大家都有所提高。
      

  22.   

    读到内存里面,不大可能(做虚拟内存太慢了)利用块排序处理我觉得比较可能,关键看你的cpu如何,呵呵!
    这样不管是c++还是java都很好做到,要知道jvm会爆的
      

  23.   

    这个的确要用到内存映射文件来处理,在《windows核心编程》里面找到答案了。凡是提到这个的都可以得分。比较遗憾的是我说了那么多,很多朋友没有看懂题目就开始回答问题,呵呵,希望大家都有所提高。你是用JAVA的么,用JAVA还用WINDOWS核心编程的东西么?用那个还到JAVA问干吗啊
      

  24.   

    我晕,楼主去看看Thinking Java中的IO部分吧。
    里面的 内存映射文件 就可以满足楼主的要求。