如何使用资源尝试将 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 回答。
我有一个 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 回答。