1

データを書き込む必要があり、次のようにAmazon S3使用OutputStreamしてデータを書き込みますInputStream

    final PipedOutputStream outputStream = new PipedOutputStream();
    final PipedInputStream inputStream;
    try {
        inputStream = new PipedInputStream(outputStream);
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        PutObjectRequest putObjectRequest = new PutObjectRequest(S3EnvironmentConfigurator.BucketTypes.source.name(), getProposalName(uniqueId), inputStream, null);
                        amazonS3Client.putObject(putObjectRequest);
                        try {
                            inputStream.close();
                        } catch (IOException e) {

                        }
                    }
                }
        ).start();

amazonS3Client.putObjectのように見えます

  @Override
    public PutObjectResult putObject(@Nonnull final PutObjectRequest putObjectRequest)
            throws AmazonClientException, AmazonServiceException {

        try {
            InputStreamReader is = new InputStreamReader(new GZIPInputStream(putObjectRequest.getInputStream()));
            StringBuilder sb=new StringBuilder();
            BufferedReader br = new BufferedReader(is);
            String read = br.readLine();
            while(read != null) {
                System.out.println(read);
                read =br.readLine();

            }
        } catch (IOException e) {
            //ignore
        }
    return super.putObject(putObjectRequest);
  • これは現在、コンソールのコンテンツを出力します

必要

どうすれば次のようなことができますか

while (putObjectRequest.getInputStream() is not completely available) {
   // wait
}

// write inputStream, the entire InputStream is ready and available for processing
4

2 に答える 2

1

サイドライティングがそのを閉じるとOutputStreamInputStreamはまだ読み取られていないバイトを配信し、その後の次の書き込みread()は-1を返し、入力の終了を示します。

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

サイド書き込みが完了したclose()ときに失敗した場合、リーダーは書き込みプロセスが終了するまで、追加の入力の待機をブロックします。

于 2012-09-05T20:54:22.463 に答える
1

すべてのデータをバイトバッファーにコピーできるため、入力ストリームからすべてのデータを読み取ったことを確認できます。そして、このバッファに基づいて新しい入力ストリームを作成します。何かのようなもの:

byte[] array = IOUtils.toByteArray(inputStream);
InputStream newInputStream = new ByteArrayInputStream(array);

Apache Commonsの IOUtils

于 2012-09-05T20:58:46.477 に答える