如何等待我的InputStream是否已收到所有要处理的数据?

时间:2012-09-05 20:51:40

标签: java amazon-s3 inputstream outputstream

我必须将数据写入Amazon S3并使用OutputStream将数据写入其InputStream,如下所示

    final PipedOutputStream outputStream = new PipedOutputStream();
    final PipedInputStream inputStream;
    try {
        inputStream = new PipedInputStream(outputStream);
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        PutObjectRequest putObjectRequest = new PutObjectRequest(S3EnvironmentConfigurator.BucketTypes.source.name(), getProposalName(uniqueId), inputStream, null);
                        amazonS3Client.putObject(putObjectRequest);
                        try {
                            inputStream.close();
                        } catch (IOException e) {

                        }
                    }
                }
        ).start();

现在amazonS3Client.putObject看起来像

  @Override
    public PutObjectResult putObject(@Nonnull final PutObjectRequest putObjectRequest)
            throws AmazonClientException, AmazonServiceException {

        try {
            InputStreamReader is = new InputStreamReader(new GZIPInputStream(putObjectRequest.getInputStream()));
            StringBuilder sb=new StringBuilder();
            BufferedReader br = new BufferedReader(is);
            String read = br.readLine();
            while(read != null) {
                System.out.println(read);
                read =br.readLine();

            }
        } catch (IOException e) {
            //ignore
        }
    return super.putObject(putObjectRequest);
  • 目前在控制台上打印出内容

所需

我该怎么做

while (putObjectRequest.getInputStream() is not completely available) {
   // wait
}

// write inputStream, the entire InputStream is ready and available for processing

2 个答案:

答案 0 :(得分:1)

一旦边写入关闭其OutputStreamInputStream将传递尚未读取的任何字节,然后下一个read()将返回-1以指示结束输入。

  

值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常。

如果在完成时边写不能close(),那么在写入过程结束之前,读者将阻止等待更多输入。

答案 1 :(得分:1)

您可以将所有数据复制到字节缓冲区,从而确保您已从输入流中读取所有数据。然后基于此缓冲区创建新的输入流。类似的东西:

byte[] array = IOUtils.toByteArray(inputStream);
InputStream newInputStream = new ByteArrayInputStream(array);
来自apache commons的

IOUtils