如何从Java中的Azure Blob存储读取文件夹结构为';dir1/dir2/dir3/20210301-20210331';?

如何从Java中的Azure Blob存储读取文件夹结构为';dir1/dir2/dir3/20210301-20210331';?,java,spring-batch,azure-storage-blobs,Java,Spring Batch,Azure Storage Blobs,我已经在我的azure blob存储帐户中安排了一次导出,这是一次常见的运行,它会在文件夹下创建一个csv文件,如dir1/dir2/dir3/StartDateOfMonth EndDateOfMonth 我有以下事情要做 1-我想在不下载的情况下用java读取此文件 2-希望使用spring批处理主工作模式并行读取 面临的问题:- 1-我没有得到绝对路径使用下线 CloudAppendBlob cloudAppendBlob= container.getAppendBlobReferenc

我已经在我的azure blob存储帐户中安排了一次导出,这是一次常见的运行,它会在文件夹下创建一个csv文件,如
dir1/dir2/dir3/StartDateOfMonth EndDateOfMonth

我有以下事情要做

1-我想在不下载的情况下用java读取此文件

2-希望使用spring批处理主工作模式并行读取

面临的问题:-

1-我没有得到绝对路径使用下线

CloudAppendBlob cloudAppendBlob=  container.getAppendBlobReference("blob_file_name");

log.info("cloudAppendBlob.getUri().getPath() = {}",cloudAppendBlob.getUri().getPath());

2-如果有人帮助我如何在Spring批处理主工作模式中执行此操作,这将对我非常有帮助。[我知道CSV从本地路径读取其文件的正常Spring批处理主工作模式]

1-我想在不下载的情况下用java读取此文件

您可以使用SpringBatch提供的一个文件项读取器(平面文件、xml文件、json文件等),并使用
org.springframework.core.io.UrlResource
对其进行配置。下面是一个简单的例子:

UrlResource resource = new UrlResource("remote/url/to/your/file");
FlatFileItemReader<String> itemReader = new FlatFileItemReaderBuilder<String>()
   .resource(resource)
   // set other properties
   .build();

UrlResource=newurlResource(“remote/url/to/your/file”);
FlatFileItemReader itemReader=新建FlatFileItemReaderBuilder()
.资源(资源)
//设置其他属性
.build();
2-希望使用spring批处理主工作模式并行读取


您可以使用SpringBatch提供的远程分区技术,其中每个文件都在一个分区中处理(即每个文件有一个工作进程)。Spring Batch提供了专门为此而设计的。您可以在本节和完整示例中找到更多详细信息。

我找到了一个从Java Azure Blob存储下载.csv文件的解决方案,其文件夹结构为“dir1/dir2/dir3/StartDateOfMonth EndDateOfMonth”

