程序,不是编译通过就算结束了。各个包、类、接口、方法之间完全是根据彼此的契约来协作的。 假设程序是一台精密仪器,包、类、方法就是其大小不同的部件。说明书上说了,要#9螺丝,那就是#9螺丝,同样,要File,那就是File,不是像楼上想像的那样重写一个就完事的。假设 public class Fooooo { public Fooooo(File file) { ..... new FileInputStream(file); // 这个你怎么办,要知道,FileInput/OutputStream的关键代码都是native的,你怎么重写。 } }你要做的,不是跑来这里来问“怎么用钉子冒充#9螺丝”,你叫大家怎么回答。你应该去写那个接口的人商量,兄弟,我这里用#9螺丝有困难,换成#10(InputStream)或者用钉子(byte[])怎么样?如果没法商量,你只能和你领导商量,我这里只能用#9螺丝了,我尽量保证安全(比如使用临时文件、用完就删)
ByteArrayOutputStream等
为什么一定非要File类呢?
只要能达到缓冲效果,都是可以的
你可以自己定义一个类,把数据以字符形式放在类实例里面
这个类,至少有两个方法
一个是put,一个是toFile
平常数据都put到类实例,肯定是在内存了
需要的时候,再toFile
看来我也许需要借助流来重写File了
我需要这个File作为其他类的构造参数,还没有读源码,不清楚另外那个类究竟需要File的什么东西。。
看来只能重写File了。正在下Java源码
extends Object
implements Serializable, Comparable<File>
文件和目录路径名的抽象表示形式。你可以把内存映射成一个磁盘,这样这个文件就出现在“内存”中了。
不过为什么不能把文件写在磁盘里呢?用完在删掉不就好了
你不懂我不怪你,但来我的贴里乱喷是绝对不能忍的
由于别人提供的接口是个File,而我这边需要所有操作都在内存,两边接口对不上才来csdn发问,不是找你这种脑残喷子来的,请自重
内存操作果然是java的软肋么。。
2.限于对方接口的要求,你只好继承File了.那主要是看,对方用了File的什么方法.如果仅仅用了read.那你可以确定对方是菜鸟了,因为这种情况下,都是用InputStream作为接口参数的.就怕它用了getAbsolutePath() 之类,那你还给构造出一个虚拟的路径.
3.继承还是比较简单的,自己定义个字符数组或者字符串链表,依次实现方法就是了.一动手就能写出来.
假设程序是一台精密仪器,包、类、方法就是其大小不同的部件。说明书上说了,要#9螺丝,那就是#9螺丝,同样,要File,那就是File,不是像楼上想像的那样重写一个就完事的。假设
public class Fooooo {
public Fooooo(File file) {
..... new FileInputStream(file); // 这个你怎么办,要知道,FileInput/OutputStream的关键代码都是native的,你怎么重写。
}
}你要做的,不是跑来这里来问“怎么用钉子冒充#9螺丝”,你叫大家怎么回答。你应该去写那个接口的人商量,兄弟,我这里用#9螺丝有困难,换成#10(InputStream)或者用钉子(byte[])怎么样?如果没法商量,你只能和你领导商量,我这里只能用#9螺丝了,我尽量保证安全(比如使用临时文件、用完就删)
通过JNI完全可以做到!
存储系统是OS来管理的,java也是只是调用OS的API来调用OS提供的功能,所以你提到的File本来就是OS的文件系统维护的一段硬件存储(一般都是磁盘、软盘、U盘之类的)。
File在java管理的jvm中只是一些检索信息而已。文件实体并不是java能直接涉及的。
所以java要访问文件的内容,它得通过OS的API去检索硬件存储,并阅读存储中指定位置的字节流。这个过程就是将流读到内存中。楼主写过文件读取应该知道 byte buffer[]这个东西拉,把文件中所有的字节都读到内存无非就是读了一个很大的 byte fileContent[]。楼主想做到内存文件系统取代硬盘的功能,我很想知道是什么样的需求?缓存方法提速也是推荐使用内存、硬盘混合使用的。如果是做搜索引擎用来使用内存储存索引文件信息,但这个方面貌似人家是有现成的实现的。不过人家有人家的信息格式。内存本来就是珍贵的资源。
jdk里的类貌似不能够修改的,继承可以
有些人的回复实在是看不下去了。可能解决方法还是得用继承File或是JNI来处理了吧,我自己没解决,对于我,文件还是可以用的。祝楼主顺利找到解决方法了。
看了好多帖子,有这方面需求的人还不少。
内存文件在java中不能用File这个类,直接自己写一个数据结构,这个数据结构和文件中一样。
这样才可以满足一部分人的需求,像楼主的情况,要考虑继承File(还不知道能不能继承)了。好多人在这里乱叫啥,不懂别瞎叫,骂人算啥本事。
楼主是否有方案?求解答,求关照!
我给个例子说明楼主的需求,希望能对这个问题有所澄清。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的接口 (貌似不太现实吧)以上,我想就是楼主问题的具体需求。