2

Java でクライアント サーバー システムを開発しています。シリアル化されたオブジェクトを使用して、TCP チャネル経由でメッセージを送信しています。

また、ファイルを送信する必要があります。独自のカスタム メッセージ クラスを定義できます。

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

    ...
}

して送信します。私が理解していることから、ファイルを反対側に送信する前にすべてをメモリに入れようとするため、大きなファイルがある場合、これは問題を引き起こします。

私は読んExternalizableだことがありますが、TCP チャネル経由でファイルを送信する前に、ファイルがまだすべてのコンピューターのメモリに読み込まれている場合、それは良くありません。私はそれを行うための「怠惰な」方法が必要でした(ネットワーク経由で送信するときにディスクから読み取り、既に読み取ったものをメモリから破棄します)。

この問題を処理する最もクリーンな方法は何ですか? 最悪の場合、これを小分けにすることもできますが、できれば避けたいです。

編集:

もちろん、ファイルのストリームを開いて「送信」することもできます。しかし、それは、ファイルと他のすべてのメッセージを異なる方法で送信することを意味します。これは、私が避けたいと思っていることです。

ありがとう

4

2 に答える 2

2

ストリーミングを使用するためにそれを回避する1つの方法。ストリーミングアプローチでは、コンテンツ全体がメモリに読み込まれるわけではありません。ネットワーク経由で送信されるオブジェクトからの入力ストリームとTCPソケット接続用の 出力ストリームの2つのストリームを開くことができます。

Javaでは、InputStreamOutputStreamの両方。バイトの読み取りと書き込みをサポートします。

バッファサイズ(バイト配列)を定義できます。を使用してコンテンツをそのバッファに(ファイルから)読み取り InputStream.read(byte[] b)、同じバッファを出力ストリームに(TCPソケットに)書き込みます。OutputStream.write(byte[] b)

于 2012-02-28T10:24:35.070 に答える
0

Java Serilization を使用する代わりに、バッファ内の Java でファイルを直接読み取り、そのバッファをネットワーク経由で送信できます。なぜ白黒でJavaシリアライゼーションを巻き込み、複雑なものを複雑にするのですか。シンプルな n/w プログラムを使用して、ファイルを送信できます。

于 2012-03-02T19:13:30.247 に答える