writeTo PipedOutputStream 只是挂起

2023-12-29

我的目标是:

  1. 从 S3 读取文件,
  2. 更改其元数据
  3. 再次推送到S3

AWS java SDK 不允许推送输出流。因此,我必须将outputstream从步骤2到inputstream。为此我决定使用PipedInputStream.

但是,我的代码只是挂在writeTo(out);步。此代码位于 Grails 应用程序中。当代码挂起时CPU不是处于高消耗状态:

import org.apache.commons.imaging.formats.jpeg.xmp.JpegXmpRewriter;

AmazonS3Client client = nfile.getS3Client() //get S3 client
S3Object object1 = client.getObject(
                  new GetObjectRequest("test-bucket", "myfile.jpg")) //get the object. 

InputStream isNew1 = object1.getObjectContent(); //create input stream
ByteArrayOutputStream os = new ByteArrayOutputStream();
PipedInputStream inpipe = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(inpipe);

try {
   String xmpXml = "<x:xmpmeta>" +
    "\n<Lifeshare>" +
    "\n\t<Date>"+"some date"+"</Date>" +
    "\n</Lifeshare>" +
    "\n</x:xmpmeta>";/
   JpegXmpRewriter rewriter = new JpegXmpRewriter();
   rewriter.updateXmpXml(isNew1,os, xmpXml); //This is step2

   try {
new Thread(new Runnable() {
    public void run () {
        try {
            // write the original OutputStream to the PipedOutputStream
            println "starting writeto"
            os.writeTo(out);
            println "ending writeto"
        } catch (IOException e) {
            // logging and exception handling should go here
        }
    }
}).start();

         ObjectMetadata metadata = new ObjectMetadata();
         metadata.setContentLength(1024); //just testing
         client.putObject(new PutObjectRequest("test-bucket", "myfile_copy.jpg", inpipe, metadata));
         os.writeTo(out);

         os.close();
         out.close();
   } catch (IOException e) {
         // logging and exception handling should go here
   }

}
finally {
   isNew1.close()
   os.close()
   out.close()
}

上面的代码只是打印starting writeto并挂起。它不打印ending writeto

Update通过把writeTo在一个单独的线程中,文件现在被写入 S3,但是,仅写入了其中的 1024 个字节。该文件不完整。如何将输出流中的所有内容写入 S3?


当您执行 os.writeTo(out) 时,它会尝试将整个流刷新到out,并且由于还没有人从其另一侧(即内管道)读取数据,因此内部缓冲区已满并且线程停止。

您必须在写入数据之前设置读取器,并确保它在单独的线程中执行(请参阅 PipedOutputStream 上的 javadoc)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

writeTo PipedOutputStream 只是挂起 的相关文章