@Override
        public List listBlobs(String containerName) {
                List uris = new ArrayList<>();
                String fileName=null;
                try {
                        CloudBlobContainer container = cloudBlobClient.getContainerReference(containerName);
                        Iterable<ListBlobItem> blobs = container.listBlobs("$Directory", true); //for $Directory please find screenshot I have given below. this is the name that you provide during the creation of Export in your Azure Storage account
                        BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(environment.getProperty("azure.storage.ConnectionString")).buildClient();

                        BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);

                        FileOutputStream fout = null;

                        for (ListBlobItem fileBlob : blobs) {
                                log.info("fileBlob instanceof CloudBlob = {}",fileBlob instanceof CloudBlob);
                                if (fileBlob instanceof CloudBlob) {
                                        CloudBlob cloudBlob = (CloudBlob) fileBlob;
                                        uris.add(cloudBlob.getName());
                                        log.info("File Name is = {}", cloudBlob.getName());
                                        BlobClient blobClient = containerClient.getBlobClient(cloudBlob.getName());
                                        System.out.println(blobClient.getBlobUrl());
                                        System.out.println(blobClient.getBlobUrl().trim());
                                        if (blobClient.exists()) {
                                                Path p = Paths.get(cloudBlob.getName());
                                                String file = p.getFileName().toString();
                                                String directory = p.getParent().toString();
                                                log.info("Downloading Blob File = {} from Directory {}",file,directory);

                                                File dir = new File("$LOCAL_PATH"+directory);

                                                dir.mkdirs();
                                                fout = new FileOutputStream("$LOCAL_PATH" + cloudBlob.getName());
                                                blobClient.download(fout);


                                                CloudAppendBlob cloudAppendBlob=  container.getAppendBlobReference(cloudBlob.getName());
                                                uris.add(cloudAppendBlob.getUri().toURL());
                                                log.info("cloudAppendBlob.getUri().getPath() = {}",cloudAppendBlob.getUri().toURL());
  
                                          
                                        }
                                }
                        }

                        for (ListBlobItem blobItem : container.listBlobs()) {
                                uris.add(blobItem.getUri().toURL());
                                //System.out.println("blobItem.getUri().getPath()= "+blobItem.getUri().getPath());
                        }


                } catch (StorageException e) {
                        e.printStackTrace();
                } catch (URISyntaxException e) {
                        e.printStackTrace();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }

                return uris;
        }
@覆盖
公共列表ListBlob(字符串容器名称){
List uris=new ArrayList();
字符串文件名=null;
试一试{
CloudBlobContainer container=cloudBlobClient.getContainerReference(containerName);
Iterable blobs=container.listBlobs(“$Directory”,true);//对于$Directory,请查找我在下面给出的屏幕截图。这是您在Azure存储帐户中创建导出时提供的名称
BlobServiceClient BlobServiceClient=new BlobServiceClientBuilder().connectionString(environment.getProperty(“azure.storage.connectionString”)).buildClient();
BlobContainerClient containerClient=blobServiceClient.getBlobContainerClient(containerName);
FileOutputStream fout=null;
for(ListBlobItem文件blob:blob){
log.info(“fileBlob instanceof CloudBlob={}”,fileBlob instanceof CloudBlob);
if(fileBlob实例CloudBlob){
CloudBlob CloudBlob=(CloudBlob)fileBlob;
add(cloudBlob.getName());
log.info(“文件名为={}”,cloudBlob.getName());
BlobClient BlobClient=containerClient.getBlobClient(cloudBlob.getName());
System.out.println(blobClient.getBlobUrl());
System.out.println(blobClient.getBlobUrl().trim());
if(blobClient.exists()){
Path p=Path.get(cloudBlob.getName());
String file=p.getFileName().toString();
String directory=p.getParent().toString();
log.info(“从目录{}下载Blob文件={}”,文件,目录);
File dir=新文件($LOCAL_PATH“+目录);
dir.mkdirs();
fout=newfileoutputstream($LOCAL_PATH“+cloudBlob.getName());
blobClient.download(fout);
CloudAppendBlob CloudAppendBlob=container.getAppendBlobReference(cloudBlob.getName());
add(cloudAppendBlob.getUri().tour());
log.info(“cloudAppendBlob.getUri().getPath()={}”,cloudAppendBlob.getUri().toURL());
}
}
}
对于(ListBlobItem blobItem:container.listBlobs()){
add(blobItem.getUri().toURL());
//System.out.println(“blobItem.getUri().getPath()=”+blobItem.getUri().getPath());
}
}捕获(存储异常){
e、 printStackTrace();
}捕获(URISyntaxException e){
e、 printStackTrace();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回URI;
}


此代码将从所有子目录下载所有文件,要从当月的特定目录下载,您可以为目录名添加日期匹配检查。

@MahmoudBenHassine,我刚刚给出了我的blob文件的硬编码路径[存在于我的Azure blob存储帐户中]到UrlResource。@MahmoudBenHassine UrlResource resource=new UrlResource(“);我得到一个错误
,原因是:java.lang.IllegalStateException:Input resource