2009-09-26 38 views
7

我刚开始使用Java序列化,并且我不清楚在非阻塞I/O场景中如何从源中获取对象。 O。Java可序列化,ObjectInputstream,非阻塞I/O

我能找到的所有文档建议使用ObjectInputStream是适当的方式来读取序列化的对象。但是,正如我所提到的,我正在使用java.nio并执行非阻塞操作。如果readObject()将阻塞,直到有新的对象可用,这不能帮助我

摘要..如何在使用Java NIO时进行序列化?

+0

也许你可以使用available()方法,如果流要轮询是否有字节被读取。 – clamp 2009-09-29 18:05:00

+0

错字:当然应该读“...的流......” – clamp 2009-09-29 18:05:44

回答

4

将序列化的实例包装在一个报告有效负载长度的协议中,并且有效负载是有问题的实例。然后一旦你知道你有一个代表一个完整实例的段,你可以安全地使用ObjectInputStream知道它不会阻塞。

协议这样 第32位:有效载荷长度 有效载荷长度的比特:序列数据

有时我惊奇甚至自己。

+0

现在我知道为什么fortran字符串以字符串大小开头,然后是content.http://www.ibiblio.org/pub/languages/fortran/ch2-13.html – whatnick 2009-09-27 05:57:12

-1

您将需要实现(或查找实现)的InputStream从缓冲区读取,您可以从另一个线程追加到缓冲区。

这似乎是一个相当奇怪的事情,试图做。 NIO是关于高性能的,而序列化则不是。

+0

我使用nio,因为我发现界面更容易处理大量的流时处理。性能不是主要关注的问题。 – Mike 2009-09-26 17:28:45

-2

这是经典的 - 如果没有东西可读,你怎么读.read()? NIO显然是性能密集型的,致力于实现非阻塞io。尝试在Socket.read()上执行nio - 你仍然会得到一个阻塞操作或在超时时间内失败......没有多少花式会导致数据出现在'端口',除非你生成一些数据...

final SecureRandom dataGenerator = SecureRandom.getInstance("SHA1PRNG"); 

final Integer range = new Integer('z' - 'a'); 

for (big loop) 
{ 
    buffer.append(dataGenerator.nextInt (range.intValue() + (int) 'a')); 

// ............ 

do.something(buffer.toString()); 

现在你的发展技能移动,即使在冰河步伐,但他们移动。

try { 
    // Create a read/writeable file channel 
    File file = new File("filename"); 
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 

    // Create an output stream on the channel 
    OutputStream os = Channels.newOutputStream(channel); 

    // Create an inputstream on the channel 
    InputStream is = Channels.newInputStream(channel); 

    // Close the channel 
    is.close(); 
} catch (IOException e) { 
} 

信息编辑:我抓住你的关键反应,等到你12万行成CORBA试图实现readObjectNoData()(用于初始化反序列化对象的正确,尽管“敌对”或不完整的源流)

我的一次性伪代码有望提供某种数据流来解码,重新加载或其他 - 我重新读你的帖子;我认为它说如何在一个可能不存在的对象上读取()非阻塞的io ...深入研究已知的异常和调度问题,得到冒险的机会,尝试与某个以问题的方式提出问题的人一起工作你措辞,尝试重新措辞,并让别人向我解释你在问什么。

我现在要去塔科站。

+0

我不认为你阅读我的文章。我正在寻找一种在非阻塞流上进行序列化的方法。 – Mike 2009-09-26 18:51:42