2

考虑这两个函数:

Function A将 inputStream 作为参数。

public void processStream(InputStream stream)
{
  //Do process routine
}

Function B加载文件内容以将其传递给Function Aas InputStream

pulic void loadFile()
{
 File file =new File("c:\\file.txt");
 //Pass file as InputStream
}

如何在不直接读取文件的情况下将文件Function B作为Function AInputStream 传递?

我做了这样的事情:

File file = new File("c:\\file.txt");
DataInputStream stream= new DataInputStream(new FileInputStream(file));

这产生了以下异常:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.DataInputStream

编辑:

loadFile()正在将 InputStream 作为 RMI 响应传递。

4

3 回答 3

3

以下应该可以正常工作

processStream(new FileInputStream(file));

您不应该尝试通过like as来序列化InputStream实例ObjectOutputStream

objectOutputStream.writeObject(inputStream);

你显然正在做的processStream()方法。这正是异常试图告诉你的。如何正确解决它取决于您从问题中省略的唯一功能要求。


根据评论更新

我将 InputStream 作为 RMI 响应传递。

有问题。您不能将不可序列化的对象作为 RMI 响应传递,更不用说未读流了。您需要将其读InputStreamByteArrayOutputStream通常的 IO 方式,然后使用它toByteArray()从中byte[]取出并传递它。就像是:

InputStream input = new FileInputStream(file); 
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];

for (int length = 0; (length = input.read(buffer)) > 0;) {
    output.write(buffer, 0, length);
}

byte[] bytes = output.toByteArray(); // Pass that instead to RMI response.

不过要小心大文件。a 的每个字节都会byte[]占用 JVM 内存的一个字节。

于 2011-08-17T15:01:23.613 回答
1

该异常似乎表明您正在processStream使用 RMI 之类的方法调用远程对象上的方法?如果是这种情况,您将需要重新访问您正在做的事情。通过 RMI 发送数据流并不是一件容易的事。如果您保证使用小文件,您可以将文件数据复制到 abyte[]并将其传递给远程方法调用。但是,如果您需要处理更大的文件,那很可能会导致客户端和/或服务器上的内存问题。在这种情况下,您应该使用类似rmiio的东西,它提供了通过 RMI 流式传输数据的实用程序。

于 2011-08-17T15:08:22.317 回答
0

你可以通过FileInputStream?

processStream(new FileInputStream(yourFile));

您收到异常的原因是因为DataInputStream旨在读取原始 Java 类型

于 2011-08-17T14:59:11.047 回答