如何使用资源尝试将 S3Object 转换为文件和 return Java 中的文件对象?

How to convert S3Object to File and return the File Object in Java using try with resources?

我有一个 service 方法,它 return 从 AWS S3 存储桶中 File Object 给定一个 fileName。 我想将 S3Object 转换为 File 对象,并且 return 相同。

我不想使用任何 temp 位置来下载文件,只想将 S3Object 转换为 File 对象和 return 它。

我也想将 try 与资源 IOUtils 一起使用。

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

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

    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;
    }

return 文件的正确方法是什么? 任何帮助表示赞赏,在此先感谢。

编辑

如果我不想在本地保存文件对象,是否建议将 return 的 InputStream 到调用方法?

如前所述,调用方法使用apache poi库来解析excel文件。

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

我不知道为什么要将其转换为 File

问题:

是否建议将 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 请随时 Post 回答。