我遇到ByteArrayInputStream + ObjectInputStream(以及相应的输出流)的问题。
我想通过UDP通道编写类 1 2 3 4
1 2.091 0.918 0.9 1.718
2 0.647 0.964 0.6 2.264
3 0.804 0.789 0.6 1.9
的一些(不同的)实例,并且我已经设法通过这种方式:
撰写时(Pair
是this.scores
而HashMap<String, Integer>
是this.completed
(假设此ArrayList<String>
在本例中为2))
size()
阅读(for(String userWhoCompleted : this.completed) {
try(ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);) {
oos.writeUnshared(new Pair<String, Integer>(userWhoCompleted, this.scores.get(userWhoCompleted)));
oos.flush();
this.resultChannel.write(ByteBuffer.wrap(baos.toByteArray()));
} catch(IOException e) { e.printStackTrace(); }
}
是buf
)
ByteBuffer
使用此代码,我可以正确读取在通道上写入的所有2个对象。
但正如您所看到的,我必须在每个新的循环周期中创建while(scoresReceived != 2) { // 2 is temporary
buf.clear();
try {
this.multicastChannel.receive(buf);
} catch(IOException e) { e.printStackTrace(); }
try(ByteArrayInputStream bais = new ByteArrayInputStream(buf.array(), 0, buf.position());
ObjectInputStream ois = new ObjectInputStream(bais);) {
Pair<String, Integer> result = (Pair<String, Integer>) ois.readUnshared();
System.out.println(result);
} catch(IOException | ClassNotFoundException e) { e.printStackTrace(); }
}
,baos
,oos
和ois
的新实例。
我尝试在循环外创建这些对象,然后分别在服务器和客户端执行bais
+ oos.writeUnshared(baos.toByteArray)
和baos.reset()
,但在阅读时我得到readUnshared
。如果我删除StreamCorruptedException: invalid stream header
,我总是读同一个对象,这是第一个写入baos.reset()
的对象。
我做错了什么?这是解决这些问题的唯一方法吗?
PS:课程oos
为Pair
:
Serializable