这个问题困扰我好久了,以前也来csdn上发过贴,没一个回答得靠谱的,我现在很郁闷
想知道有什么办法能让File直接写在内存里,不出现在硬盘上
如果不得不重写FIle类的话,也请各位大大们说得详细一点,究竟该怎么重写
拜托啦!!!

解决方案 »

  1.   

    为什么要这种需求?看样子你只是需要一个内存中的流而已,StringWriter
    ByteArrayOutputStream等
      

  2.   

    楼主,可能有点钻牛角尖了
    为什么一定非要File类呢?
    只要能达到缓冲效果,都是可以的
    你可以自己定义一个类,把数据以字符形式放在类实例里面
    这个类,至少有两个方法
    一个是put,一个是toFile
    平常数据都put到类实例,肯定是在内存了
    需要的时候,再toFile
      

  3.   

    好像回答过lz的问题,显然被认为不靠谱了。你可以把具体的接口都说一下,比如要读的一方具体要用什么方式读取,然后了解java哪些事情能做哪些不能做
      

  4.   

    不是流,我需要对象,File对象,而且是在内存里的有内容的File
    看来我也许需要借助流来重写File了
      

  5.   

    我需要File是因为要将它作为其他类的构造参数,没有File就没法使用其他类
      

  6.   

    呵呵,确实见过你
    我需要这个File作为其他类的构造参数,还没有读源码,不清楚另外那个类究竟需要File的什么东西。。
    看来只能重写File了。正在下Java源码
      

  7.   

    public class File
    extends Object
    implements Serializable, Comparable<File>
    文件和目录路径名的抽象表示形式。你可以把内存映射成一个磁盘,这样这个文件就出现在“内存”中了。
    不过为什么不能把文件写在磁盘里呢?用完在删掉不就好了
      

  8.   

    不回答问题就别来捣乱好么?
    你不懂我不怪你,但来我的贴里乱喷是绝对不能忍的
    由于别人提供的接口是个File,而我这边需要所有操作都在内存,两边接口对不上才来csdn发问,不是找你这种脑残喷子来的,请自重
      

  9.   

    可是人家给我的接口是File型的。。我也是被逼无奈啊。。
    内存操作果然是java的软肋么。。
      

  10.   

    1.File :文件和目录路径名的抽象表示形式。人家的定义就是说File是表示文件或目录... 你非要人家变为内存中的一个映射,你自己觉得自己的要求合理么?
    2.限于对方接口的要求,你只好继承File了.那主要是看,对方用了File的什么方法.如果仅仅用了read.那你可以确定对方是菜鸟了,因为这种情况下,都是用InputStream作为接口参数的.就怕它用了getAbsolutePath() 之类,那你还给构造出一个虚拟的路径.
    3.继承还是比较简单的,自己定义个字符数组或者字符串链表,依次实现方法就是了.一动手就能写出来.
      

  11.   

    程序,不是编译通过就算结束了。各个包、类、接口、方法之间完全是根据彼此的契约来协作的。
    假设程序是一台精密仪器,包、类、方法就是其大小不同的部件。说明书上说了,要#9螺丝,那就是#9螺丝,同样,要File,那就是File,不是像楼上想像的那样重写一个就完事的。假设
    public class Fooooo {
      public Fooooo(File file) {
         ..... new FileInputStream(file); // 这个你怎么办,要知道,FileInput/OutputStream的关键代码都是native的,你怎么重写。
      }
    }你要做的,不是跑来这里来问“怎么用钉子冒充#9螺丝”,你叫大家怎么回答。你应该去写那个接口的人商量,兄弟,我这里用#9螺丝有困难,换成#10(InputStream)或者用钉子(byte[])怎么样?如果没法商量,你只能和你领导商量,我这里只能用#9螺丝了,我尽量保证安全(比如使用临时文件、用完就删)
      

  12.   

    Common VFS 支持内存虚拟文件系统。只不过提供的是FileObject接口
      

  13.   

    第一次答复这个问题的时候就看过了VFS的API,答案是否定的,人家那是自己的FileObject。
      

  14.   

    我本来也是建议暂存在硬盘上然后删掉,既然不行,那么最好还是把那边的参数类型换了,做出这种设计的家伙本身有问题了。java封装得挺严,本来是供大家使用方便的,你这么做是逆了java的本性而行啊。
      

  15.   

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2044.html#Introduction
    通过JNI完全可以做到!
      

  16.   

      楼主你对一些知识存在误区。
      存储系统是OS来管理的,java也是只是调用OS的API来调用OS提供的功能,所以你提到的File本来就是OS的文件系统维护的一段硬件存储(一般都是磁盘、软盘、U盘之类的)。
      File在java管理的jvm中只是一些检索信息而已。文件实体并不是java能直接涉及的。
    所以java要访问文件的内容,它得通过OS的API去检索硬件存储,并阅读存储中指定位置的字节流。这个过程就是将流读到内存中。楼主写过文件读取应该知道 byte buffer[]这个东西拉,把文件中所有的字节都读到内存无非就是读了一个很大的 byte fileContent[]。楼主想做到内存文件系统取代硬盘的功能,我很想知道是什么样的需求?缓存方法提速也是推荐使用内存、硬盘混合使用的。如果是做搜索引擎用来使用内存储存索引文件信息,但这个方面貌似人家是有现成的实现的。不过人家有人家的信息格式。内存本来就是珍贵的资源。
      

  17.   

    与其重写File类,不如重写使用File的那个类。
    jdk里的类貌似不能够修改的,继承可以
      

  18.   

    没看懂问题不要乱回复。今天在网上找java内存文件的资料,看到该帖,读过回帖后,只能用汗颜来形容!
    有些人的回复实在是看不下去了。可能解决方法还是得用继承File或是JNI来处理了吧,我自己没解决,对于我,文件还是可以用的。祝楼主顺利找到解决方法了。
      

  19.   

    我也在做这个东西,数据量很大的情况下,直接读磁盘文件实在不行,机器受不了,直接挂掉,而且速度比较慢。如果能把文件直接写到内存中,操作内存,这个速度比较快。
    看了好多帖子,有这方面需求的人还不少。
    内存文件在java中不能用File这个类,直接自己写一个数据结构,这个数据结构和文件中一样。
    这样才可以满足一部分人的需求,像楼主的情况,要考虑继承File(还不知道能不能继承)了。好多人在这里乱叫啥,不懂别瞎叫,骂人算啥本事。
      

  20.   

    偶也遇到了这样的问题,我想在内存中创建文件对象以及文件夹对象,为了提高一点性能,不想持久到磁盘上去!貌似Java里头真的没提供这个东西,哎~~~~~
    楼主是否有方案?求解答,求关照!
      

  21.   

    这么久了还没有答复。
    我给个例子说明楼主的需求,希望能对这个问题有所澄清。1. 我在处理一个非常巨大的ZIP文件;
    2. 这个ZIP文件里还有EAR,WAR,JAR等常见的压缩文件;
    3. 这个ZIP包是客户需要的,客户和我们之间通过网络连接,网速你可以认为是100KB(已经够快了,不要提解决方案是 增加网络带宽)
    4. 一个完整的ZIP包有6~10G (事实如此,商业应用有很多资源)
    5. 现在的要求是,除了第一次没办法只好通过全部传输以外,以后希望能够增量的只发送给客户两个版本的ZIP包之间的差异部分。 ZIP包里的ZIP资源也要解压,例如有JAR文件改了一个类的,就发一个JAR,但是里面只有这个类过去。JAVA的 ZIFile的构造函数是File接口的,为了比较两个ZIP包 (ZIP不是我们做的,我们只负责分发)的内容,我们要用JDK ZIPFile来获取各个entry,比较CRC,到此为止OK。 然后是ZIP里的ZIP包,用ZIPFile得到的Entry你只能得到inputStream,如何继续分析这个Entry里的内容? 如果ZIPFile有一个InputStream做参数的接口,那就没问题了,但是没有。
    解决方法1:把inputStream存磁盘上 (可以做,但是会很慢,两遍IO,如果里面还有一层,就更慢了)
    解决方法2:集成ZIPFile (很不幸,里面有native方法,没那么方便)
    解决方法3:构造内存文件 (JAVA支持么?貌似这个就是楼主的问题吧)
    解决方法4:和Sun(Oracle)沟通,让他们提供InputStream的接口 (貌似不太现实吧)以上,我想就是楼主问题的具体需求。