gpt4 book ai didi

java - 同时写入和读取同一个文件并通过 Jersey 流式传输

转载 作者:行者123 更新时间:2023-11-29 05:07:03 25 4
gpt4 key购买 nike

我目前正在研究一种解决方案,用于将大量文件从 EMC Documentum 流式传输到客户端,并通过 Jersey。 Documentum 的 API 允许将文件作为 ByteArrayInputStream 获取或将其保存到磁盘区域。使用 ByteArrayInputStream 是不可能的,因为它将整个文件存储在内存中,这对于 20 GB 的文件来说是 Not Acceptable 。

因此唯一的解决办法是将文件保存到磁盘区域(使用内部类和函数也不在话下)。为了让它更快,我想让 Documentum 将数据写入文件,同时从该文件读取数据,并通过 Jersey 将其流式传输到客户端(通过在 Jersey 返回一个 InputStream)。

问题是,如果读取线程比写入线程快,它将到达流的末尾并返回 -1,这意味着流中没有更多数据。当这种情况发生时,Jersey 可能会停止流式传输文件,因为它认为它已完成。

是否有针对此类问题的最佳实践或库?我一直在互联网上寻找一些解决方法,但感觉这应该是一个常见问题,并且我错过的 Jersey API 或其他一些库中可能已经存在解决方案。 Jersey 中是否存在可以在到达流末尾时返回并显式设置的类?

最佳答案

The API for Documentum allows either to get the file as a ByteArrayInputStream or to save it down to a disk area

实际上,DFC 提供了另外两个从内容服务器传输内容的选项:

  1. getCollectionForContent() 方法(记录不完整,但存在于公共(public) API 中):

    IDfCollection collection = null;
    try {
    collection = object.getCollectionForContent(null, 0);
    long total = 0;
    while (collection.next()) {
    // 64K chunk
    ByteArrayInputStream baos = collection.getBytesBuffer(null,
    null, null, 0);
    }
    } finally {
    if (collection != null) {
    collection.close();
    }
    }
  2. ISysObjectInternal 接口(interface)中的 getStream() 方法(不是公共(public) API 的一部分,但被 EMC 应用程序广泛使用):

    InputStream stream = null;
    try {
    stream = ((ISysObjectInternal) object).getStream(null, 0, null, false);

    // some logic here

    } finally {
    if (stream != null) {
    stream.close();
    }
    }

关于java - 同时写入和读取同一个文件并通过 Jersey 流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30048130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com