使用 PipedOutputStream 时线程竞争条件挂起

Thread race condition just hangs while using PipedOutputStream

我正在使用管道输出流将 OutputStream 转换为 InputStream,因为 AWS java sdk 不允许使用 OutputStreams[=14= 将对象放在 S3 上]

我正在使用下面的代码,但是,它会间歇性地挂起。此代码位于 Web 应用程序中。目前应用程序没有负载...我只是在我的个人计算机上试用它。

ByteArrayOutputStream os = new ByteArrayOutputStream();
PipedInputStream inpipe = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(inpipe);
try {
   String xmpXml = "<dc:description>somedesc</dc:description>"
   JpegXmpRewriter rewriter = new JpegXmpRewriter();
   rewriter.updateXmpXml(isNew1,os, xmpXml); 
      new Thread(new Runnable() {
          public void run () {
              try {
                  // write the original OutputStream to the PipedOutputStream
                  println "starting writeto"
                  os.writeTo(out);
                  out.close();
                  println "ending writeto"
              } catch (IOException e) {
                  System.out.println("Some exception)
              }
          }
      }).start();
      ObjectMetadata metadata1 = new ObjectMetadata();
      metadata1.setContentLength(os.size());
      client.putObject(new PutObjectRequest("test-bucket", "167_sample.jpg", inpipe, metadata1));
    }
 catch (Exception e) { 
      System.out.println("Some exception")
 }
 finally {
    isNew1.close()
    os.close()
 }

不用担心启动另一个线程的复杂性,实例化两个并发 类,然后将数据从一个线程传递到另一个线程,所有这些都只是为了解决提供的 JDK 中的一个小限制API,您应该只创建 ByteArrayOutputStream:

的简单特化
class BetterByteArrayOutputStream extends ByteArrayOutputStream {
    public ByteArrayInputStream toInputStream() {
        return new ByteArrayInputStream(buf, 0, count);
    }
}

这会将其转换为不进行复制的输入流。