java里就不能在内存中创建File对象么??

窝鹏偏逢连夜雪 2010-04-30 02:11:14
这个问题困扰我好久了,以前也来csdn上发过贴,没一个回答得靠谱的,我现在很郁闷
想知道有什么办法能让File直接写在内存里,不出现在硬盘上
如果不得不重写FIle类的话,也请各位大大们说得详细一点,究竟该怎么重写
拜托啦!!!
...全文
3243 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
clariones 2012-12-05
  • 打赏
  • 举报
回复
这么久了还没有答复。 我给个例子说明楼主的需求,希望能对这个问题有所澄清。 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的接口 (貌似不太现实吧) 以上,我想就是楼主问题的具体需求。
Diago2007 2012-07-04
  • 打赏
  • 举报
回复 2
楼主的需求是很合理的需求,确实在开发中会遇到这样的情况,我不明白的是楼主问这个问题惹到开始那几位什么地方了,让他们如此气急败坏,我们的技术社区是这样的风气,中文圈子的开发水平怎么上的去?
sdojqy1122 2011-12-19
  • 打赏
  • 举报
回复
偶也遇到了这样的问题,我想在内存中创建文件对象以及文件夹对象,为了提高一点性能,不想持久到磁盘上去!貌似Java里头真的没提供这个东西,哎~~~~~
楼主是否有方案?求解答,求关照!
yong_815 2011-09-17
  • 打赏
  • 举报
回复
楼主的问题有解决吗?在下也遇到同样的需求。求方案!
晴风 2011-05-20
  • 打赏
  • 举报
回复 2
我也在做这个东西,数据量很大的情况下,直接读磁盘文件实在不行,机器受不了,直接挂掉,而且速度比较慢。如果能把文件直接写到内存中,操作内存,这个速度比较快。
看了好多帖子,有这方面需求的人还不少。
内存文件在java中不能用File这个类,直接自己写一个数据结构,这个数据结构和文件中一样。
这样才可以满足一部分人的需求,像楼主的情况,要考虑继承File(还不知道能不能继承)了。

好多人在这里乱叫啥,不懂别瞎叫,骂人算啥本事。
eul 2010-10-20
  • 打赏
  • 举报
回复
没看懂问题不要乱回复。

今天在网上找java内存文件的资料,看到该帖,读过回帖后,只能用汗颜来形容!
有些人的回复实在是看不下去了。

可能解决方法还是得用继承File或是JNI来处理了吧,我自己没解决,对于我,文件还是可以用的。

祝楼主顺利找到解决方法了。
groovy2007 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 apeng_mm 的回复:]

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

呵呵,确实见过你
我需要这个File作为其他类的构造参数,还没有读源码,不清楚另外那个类究竟需要File的什么东西。。
看来只能重写File了。正在下Java源码。。。
[/Quote]
与其重写File类,不如重写使用File的那个类。
jdk里的类貌似不能够修改的,继承可以
ZHXDD 2010-05-08
  • 打赏
  • 举报
回复
不可能
舷Kelvin 2010-05-06
  • 打赏
  • 举报
回复
我本来也是建议暂存在硬盘上然后删掉,既然不行,那么最好还是把那边的参数类型换了,做出这种设计的家伙本身有问题了。java封装得挺严,本来是供大家使用方便的,你这么做是逆了java的本性而行啊。
shine333 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 huntor 的回复:]

Common VFS 支持内存虚拟文件系统。只不过提供的是FileObject接口
[/Quote]
第一次答复这个问题的时候就看过了VFS的API,答案是否定的,人家那是自己的FileObject。
gloomyfish 2010-05-06
  • 打赏
  • 举报
回复
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2044.html#Introduction
通过JNI完全可以做到!
huntor 2010-05-06
  • 打赏
  • 举报
回复
Common VFS 支持内存虚拟文件系统。只不过提供的是FileObject接口
shine333 2010-05-06
  • 打赏
  • 举报
回复
程序,不是编译通过就算结束了。各个包、类、接口、方法之间完全是根据彼此的契约来协作的。
假设程序是一台精密仪器,包、类、方法就是其大小不同的部件。说明书上说了,要#9螺丝,那就是#9螺丝,

同样,要File,那就是File,不是像楼上想像的那样重写一个就完事的。假设
public class Fooooo {
public Fooooo(File file) {
..... new FileInputStream(file); // 这个你怎么办,要知道,FileInput/OutputStream的关键代码都是native的,你怎么重写。
}
}


