2

さまざまな方法とさまざまな形式でデータを受け取るアプリケーションがあります。私は何らかの方法でデータを取得するプラグイン可能なレシーバーを持っています (例えば、メールボックスをポーリングする、HTTP 要求をリッスンする、ディレクトリのコンテンツを監視するなど)、それを MIME タイプに関連付けてから、次のようにラップして渡します。

public class Transmission {
    private String origin;      // where the data came from
    private String destination; // where the data was sent to
    private String mime;        // the MIME type of the data
    private BLOB data;          // this is what I need an appropriate type for
}

さらに下に進むと、データはmimeフィールドの値に応じて特殊なハンドラーによって処理されます。ZIP ファイル、Excel ドキュメント、SOAP、汎用 XML、プレーン テキストなどを期待しています。この時点で、コードはデータの内容にとらわれないようにする必要があります。dataフィールドの適切なタイプは何ですか? Object? InputStream? Byte[]?

4

4 に答える 4

7

複数の可能性:

  • バイト[]
    • 最も直接的な方法
  • バイトバッファ
    • フレキシブル
    • ランダムアクセスと一括操作があります
    • 複製、スライスなどの操作があります
    • IO/ネットワーク集約型 (NIO) の場合に推奨
  • 入力ストリーム
    • 正しく行われればパイプライン化が可能
    • ランダム アクセスまたは一括操作はサポートされていません。
    • ByteBuffer ほど柔軟ではありません。

DB 関連のものをメイン モデルに入れるのは奇妙に思えるので、私は Blob を使用しません。

于 2009-07-15T15:42:17.590 に答える
4

byte[]どちらかまたはのいずれかを使用しますInputStreamが、より柔軟であるため、ストリームを好みます。必要に応じて、 a を使用しByteArrayInputStreamてバイト配列をフィードできます。しかし、その逆はできません。

ストリームは多くのメモリを必要とせずに外部データの大きなチャンクを処理できるため、メモリ効率の利点もあります。使用する場合byte[]は、すべてのデータをメモリにロードする必要があります。つまり、ストリームは遅延しています。

于 2009-07-15T15:34:23.957 に答える
0

個人的には、Spring のResource抽象化を使用します。これにより、どこかに存在するリソースのアイデアをより適切にラップできます。リソースを消費したいときに InputStream を取得するメソッドを提供します。

ByteArrayResourceあなたにとって最も簡単な実装は、byte[] をカプセル化するものかもしれません。それが大きくなりすぎた場合は、後でFileSystemResource、またはURLResource、または Spring が提供する他のさまざまな実装のいずれかに切り替えることができます。ただし、常に Resource インターフェースと対話するため、クライアント コードはあまり変更しないでください。

また、これは Spring API の単なるユーティリティ クラスとインターフェイスのセットであるため、Spring から他に何も使用せずに、Resource とその実装を分離して使用できます。

于 2009-07-15T15:44:08.927 に答える
0

上記のクラスでは、byte[]にします。java.sql.Blob ではないのはなぜですか? したがって、Transmissionオブジェクトは SQL (またはデータストア) に依存しません。

たとえば、ある段階で、Javaspace、CouchDb、または SQL データベースではない何かを書きたいと思うかもしれません。バイト配列として格納することにより、この情報は基本的な形式になり、必要に応じて変換できます。byte[] が非常に大きい場合、Transmissionオブジェクトはディスクなどを介してキャッシュを処理できます。ただし、後で心配します。

編集: 古い回答 (現在は削除されています) 以降に作成された SQL への参照が推奨されjava.sql.Blobます。残念ながら、答えが消えると、ここでの参照はやや異常になります。

于 2009-07-15T15:40:14.100 に答える