当前位置: 首页 > 知识库问答 >
问题:

从Azure blob存储中下载所有文件,对其进行压缩,并用JAVA上传压缩文件

令狐泓
2023-03-14

我想从Azure blob存储中下载所有文件,从这些文件中创建一个zip文件,并将该zip文件上传到blob存储中。由于文件大小可能非常大,我不想最大限度地耗尽内存。而且这个操作需要非常快。

JAVA sdk-azure-storage-blob 12.8.0

编辑:到目前为止编写的代码。不确定如何进一步并行上载pipedinputstream数据。

 String zipFileName = formFileName(exportRequest, requestId);
        final PipedOutputStream pipedOutputStream = new PipedOutputStream();
        final PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);

  AzureObjectStoreService objectStoreService =managedObjectStoreUtils.getObjectStoreService();

            if (filesToZip.size() > 0) {
                System.out.println("Files to zip "+ filesToZip.size());
                CompletableFuture<Boolean> zipCreationFuture = CompletableFuture.runAsync(() -> {
                    LoggerHelper.logInfo(logger, "Inside createZIP file async function");
                    ZipOutputStream zipOutputStream = new ZipOutputStream(pipedOutputStream);
                    try {
                        for (String fileName : filesToZip) {
                            try {
                                BlobClient blobClient = objectStoreService.getBlobContainerClient().getBlobClient(fileName);
                                LoggerHelper.logInfo(logger, "Adding zipEntry for file : " + fileName);
                                final ZipEntry zipEntry = new ZipEntry(fileName);
                                zipOutputStream.putNextEntry(zipEntry);
                                byte[] buffer;
                                ByteArrayOutputStream output = new ByteArrayOutputStream();
                                buffer= output.toByteArray();
                                blobClient.getBlockBlobClient().download(output);
                                int len;
                                while ((len = buffer.length) > 0) {
                                    zipOutputStream.write(buffer, 0, len);
                                }
                                zipOutputStream.closeEntry();
                            } catch (SdkClientException e) {
                                LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) e);
                                LoggerHelper.logError(logger, "Failed while getting s3 object");
                            }
                        }
                        zipOutputStream.finish();
                    } catch (IOException ex) {
                        LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) ex);
                        LoggerHelper.logError(logger, "Creating zip file failed");
                    } finally {
                        try {
                            zipOutputStream.close();
                            } catch (IOException e) {
                            LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) e);
                            LoggerHelper.logError(logger, "Failed to close the zip output stream");
                        }
                    }
                    LoggerHelper.logInfo(logger, "Completed createZIP file async function");
        //            return true;
                }).handle((o, exception) -> {
                    LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) exception);
                    LoggerHelper.logError(logger, "Creating zip file failed");
                    return null;
                });

共有1个答案

籍利
2023-03-14

能够这样做。请让我知道如果有人有更好的方法

CompletableFuture.runAsync(() -> {
                  
                    BlobClient blobClient = objectStoreService.getBlobContainerClient().getBlobClient(zipFileName);
                    BlobOutputStream blobOutputStream = blobClient.getBlockBlobClient().getBlobOutputStream();

                     try {
                            int nextData= pipedInputStream.read();
                            while (nextData!=-1) {
                                blobOutputStream.write(nextData);
                                nextData = pipedInputStream.read();
                            }blobOutputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
 类似资料:
  • 问题内容: 我想使用urllib下载文件,并在保存之前对文件进行解压缩。 这就是我现在所拥有的: 最终将写入空文件。我该如何实现自己的追求? 更新的答案: 问题答案: 在写完之后,但要传递给之前,您需要寻找到开始的地方。否则它将被模块从头读取,并显示为空文件。见下文:

  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 常用压缩包—解压—令整理 Linux 后缀为 .war 格式的文件(一般用在部署 Tomcat 项目的时候) 命令:unzip -oq XXXXXX.war -d ROOT 如果没有 ROOT 目录会自动创建 ROOT 目录。 Linux 后缀为 .tar.gz 格式的文件-解压 命令:tar zxvf XXXXXX.tar.gz Linux 后缀为 .bz2 格式的文件-解压 命令:bzip2

  • 问题内容: 我想使用Java代码将文件压缩为zip,rar和7z格式。我也想在指定位置解压缩这些文件。谁能告诉我如何在Java中使用7-zip压缩和解压缩文件? 问题答案: 我用过:sevenzipjbinding.jar sevenzipjbinding-Allplatforms.jar 我现在可以使用这些jar解压缩文件。 尝试使用此链接进行解压缩:http : //sourceforge.n

  • 问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示:

  • 本文向大家介绍C#文件流进行压缩和解压缩的方法,包括了C#文件流进行压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#文件流进行压缩和解压缩的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。