你要做的,不是跑来这里来问“怎么用钉子冒充#9螺丝”,你叫大家怎么回答。你应该去写那个接口的人商量,兄弟,我这里用#9螺丝有困难,换成#10(InputStream)或者用钉子(byte[])怎么样?如果没法商量,你只能和你领导商量,我这里只能用#9螺丝了,我尽量保证安全(比如使用临时文件、用完就删)
chenliuyang 2010-05-06
  • 打赏
  • 举报
回复
楼主这只能说明你面向对象思想不过关哦
非典型射手 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 shine333 的回复:]

程序,不是编译通过就算结束了。各个包、类、接口、方法之间完全是根据彼此的契约来协作的。
假设程序是一台精密仪器,包、类、方法就是其大小不同的部件。说明书上说了,要#9螺丝,那就是#9螺丝,

同样,要File,那就是File,不是像楼上想像的那样重写一个就完事的。假设
Java code
public class Fooooo {
public Fooooo(File file) ……
[/Quote]

你的例子太棒了。

LZ把你的需求说详细点吧,这样大家好帮你出主意
宁静-夏天 2010-05-06
  • 打赏
  • 举报
回复
楼主你对一些知识存在误区。
存储系统是OS来管理的,java也是只是调用OS的API来调用OS提供的功能,所以你提到的File本来就是OS的文件系统维护的一段硬件存储(一般都是磁盘、软盘、U盘之类的)。
File在java管理的jvm中只是一些检索信息而已。文件实体并不是java能直接涉及的。
所以java要访问文件的内容,它得通过OS的API去检索硬件存储,并阅读存储中指定位置的字节流。这个过程就是将流读到内存中。

楼主写过文件读取应该知道 byte buffer[]这个东西拉,把文件中所有的字节都读到内存无非就是读了一个很大的 byte fileContent[]。

楼主想做到内存文件系统取代硬盘的功能,我很想知道是什么样的需求?

缓存方法提速也是推荐使用内存、硬盘混合使用的。

如果是做搜索引擎用来使用内存储存索引文件信息,但这个方面貌似人家是有现成的实现的。不过人家有人家的信息格式。

内存本来就是珍贵的资源。

orangemike 2010-05-05
  • 打赏
  • 举报
回复
1.File :文件和目录路径名的抽象表示形式。人家的定义就是说File是表示文件或目录... 你非要人家变为内存中的一个映射,你自己觉得自己的要求合理么?
2.限于对方接口的要求,你只好继承File了.那主要是看,对方用了File的什么方法.如果仅仅用了read.那你可以确定对方是菜鸟了,因为这种情况下,都是用InputStream作为接口参数的.就怕它用了getAbsolutePath() 之类,那你还给构造出一个虚拟的路径.
3.继承还是比较简单的,自己定义个字符数组或者字符串链表,依次实现方法就是了.一动手就能写出来.
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shine333 的回复:]
> 这个问题困扰我好久了,以前也来csdn上发过贴,没一个回答得靠谱的
这是因为你的问题不靠谱!!!!!!!!!!但愿得,楼主能悬崖勒马,迷途知返。莫使得众网友,苦口婆心,磨破嘴皮,到头来,好良言劝了那该死的鬼。
[/Quote]
谢了,不过要是能勒马的话我早就勒了,也不至于到这里来提问了。
如果真的是我的问题不靠谱,请你说明缘由,请别在这里磨嘴皮
如果请教问题也算该死的话,你说你来这里顶贴算不算嘴贱?手贱?还是脑残?
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fangfang08250203guan 的回复:]
转换思路........................
[/Quote]
可是人家给我的接口是File型的。。我也是被逼无奈啊。。
内存操作果然是java的软肋么。。
  • 打赏
  • 举报
回复 1
[Quote=引用 10 楼 haohll1984 的回复:]
public class File
extends Object
implements Serializable, Comparable<File>
文件和目录路径名的抽象表示形式。

你可以把内存映射成一个磁盘,这样这个文件就出现在“内存”中了。
不过为什么不能把文件写在磁盘里呢?用完在删掉不就好了
[/Quote]
项目的安全性很强,不允许出现在硬盘上
加载更多回复(12)

62,621

社区成员

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

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