代码之家  ›  专栏  ›  技术社区  ›  Sohrab

从Azure存储下载后如何解码解码文件?

  •  -1
  • Sohrab  · 技术社区  · 7 年前

    我正在尝试通过Azure Storage SDK for Java下载后解码文件。

    这是我的代码:

    try
            {
                CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
                CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
                CloudBlobContainer container = blobClient.getContainerReference("mycontainer");
                CloudBlobDirectory blobDirectory = container.getDirectoryReference("shi");
                for (ListBlobItem blobItem : blobDirectory.listBlobs()) {
                    if (blobItem instanceof CloudBlob) {
                        CloudBlob blob = (CloudBlob) blobItem;
                        blob.download(new FileOutputStream("/Users/shi/Downloads/" + blob.getName()));
                    }
                }
            }
    

    这段代码从mycontainer下载所有BLOB文件,但都是经过编码的。我如何才能下载它们,但在解码的形式。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jay Gong    7 年前

    我试图复制你的问题。

    我的示例代码:

    CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
    CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
    CloudBlobContainer container = blobClient.getContainerReference("jay");
       for (ListBlobItem blobItem : container.listBlobs()) {
            if (blobItem instanceof CloudBlob) {
                CloudBlob blob = (CloudBlob) blobItem;
                blob.download(new FileOutputStream("E://AzureFile/" + blob.getName()));
    

    下载成功

    enter image description here

    enter image description here

    此外,这可能是因为解析blob内容时使用的编码与上载blob时同事使用的编码不一致。

    下载文本时会遇到此问题,但二进制文件不会。

    我建议您在上传文件时获取编码,并使用以下代码片段将字符集设置为解析blob内容:

    if (blobItem instanceof CloudBlob) {
          CloudBlob blob = (CloudBlob) blobItem;
          InputStream input =  blob.openInputStream();
          InputStreamReader inr = new InputStreamReader(input, "UTF-8");
          String utf8str = org.apache.commons.io.IOUtils.toString(inr);
          System.out.println(utf8str);
    }
    

    希望对你有帮助。

        2
  •  1
  •   Sohrab    7 年前

    public static int convertAvro(String avroFile) throws Exception {
    
        PrintStream out = new PrintStream(System.out);
        GenericDatumReader<Object> reader=new GenericDatumReader<Object>();
        org.apache.avro.file.FileReader<Object>  fileReader=  DataFileReader.openReader(new File(avroFile),reader);
          try {
            Schema schema=fileReader.getSchema();
            // System.out.print(schema);
            DatumWriter<Object> writer=new GenericDatumWriter<Object>(schema);
            JsonEncoder encoder=EncoderFactory.get().jsonEncoder(schema,out);
            for (Object datum : fileReader)     writer.write(datum,encoder);
            encoder.flush();
            out.println();
            out.flush();
          }
          finally {
            fileReader.close();
          }
          return 0;
    }