RandomAccessFile能否读写序列化类

smartcatiboy 2009-11-23 07:56:17
RandomAccessFile能否读写序列化类??

比方我seek到某处,然后writeObject,或者readObject??

api里没有此类函数,但是技术上应该不难啊???

或者有么有类似功能可以代替??
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartcatiboy 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jiangnaisong 的回复:]
引用 2 楼 smartcatiboy 的回复:
我有一个很大的记录,每条是一个类,需要随机读取

如果用Collection <class implements ISerializable >来做,好像要读取全部文件。

有没有速度快,任意抽取一条的办法???




原来是这样。RandomAccessFile其实就是将文件看成是一个巨大无比的“虚拟字节数组”而已,从而通过RandomAccessFile.seek达到随机读写的目的(写只能是与添加,不能插入)。
因此:方法之一:一个很大的记录,每条是一个类,做成一个对象数组,对这个数组进行随机处理。
方法之二:若一定要通过文件来随机读、写,且最好是RandomAccessFile,也简单,不要使用对象序列化,而是将“一个很大的记录,每条是一个类”当中这个每条是类对象,做成一个值对象(即:将该对象的真正的状态--对象中的值你自己转成你规定的格式--如:统一是由20个字节),这样你自己通过RandomAccessFile.seek就可以随机读、写了。这个肯定是可以的。我就这样做过随机的两维点的处理。

[/Quote]

结帖以后还能帮忙回复,非常感谢。有大致方向就好办多了。
云上飞翔 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 smartcatiboy 的回复:]
我有一个很大的记录,每条是一个类,需要随机读取

如果用Collection <class implements ISerializable >来做,好像要读取全部文件。

有没有速度快,任意抽取一条的办法???


[/Quote]

原来是这样。RandomAccessFile其实就是将文件看成是一个巨大无比的“虚拟字节数组”而已,从而通过RandomAccessFile.seek达到随机读写的目的(写只能是与添加,不能插入)。
因此:方法之一:一个很大的记录,每条是一个类,做成一个对象数组,对这个数组进行随机处理。
方法之二:若一定要通过文件来随机读、写,且最好是RandomAccessFile,也简单,不要使用对象序列化,而是将“一个很大的记录,每条是一个类”当中这个每条是类对象,做成一个值对象(即:将该对象的真正的状态--对象中的值你自己转成你规定的格式--如:统一是由20个字节),这样你自己通过RandomAccessFile.seek就可以随机读、写了。这个肯定是可以的。我就这样做过随机的两维点的处理。
smartcatiboy 2009-11-23
  • 打赏
  • 举报
回复
回3楼,分别使用InputStream和OuputStream功能上可以实现。
但是有个问题,采用InputStream.skip和RandomAccessFile.seek的效率有差别吗??

回4楼:你的办法是不是做一个索引文件int Id;int Offeset;
然后对要写的类定义一个接口IreadRecord,IwriteRecord,根据Offset用DataInput/output来手工写?

bawgiitx 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 smartcatiboy 的回复:]
我有一个很大的记录,每条是一个类,需要随机读取

如果用Collection <class implements ISerializable >来做,好像要读取全部文件。

有没有速度快,任意抽取一条的办法???
[/Quote]
自己立个索引,记录每每一行
bawgiitx 2009-11-23
  • 打赏
  • 举报
回复
直接的不行,要自己间接转换一下
class connn implements java.io.Serializable {

connn() {
}
String name = "";
int scor = 0;
}

public class Main {

public static void main(String[] args) throws Exception {
File rf = new File("1.txt");
FileOutputStream fos = new java.io.FileOutputStream(rf);
ObjectOutputStream oos = new ObjectOutputStream(fos);
connn c = new connn();
c.name = "name1";
c.scor = 50;
oos.writeObject(c);
oos.flush();
connn cc = new connn();
cc.name = "name2";
cc.scor = 0;
oos.writeObject(cc);
oos.flush();
connn ccc = new connn();
ccc.name = "name3";
ccc.scor = 20;
oos.writeObject(ccc);
oos.flush();
oos.close();
c = null;
ObjectInputStream ois = new ObjectInputStream(new java.io.FileInputStream(rf));
try {
while ((c = (connn) ois.readObject()) != null) {
System.out.println("name:" + c.name + ", scor:" + c.scor);
}
} catch (Exception e) {
}
ois.close();
}
}

1.txt有自己的结构

 sr
test.connn炖額? I scorL namet Ljava/lang/String;xp 2t name1sq ~ t name2sq ~ t name3
smartcatiboy 2009-11-23
  • 打赏
  • 举报
回复
我有一个很大的记录,每条是一个类,需要随机读取

如果用Collection<class implements ISerializable >来做,好像要读取全部文件。

有没有速度快,任意抽取一条的办法???

云上飞翔 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 smartcatiboy 的回复:]
RandomAccessFile能否读写序列化类??

比方我seek到某处,然后writeObject,或者readObject??

api里没有此类函数,但是技术上应该不难啊???

或者有么有类似功能可以代替??
[/Quote]
不可以.你可以用对象序列化来做啊.为什么要用RandomAccessFile?即使你技术上能用它读/写对象(如:将对象转化成字节数组,然后再写),你也不能计算对象的真正大小(字节),没有对象的大小(字节),你就无法进行对象在RandomAccessFile中的定位,并有针对性的随机读、写了。

62,615

社区成员

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

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