有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

AmazonWeb服务java。木卫一。IOException:尝试读取aws s3存储桶上的关闭流

我想使用aws s3 bucket和java处理一个文件

我的代码

AmazonS3 s3 = AmazonS3ClientBuilder.standard().build();
// Get the object from the event and show its content type
String srcBucket = event.getRecords().get(0).getS3().getBucket().getName();
String srcKey = event.getRecords().get(0).getS3().getObject().getKey();

S3Object s3Object = s3.getObject(new GetObjectRequest(srcBucket, srcKey));
audioInputStream = s3Object.getObjectContent();

processInputStreamMethod1(audioInputStream);

processInputStreamMethod2(audioInputStream);

显然,我得到了一份工作

java.io.IOException: Attempted read on closed stream

处理这一问题的最佳方法(最佳实践)是什么?我应该用字节数组复制流、关闭流还是关闭对象

我不熟悉S3和InputStreams


共 (2) 个答案

  1. # 1 楼答案

    取决于方法1和方法2是否相关

    如果依赖。。。(即方法1需要按顺序在方法2之前运行-我无法从您的问题中看出原因)

    使流处理方法成为通过流(修改或未修改)的“过滤器”

    outputStream = processInputStreamMethod2(processInputStreamMethod1(audioInputStream))
    

    如果独立。。。(从您的示例中可以看出这一点,因为他们都试图直接读取“audioInputStream”)

    为什么这些事情是按顺序进行的

    下载到一个字节数组,并在此代码中在此数组中并行处理这两个方法

    audioInputStream = s3object.getObjectContent();
    int audioInputLength = s3object.getObjectMetadata().getContentLength();
    byte[] content = new byte[audioInputLength];
    
    int bytesRead = audioInputStream.read(content);
    
    //Can be in parallel 
    processInputStreamMethod1(content);
    processInputStreamMethod2(content);
    

    或者,如果您有自由度(带宽不是一个问题),是否有两个进程,每个进程都有自己的流

    这完全取决于你所处的环境

  2. # 2 楼答案

    我认为您不能读取输入流两次,但可以使用org进行复制。阿帕奇。平民木卫一。IOUtils到字节数组并重用它