gpt4 book ai didi

java - 从同一流发送序列化对象和 byte[]

转载 作者:行者123 更新时间:2023-11-30 04:18:51 25 4
gpt4 key购买 nike

我有一个客户端服务器应用程序,它们通过 objectoutputstream 和 objectinputstream 进行通信。我将序列化对象从一个对象发送到另一个对象,但现在我也想发送文件。如果我在序列化对象内传递文件的 byte[],它可以被传输,但该对象保留在 objectoutputstream 和 objectinputstream 中,并且在一些发送后,如果文件足够大,我会收到内存异常。如果我像这样发送:

File file = new File("C:\\a.txt");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] buffer = new byte[1024*1024*10];
int n = -1;
while((n = bis.read(buffer))!=-1) {
oos.write(buffer,0,n);
}

并阅读:

while ((fromServer = ois.read()) != null) {

}

效果很好。

我的问题是,我是否必须实现一个系统来知道我是否必须 writeObject/readObject 还是只是写/读?我是否必须摆脱序列化通信,是否必须创建另一个流用于读写?

最佳答案

您必须定义一个没有任何歧义的协议(protocol),并在客户端和服务器上坚持该协议(protocol)。

例如,如果您发送字节流,然后发送一个对象,则在接收端您无法知道字节流何时结束以及对象何时开始。

解决这个问题的协议(protocol)可能是:

  • 发送一个int(4字节),它是文件的大小N
  • 发送 N 个字节
  • 发送对象

接收方然后可以读取大小(N),然后从流中读取N个字节,然后读取对象。

关于java - 从同一流发送序列化对象和 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17642646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com