8

FTPサーバー上のファイルにデータを送信するには、データベースデータを行ごとに読み取り、CSVに変換し、read()メソッドを介して公開するカスタムInputStream実装を作成する必要があります。データベースから、次のList<Application>オブジェクトを取得します。データ。オブジェクトごとApplicationに、CSVファイルに行を作成します。

私の考えは、コンストラクターにすべてのデータをロードしてから、readメソッドをオーバーライドすることです。InputStreamのすべてのメソッドをオーバーライドする必要がありますか?私はいくつかの例でグーグルを試しましたが、成功しませんでした-最終的に私に1つへのリンクを教えてもらえますか?

4

6 に答える 6

12

パラメータなしでメソッドを実装するread()必要があるだけです。他のすべてのメソッドは、そのメソッドの呼び出しとして実装されます。パフォーマンス上の理由(および実装の容易さ)のために、代わりに3つの引数のread()read()メソッドを実装し、そのメソッドに関して引数なしのメソッドを再実装する方が簡単な場合があります。

于 2011-01-26T13:44:20.347 に答える
9

を実装するときに出会ったいくつかの非常に重要なポイントInputStream

  1. available()をオーバーライドします。Javadocが言うように:

    クラスInputStreamで使用可能なメソッドは、常に0を返します。このメソッドは、サブクラスによってオーバーライドされる必要があります。

    このメソッドをオーバーライドしないと、このストリームが読み取り可能かどうかをテストしようとするとfalseが返されます。たとえば、をにフィードするinputStreaminputStreamReader、このリーダーはを呼び出すときに常にfalseを返しますreader.ready()

  2. で-1を返しread()ます。ドキュメントはそれを強調していませんでした:

    ストリームの終わりに達したために使用可能なバイトがない場合は、値-1が返されます。このメソッドは、入力データが使用可能になるか、ストリームの終了が検出されるか、例外がスローされるまでブロックします。

    利用可能なデータがないときにブロックすることを選択したread()場合、状況によっては覚えておく必要がありますreturn -1read(byte b[], int off, int len)これを行わないと、ソース内の次のコードの別のブロックが発生する可能性があります。

    for (; i < len ; i++) {// default len is a relative large number (8192 - readPosition)
        c = read();
        if (c == -1) {
            break;
        }
        b[off + i] = (byte)c;
    }
    

    readLine(), read()そして、これにより、リーダーなどの一部の(すべてではないにしても)高レベルの読み取りブロックが発生します。

于 2015-12-29T08:57:28.773 に答える
3

おそらく大きなデータの場合は、guavaのcom.google.common.io.FileBackedOutputStreamを使用できます。

Javadoc:バイト配列へのバッファリングを開始するが、データが構成可能なサイズに達するとファイルバッファリングに切り替わるOutputStream。

を使用しout.getSupplier().getInput()て、InputStreamを取得します。

于 2011-01-26T14:30:59.397 に答える
1

カスタムを作成する必要はまったくありませんInputStreamByteArrayInputStream次のようなものを使用します。

public static InputStream createStream(){
    final String csv = createCsvFromDataBaseValues();
    return new ByteArrayInputStream(csv.getBytes());
}

特にこの引用を考えると:

私の考えは、コンストラクターにすべてのデータをロードしてから、readメソッドをオーバーライドすることです。

このようにすると、カスタムを実装しても何も得られませんInputStream。これは、上記で概説したアプローチとほぼ同じです。

于 2011-01-26T13:47:58.653 に答える
1

なぜカストン入力ストリームが必要なのですか?ftpサーバーに書き込まれる出力ストリームに生成するときにcsvデータを書き込むだけではどうでしょうか。

于 2011-01-26T16:09:05.930 に答える
0

データが大きすぎない場合は、次のことができます。

  • すべて読む
  • CSVに変換(テキスト)
  • テキストバイトを取得します(経由String.getBytes(encoding)
  • しかし、ByteArrayInputStream
于 2011-01-26T13:47:38.717 に答える