Java 如何通过RMI传递InputStream?
默认情况下,InputStream未序列化。如何通过RMI传递InputStream以访问EJB?您必须将数据读入字节数组,或者全部读入一个数组,或者读入多个数组(取决于读取的数据大小),然后通过RMI传递这些字节数组。未读取的InputStream不是可以直接传递的数据 你不能。假设InputStream从磁盘读取一个文件,并将其作为方法参数发送给另一台机器上JVM上执行的EJB。在另一台计算机上反序列化时,该InputStream没有意义 你需要考虑潜在的问题,而不是机制。您需要将InputStream读入一个可序列化对象(比如一个byte[]数组)并传递该对象Java 如何通过RMI传递InputStream?,java,ejb-3.0,Java,Ejb 3.0,默认情况下,InputStream未序列化。如何通过RMI传递InputStream以访问EJB?您必须将数据读入字节数组,或者全部读入一个数组,或者读入多个数组(取决于读取的数据大小),然后通过RMI传递这些字节数组。未读取的InputStream不是可以直接传递的数据 你不能。假设InputStream从磁盘读取一个文件,并将其作为方法参数发送给另一台机器上JVM上执行的EJB。在另一台计算机上反序列化时,该InputStream没有意义 你需要考虑潜在的问题,而不是机制。您需要将Input
如果InputStream读取的内容对于内存来说太大,那么您需要将其包装在一个可序列化对象中,传递该对象,并使该对象能够在另一端创建InputStream(当然,假设它可以-否则您必须创建自己的流,这是一个完全不同的问题).在他的回答中@Konstantin写道: 未读取的InputStream不是可以直接传递的数据 正是 例如,如果您试图为一个被调用为“java app
System.in
的内容,您认为会发生什么?(提示:读“是的”)
如果希望通过RMI“传递”流,可以创建一个实现流API的包装器类,并对原始流对象执行RMI回调以读取或写入数据。您需要安排流包装器的序列化状态包含执行回调的句柄
但是,客户端更明智的做法是显式读取整个流内容,并将其作为字节(或字符)数组或缓冲区传递给服务器。这就像试图通过电话线发送电话一样。它没有意义,可能重复