随机推荐

  • 在写入文件之前检查文件是否可写

    我正在尝试创建一个脚本 在写入文件之前检查文件是否可写 确保脚本不会过早退出 我已经走到这一步了 meta stream get meta data file while is writable meta uri sleep rand 0
  • 在元素不存在的地方插入数组,否则更新它(有多个条件)

    id 1 name apple option weight 10 size 40 price 40 weight 40 size 40 price 200 如果重量或大小不同 我想在数组中更新插入新对象 如果大小和重量都匹配 我想更新它 我
  • Bootstrap 弹出框不起作用

    引导弹出窗口没有显示我的页面 这是我的 HTML
  • 在 bash 中,如何从由 tee 管道传输的函数中退出脚本?

    我试图理解为什么每当我使用function 2 gt 1 tee a LOGtee 在函数中创建一个无法通过简单退出的子 shellexit 1 如果我不使用tee它工作正常 下面的例子 bin bash LOG root log log
  • XElement 无法加载带有重音字符的文件

    我有一个相当好奇的问题 使用 XElement 加载方法加载 html 文档 使用 HTML Tidy 检查格式良好 它对于英语文档绝对完美 但是转到法语和西班牙语文档时 我会看到一个XML 异常 XML Exception Invalid
  • Node JS - 读取文件属性

    我正在使用 NWJS 开发桌面应用程序 我需要获取 exe 文件的文件属性 我尝试过使用 npm 属性模块https github com gagle node properties https github com gagle node
  • 在我的例子中奇怪的 ul 列表问题

    我的 ul 列表有一个奇怪的问题 我有类似的东西 section h1 Slide h1 div class break div div a href img src images left nav png a div ul li img
  • numpy 在数组开头添加元素并在末尾删除元素

    在 numpy 数组的开头添加新元素并删除该数组的最后一个元素的最佳方法是什么 我使用了这样的代码 tmp np array 1 2 3 print tmp tmp np insert tmp 0 0 tmp np delete tmp 1
  • iOS PWA Safari 打不开页面?

    如果我在我的 iPad Pro 11 英寸上执行以下操作 关闭 Wifi 并打开飞行模式 打开我们的 iOS PWA 它说 Safari 无法打开该页面 http www example com http www example com 因
  • 将数组作为指针引用

    我似乎无法理解数组或二维数组上不同声明之间的区别 例如 void swap char a char b char t a a b b t int main int argc char argv char a asher char b sab
  • 从可变参数类型列表中获取最大的类型

    我正在尝试从可变参数模板类型列表中获取最大的类型 我得到了意想不到的结果 Bigger between two types template
  • C语言中fflush(stdin)有什么用? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有以下程序 include
  • 在 Python 3 中使用 OpenPyXL 复制整个列

    我正在尝试使用 OpenPyXL 复制整个列 谷歌似乎提供了很多使用范围的示例 但不是针对整个列 我有一个工作簿 其中只有一个工作表 A 列和 JX 列中包含大量日期 A 包含每月日期 JX 包含季度日期 我希望将每月日期列 在 A A 中
  • Java 中转换为泛型类型时的警告

    我有一些通用代码 我无法弄清楚如何合法地防止收到警告 我目前正在使用 SuppressWarnings unchecked 因为似乎在没有警告的情况下无法完成泛型类型的转换 我怎样才能摆脱注释 我所拥有的是 public MyObject
  • 部分分组在子文件夹中

    我的观点依赖于几个部分 为了对这些部分进行分组 我将它们移动到一个子文件夹中 但是当我调用部分时 我得到了一个Missing template client demographics age erb in view path app vie
  • Linq 确实比 Foreach 更快吗?

    如果您搜索 Linq 比 Foreach 更快 那么答案始终是 no foreach is 我还发现了另一个 stackoverflow 问题提问者没有做 热身 https stackoverflow com questions 17147
  • 检测因用户操作而中断的 Ajax 请求

    我想检测 Ajax 调用正在进行中然后由于某些用户操作 例如用户导航到另一个页面 而中断的情况 我可以看到 当发生这种情况时 我的 onreadystatechange 处理程序会被调用 并显示 readyState 4 DONE 和 st
  • CanBeNull 和 ReSharper - 将其与异步任务一起使用?

    我最近发现你可以使用 CanBeNull C 中的注释告诉 ReSharper 和其他插件 某个方法可以返回 null 这很棒 因为当我没有处理这些情况时 它会让 ReSharper 提醒我 然而 对于async返回 a 的方法Task o
  • MongoDB 按字段 A 排序,如果字段 B != null,否则按字段 C 排序

    我面临这个挑战 检索按字段 A 排序的文档如果字段 B 存在 不为空 否则按字段排序 C 在 SQL 世界中 我会执行两个查询并创建一个 UNION SELECT 但我不知道如何从 Mongo 开始 map reduce 是正确的方法吗 或
  • writeTo PipedOutputStream 只是挂起

    我的目标是 从 S3 读取文件 更改其元数据 再次推送到S3 AWS java SDK 不允许推送输出流 因此 我必须将outputstream从步骤2到inputstream 为此我决定使用PipedInputStream 但是 我的代码