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

Java 我如何等待InputStream是否已收到所有要进一步处理的数据?,java,amazon-s3,inputstream,outputstream,Java,Amazon S3,Inputstream,Outputstream,我必须将数据写入amazons3,并使用OutputStream将数据写入其InputStream,如下所示 final PipedOutputStream outputStream = new PipedOutputStream(); final PipedInputStream inputStream; try { inputStream = new PipedInputStream(outputStream); new Thread(

我必须将数据写入
amazons3
,并使用
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

一旦写入端关闭其
OutputStream
,则
InputStream
将传递尚未读取的任何字节,之后的下一个字节将返回-1以指示输入结束

值字节以
int
的形式返回,范围为0到255。如果由于到达流的结尾而没有字节可用,则返回值-1。此方法会一直阻塞,直到输入数据可用、检测到流结束或引发异常为止


如果边写入在完成时失败,则读卡器将阻止等待更多输入,直到写入过程结束。

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

byte[] array = IOUtils.toByteArray(inputStream);
InputStream newInputStream = new ByteArrayInputStream(array);

来自apache commons。

这是否意味着inputStream一次保存所有数据
outputSteam.close()
被调用?@daydreamer,除非流库有可怕的错误,否则编写者可以安全地调用
close
,而读取器仍然能够处理所有写入的字节。@daydreamer,当你缓冲的时候,臭虫就会潜入其中。如果将
OutputStream
包装到缓冲输出流中,则需要关闭/刷新缓冲输出流,而不仅仅是它包装的流。为什么需要等待?为什么不等待就不能开始处理?如果数据还没有准备好,当前线程只是暂停,直到输入流有新数据。为什么要使用管道?在这种情况下没有优势。只需在当前线程中执行所有I/O即可。