java - 通过 TCP channel 发送大文件并进行序列化

标签 java oop serialization externalizable

我正在用 Java 开发一个客户端-服务器系统。我正在通过 TCP channel 使用序列化对象发送消息。

我还需要发送文件。我可以定义自己的自定义消息类:

public class SendFile implements Serializable {
    private byte[] fileContents;

    ...
}

然后发送。如果我们有一个大文件,这会带来一个问题,据我了解,在将文件发送到另一端之前,它会尝试将所有内容都存储在内存中。

我已经阅读过有关 Externalized 的内容,但如果在通过 TCP channel 发送文件之前仍将文件读取到我的所有计算机内存中,情况也不会更好。我想要一些“惰性”的方法来做到这一点(当我通过网络发送它时从磁盘读取它,并从内存中丢弃已经读取的内容)。

处理这个问题最简洁的方法是什么?在最坏的情况下,我可以将其分成小块,但如果可能的话我想避免它。

编辑:

当然,我可以打开文件上的流并“发送它”。但这意味着以不同的方式处理发送文件和所有其他消息,这是我希望避免的。

谢谢

最佳答案

解决这个问题的一种方法是使用流媒体。流式传输方法不会将全部内容加载到内存中。您可以打开两个流,即来自要通过网络发送的对象的输入流和用于 TCP 套接字连接的输出流

在java中,InputStreamOutputStream 。支持字节的读写。

您可以定义缓冲区大小(字节数组)。使用 InputStream.read(byte[] b) 将内容(从文件)读取到该缓冲区中并使用 OutputStream.write(byte[] b) 将相同的缓冲区写入(到 TCP 套接字)输出流

关于java - 通过 TCP channel 发送大文件并进行序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9479970/

相关文章:

Javascript:使用 XMLSerialier.serializeToString() 时如何保留 namespace ?

c# - 在 C# 的反序列化过程中创建指向父对象的指针

java - 使用 RecyclerView 实现 Admob Native Advanced 但无法获取确切的 View 类型

javascript - 原型(prototype)编程中的对象和原型(prototype)有什么区别?

java - 如何关闭与 Active Directory 的 LDAP 连接

C++ 服务器端脚本

python - 如何使用exec动态向类添加静态方法?

.net - 如何将 ExpandoObject 序列化为属性/值对?

java - SHA256withRSA 它是做什么的,顺序是什么?

java - JNI 找不到 native 方法 (test\Test.java :11: cannot find symbol)