Google Cloud Storageからファイルをストリーミングする

クォーク:

Google Cloud Storageからファイルをダウンロードするコードは次のとおりです。

@Override
public void write(OutputStream outputStream) throws IOException {
    try {
        LOG.info(path);
        InputStream stream = new ByteArrayInputStream(GoogleJsonKey.JSON_KEY.getBytes(StandardCharsets.UTF_8));
        StorageOptions options = StorageOptions.newBuilder()
                .setProjectId(PROJECT_ID)
                .setCredentials(GoogleCredentials.fromStream(stream)).build();
        Storage storage = options.getService();
        final CountingOutputStream countingOutputStream = new CountingOutputStream(outputStream);
        byte[] read = storage.readAllBytes(BlobId.of(BUCKET, path));
        countingOutputStream.write(read);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        outputStream.close();
    }
}

これは機能しますが、ここでの問題は、このメソッドのクライアントにストリームバックする前に、最初にすべてのバイトをバッファする必要があることです。これにより、特にGCSに保存されているファイルが大きい場合、多くの遅延が発生します。

GCSからファイルを取得し、それを直接OutputStreamストリーミングする方法はありますが、このOutputStreamはサーブレット用です。

修正:

ただ、明確にするために、あなたが必要なのですOutputStreamInputStreamこれを見る1つの方法は、Google Cloud Storageオブジェクトにファイルとして保存されているデータと、そのファイルを読み取るためのInputStreamを持っていることです。それがうまくいくなら、読み続けてください。

Storage APIには、InputStreamまたはを提供する既存のメソッドはありませんOutputStreamただし、Cloud StorageクライアントライブラリReadChannelには、ReadableByteChannel(Java NIO APIから)拡張されオブジェクトを公開する2つのAPIがあります。

ReadChannel reader(String bucket, String blob, BlobSourceOption... options);
ReadChannel reader(BlobId blob, BlobSourceOption... options);

これを使用した簡単な例(StorageSnippets.javaから取得):

/**
   * Example of reading a blob's content through a reader.
   */
  // [TARGET reader(String, String, BlobSourceOption...)]
  // [VARIABLE "my_unique_bucket"]
  // [VARIABLE "my_blob_name"]
  public void readerFromStrings(String bucketName, String blobName) throws IOException {
    // [START readerFromStrings]
    try (ReadChannel reader = storage.reader(bucketName, blobName)) {
      ByteBuffer bytes = ByteBuffer.allocate(64 * 1024);
      while (reader.read(bytes) > 0) {
        bytes.flip();
        // do something with bytes
        bytes.clear();
      }
    }
    // [END readerFromStrings]
  }

また、使用することができますnewInputStream()ラップするメソッドをInputStream介してReadableByteChannel

public static InputStream newInputStream(ReadableByteChannel ch)

が必要な場合でもオブジェクトOutputStreamから、InputStreamまたはReadChannelオブジェクトからにデータをコピーできるはずOutputStreamです。

完全な例

この例を次のように実行します。 PROGRAM_NAME <BUCKET_NAME> <BLOB_PATH>

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;

import com.google.cloud.ReadChannel;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

/**
 * An example which reads the contents of the specified object/blob from GCS
 * and prints the contents to STDOUT.
 *
 * Run it as PROGRAM_NAME <BUCKET_NAME> <BLOB_PATH>
 */
public class ReadObjectSample {
  private static final int BUFFER_SIZE = 64 * 1024;

  public static void main(String[] args) throws IOException {
    // Instantiates a Storage client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name for the GCS bucket
    String bucketName = args[0];
    // The path of the blob (i.e. GCS object) within the GCS bucket.
    String blobPath = args[1];

    printBlob(storage, bucketName, blobPath);
  }

