我有一种情况需要打开一个驻留在S3存储桶中的zip文件。 到目前为止,我的代码如下:
public ZipFile readZipFile(String name) throws Exception {
GetObjectRequest req = new GetObjectRequest(settings.getAwsS3BatchRecogInBucketName(), name);
S3Object obj = s3Client.getObject(req);
S3ObjectInputStream is = obj.getObjectContent();
/******************************
* HOW TO DO
******************************/
return null;
}
以前我尝试使用 File.createTempFile 函数创建一个临时文件对象,但是我总是遇到麻烦,因为我没有创建File对象。我之前的尝试如下:
public ZipFile readZipFile(String name) throws Exception {
GetObjectRequest req = new GetObjectRequest(settings.getAwsS3BatchRecogInBucketName(), name);
S3Object obj = s3Client.getObject(req);
S3ObjectInputStream is = obj.getObjectContent();
File temp = File.createTempFile(name, "");
temp.setWritable(true);
FileOutputStream fos = new FileOutputStream(temp);
fos.write(IOUtils.toByteArray(is));
fos.flush();
return new ZipFile(temp);
}
有人遇到过这种情况吗?请建议我谢谢:)
答案 0 :(得分:2)
如果您想立即使用zip文件而不先将其保存到临时文件,可以使用java.util.zip.ZipInputStream
:
import java.util.zip.ZipInputStream;
S3ObjectInputStream is = obj.getObjectContent();
ZipInputStream zis = new ZipInputStream(is);
从那里开始,您可以阅读zip文件的条目,忽略您不需要的条目,并使用您需要的条目:
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
String name = entry.getName();
if (iWantToProcessThisEntry(name)) {
processFile(name, zis);
}
zis.closeEntry();
}
public void processFile(String name, InputStream in) throws IOException { /* ... */ }
您不必担心以这种方式存储临时文件。