#java #google-cloud-platform #google-cloud-storage
#java #google-облачная платформа #google-облачное хранилище
Вопрос:
Для копирования между двумя сегментами облачного хранилища Google необходим эквивалент приведенной ниже команды из Java SDK
gsutil cp gs://bucket-name/filename gs://bucket-name
У меня есть 2 варианта использования одного из приведенных ниже. Эксперты, можете ли вы предложить, есть ли какой-либо лучший подход?
-
Java.lang.Runtime.exec()
-
Java.lang.ProcessBuilder
Комментарии:
1. Вы могли бы просто использовать API-интерфейсы Java GCS.
2. Существует ли точный эквивалент для приведенной выше команды gsutil?
Ответ №1:
Как указано в документации, вы можете использовать клиентскую библиотеку Java для копирования объектов между сегментами в качестве прямой альтернативы команде
gsutil cp gs://SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME gs://DESTINATION_BUCKET_NAME/NAME_OF_COPY
Это пример кода, и вы можете проверить и загрузить полный пример проекта с github, пожалуйста, проверьте файл readme, чтобы узнать, какие зависимости необходимы
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
public class CopyObject {
public static void copyObject(
String projectId, String sourceBucketName, String objectName, String targetBucketName) {
// The ID of your GCP project
// String projectId = "your-project-id";
// The ID of the bucket the original object is in
// String sourceBucketName = "your-source-bucket";
// The ID of the GCS object to copy
// String objectName = "your-object-name";
// The ID of the bucket to copy the object to
// String targetBucketName = "target-object-bucket"
Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
Blob blob = storage.get(sourceBucketName, objectName);
// This keeps the original name, you could also do
// copyTo(targetBucketName, "target-object-name") to change the name
blob.copyTo(targetBucketName);
System.out.println(
"Copied object "
objectName
" from bucket "
sourceBucketName
" to "
targetBucketName);
}
}
Ответ №2:
Если 1) вы хотите, чтобы имена больших двоичных объектов (файлов) внутри сегментов оставались неизменными, и 2) У вас есть несколько (> 100) файлов для копирования, лучший способ сделать это — использовать задание переноса.
Эта работа выполняется Google на собственном оборудовании, и это намного быстрее, чем копирование файлов по одному из одного сегмента в другой, потому что они могут взаимодействовать с базовым хранилищем.
Взгляните на предоставленный Google пример кода Java для задания переноса и документацию API.