2

次の2つの機能を検討してください。

Function AinputStreamをパラメーターとして受け取ります。

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

Function BFunction Aファイルコンテンツをロードして、として渡しますInputStream

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

Function BファイルをFunction A直接読み取らずにInputStreamとしてに渡すにはどうすればよいですか?

私はこのようなことをしました:

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));

次のようにインスタンスをシリアル化しようとしないでください。InputStreamObjectOutputStream

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のメモリの1バイトを消費します。

于 2011-08-17T15:01:23.613 に答える
1

processStreamこの例外は、RMIなどを使用してリモートオブジェクトのメソッドを呼び出していることを示しているようです。その場合は、自分がしていることを再検討する必要があります。RMIを介してデータのストリームを送信することは簡単なことではありません。小さなファイルを使用することが保証されている場合は、ファイルデータをにコピーして、byte[]それをリモートメソッド呼び出しに渡すことができます。ただし、より大きなファイルを処理する必要がある場合は、クライアントやサーバーでメモリの問題が発生する可能性があります。その場合は、RMIを介してデータをストリーミングするためのユーティリティを提供するrmiioのようなものを使用する必要があります。

于 2011-08-17T15:08:22.317 に答える
0

あなたはただ合格することができFileInputStreamますか?

processStream(new FileInputStream(yourFile));

例外が発生する理由は、DataInputStreamがプリミティブJavaタイプを読み取ることを目的としているためです。

于 2011-08-17T14:59:11.047 に答える