  // Reads from the specified blob present in the GCS bucket and prints the contents to STDOUT.
  private static void printBlob(Storage storage, String bucketName, String blobPath) throws IOException {
    try (ReadChannel reader = storage.reader(bucketName, blobPath)) {
      WritableByteChannel outChannel = Channels.newChannel(System.out);
      ByteBuffer bytes = ByteBuffer.allocate(BUFFER_SIZE);
      while (reader.read(bytes) > 0) {
        bytes.flip();
        outChannel.write(bytes);
        bytes.clear();
      }
    }
  }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Google Cloud StorageからGoogleコンピューティングインスタンスで静的ファイルを提供することは可能ですか?

API を使用して Google Cloud Storage からファイルをダウンロードする

S3 バケットから Google Cloud Storage にファイルをコピーする

Google Cloud Platformストレージからファイルをダウンロードする方法

Google Cloud Storageからファイルを復号化する方法は?

Google Cloud Storageからコピーするときに、特定のファイルまたはディレクトリを除外します

Google Cloud Storage バケットから JSON ファイルのコンテンツを読み取ります

GCS-Google Cloud Storageから直接Pythonにテキストファイルを読み取ります

Google Cloud:VMインスタンスからコンピューターのデスクトップにファイルをコピーする方法は?

Google Cloud Storage-Python 3からファイルをアップロードする方法

numpy npzファイルをgoogle-cloud-mlジョブまたはGoogleCloud Storageからロードする方法は?

Google Cloud Storage:gsutilを使用してバケット/フォルダー内の新しいファイルのリストを取得する方法

Google Cloud Functionを使用して、ファイルをCloud Storageバケットからインスタンスにプッシュするにはどうすればよいですか?

Google Cloud Shellからターミナルテキストを保存する方法は?

Google Cloud Storage + Python:GCSの特定のフォルダーにobjをリストする方法はありますか?

Google Cloud Storageのファイルを操作する

Google Appengine Cloud Storage

PHP Google Cloud Storage

Google Cloud Storage Client

Google Cloud Storage

Google Cloud SDKをインストールします。rcファイルへのパスは何ですか?

Cloudstorageから読み取り、ローカル/オンプレミスにダウンロードするGoogle Cloudストレージライブラリ?

Twilio API の Google Cloud Storage にファイル サフィックスを保持することは可能ですか?

Google Cloud Storageのリストファイルがスローされます:AccessDeniedException:403

Google Cloud Storage はヘッダー/フッターをテキスト ファイルに追加します

Google Cloud Storage はヘッダー/フッターをテキスト ファイルに追加します

Googleストレージから直接JSONファイルを読み取る(Cloud Functionsを使用)

Google Cloud Storageにファイルを直接アップロードすることは可能ですか?

Google Cloud Storage:部分的なオーディオファイルをダウンロードする

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Chromeウェブアプリのウェブビューの高さの問題

  3. 3

    Railsで宝石のレイアウトを使用するにはどうすればよいですか?

  4. 4

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  5. 5

    Ansibleで複数行のシェルスクリプトを実行する方法

  6. 6

    アンドロイド9 - キーストア例外android.os.ServiceSpecificException

  7. 7

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  8. 8

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  9. 9

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  10. 10

    Python / SciPyのピーク検出アルゴリズム

  11. 11

    Swiftのブロックのパラメーターに関するドキュメントのマークアップ形式は何ですか?

  12. 12

    Windows 7では、一部のプログラムは「ビジュアルテーマを無効にする」レジストリ設定を行いませんか?

  13. 13

    Google Playストア:アプリページにリーダーボードと実績のアイコン/バッジが表示されない

  14. 14

    ezdxf pythonパッケージを使用して既存のdxfファイルを変更するにはどうすればよいですか?

  15. 15

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  16. 16

    MySQLでJSON_LENGTHとJSON_EXTRACTを組み合わせる方法は?

  17. 17

    Get-ADGroupMember:このリクエストのサイズ制限を超えました

  18. 18

    ZScalerと証明書の問題により、Dockerを使用できません

  19. 19

    Dynamics365からローカルファイルにアクセスできます。ローカルリソースは許可されていません

  20. 20

    Eclipseプロジェクトをエクスポートすると、不適切なテクスチャリングとクラッシュが発生します。

  21. 21

    CSSのみを使用して三角形のアニメーションを作成する方法

ホットタグ

アーカイブ