Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用try with resources将S3Object转换为File并返回Java中的File对象?_Java_Amazon Web Services_File_Amazon S3_Inputstream - Fatal编程技术网

如何使用try with resources将S3Object转换为File并返回Java中的File对象?

如何使用try with resources将S3Object转换为File并返回Java中的File对象?,java,amazon-web-services,file,amazon-s3,inputstream,Java,Amazon Web Services,File,Amazon S3,Inputstream,我有一个服务方法,该方法在给定文件名的情况下,从AWS S3存储桶返回一个文件对象。 我想将S3对象转换为文件对象并返回相同的值 我不想使用任何temp位置下载文件,只想将S3Object转换为file对象并返回它 我还想将try与参考资料和IOUtils一起使用 我的问题是执行com.amazonaws.util.IOUtils.copy(InputStream-in,OutputStream-out)方法获取文件对象的正确方法是什么。 调用方法将使用此文件对象进行进一步处理,因此我不想将其保

我有一个
服务
方法,该方法在给定
文件名的情况下,从AWS S3存储桶返回一个
文件对象
。 我想将S3对象转换为文件对象并返回相同的值

我不想使用任何temp位置下载文件,只想将
S3Object
转换为
file
对象并返回它

我还想将
try
与参考资料和
IOUtils
一起使用

我的问题是执行
com.amazonaws.util.IOUtils.copy(InputStream-in,OutputStream-out)
方法获取文件对象的正确方法是什么。 调用方法将使用此文件对象进行进一步处理,因此我不想将其保存在本地。 我尝试了类似的方法,但它抛出FileNotFoundException

我确信我在这方面遗漏了一些东西,可能是IOUtils。copy必须以不同的方式使用。或者我没有正确使用try with资源

    public File getFileFromBucket(String fileName) {
        GetObjectRequest getObjectRequest = new GetObjectRequest(aWSBucketName, fileName);
        S3Object s3Object = aWSS3client.getObject(getObjectRequest);
        File s3File = new File(fileName);
        try (FileOutputStream fos = new FileOutputStream(s3File)) { //throws Exception
            IOUtils.copy(s3Object.getObjectContent(), fos); 
        } catch (IOException e) {
            log.debug("IOException Occurred while fetching file {}", fileName);
            e.printStacktrace();
        }
        return s3File;
    }
返回文件的正确方式是什么? 感谢您的帮助,提前谢谢

编辑

如果我不想在本地保存文件对象,是否建议将InputStream返回给调用方法

如前所述,调用方法使用
apachepoi
库解析excel文件

org.apache.poi.xssf.usermodel.xssf工作簿.xssf工作簿(InputStream is)
无论如何,此方法将
InputStream
作为参数

我不知道为什么要首先将其转换为文件

问题:


建议将
S3Object.getObjectContent()
作为
InputStream
发送给调用方法,还是有更好的方法

咨询前辈后,我发现将
InputStream
发送给调用方法是可以的

如果需要将
InputStream
保存到本地系统,则可以在必要时使用
IOUtils.copy

InputStream
转换为
File
,然后再转换回
InputStream
是一种计算浪费

因此,我的方法只是返回
ObjectContent
,如下所示:

public InputStream getFileInputStreamFromBucket(String fileName) {
        GetObjectRequest getObjectRequest = new GetObjectRequest(aWSBucketName, fileName);
        S3Object s3Object = aWSS3client.getObject(getObjectRequest);
        InputStream fileInputStream = s3Object.getObjectContent();
        log.debug("File Input Stream fetched from s3 bucket for File {} ", fileName);
        return fileInputStream;
    }
这似乎是正确的选择


如果有人有更好的方式发回
InputStream
,请随时发布答案

文件
对象描述本地文件系统上的一个条目。根据定义,S3对象不在本地文件系统上,因此它不能像jar中的资源那样由
文件表示。所以你所要求的是不可能的。然而,您的程序似乎只是将S3复制到本地文件。因此,我不知道您为什么说不想在本地保存它。这就是你正在做的。您得到的异常是什么?我不知道
File
object用于本地保存对象。我认为该文件类似于POJO,可以用来保存一些信息,然后使用getter获取这些信息。例如,我将文件发送回调用方法,这是一个excel文件,用于保存用户信息,调用方法将使用apache poi解析excel文件,然后从中提取信息并保存到DB。如果我问的是错误的,你能建议什么是发回这个S3对象的最好方法吗?这个S3对象可以通过调用方法来解析。不,请阅读。它只是本地文件系统中路径的表示。它实际上不包含任何内容,路径甚至不必存在。