Java 在同一时间写入和读取同一文件,并通过流式传输
我目前正在开发一个解决方案,用于通过Jersey将巨大文件从EMC Documentum流式传输到客户端。Documentum API允许以ByteArrayInputStream的形式获取文件,或将其保存到磁盘区域。使用ByteArrayInputStream是毫无疑问的,因为它将整个文件存储在内存中,这对于20GB的文件是不可接受的 因此,唯一的解决方案是将文件保存到磁盘区域(使用内部类和函数也是毫无疑问的)。为了加快速度,我想让Documentum将数据写入文件,同时从该文件中读取数据,并通过Jersey(通过在Jersey中返回InputStream)将数据流传输到客户端 问题是,如果读取线程比写入线程快,它将到达流的末尾并返回-1,这意味着流中没有更多的数据。当这种情况发生时,Jersey可能会停止流式传输文件,因为它认为它已经完成了 对于这类问题有什么最佳实践或库吗?我一直在互联网上寻找一些解决方法,但我觉得这应该是一个常见的问题,在Jersey API中可能已经存在我错过的解决方案或其他库。Jersey中是否存在一个类,您可以在到达流的末尾时返回并显式设置该类 Documentum API允许以ByteArrayInputStream的形式获取文件,或将其保存到磁盘区域 实际上,DFC为从content server传输内容提供了另外两个选项:Java 在同一时间写入和读取同一文件,并通过流式传输,java,jersey,inputstream,documentum,Java,Jersey,Inputstream,Documentum,我目前正在开发一个解决方案,用于通过Jersey将巨大文件从EMC Documentum流式传输到客户端。Documentum API允许以ByteArrayInputStream的形式获取文件,或将其保存到磁盘区域。使用ByteArrayInputStream是毫无疑问的,因为它将整个文件存储在内存中,这对于20GB的文件是不可接受的 因此,唯一的解决方案是将文件保存到磁盘区域(使用内部类和函数也是毫无疑问的)。为了加快速度,我想让Documentum将数据写入文件,同时从该文件中读取数据,并
EMC Documentum是DMS—文档管理系统。我确信您不能使用同一存储库对象来同时读/写该特定对象的同一版本
如果您确实需要坚持使用Documentum,那么您可以尝试在您使用的任何文件存储类型的文件存储位置访问真正的内容。再一次,这样你需要重新考虑安全问题之类的问题 EMC Documentum是DMS—文档管理系统。我确信您不能使用同一存储库对象来同时读/写该特定对象的同一版本
如果您确实需要坚持使用Documentum,那么您可以尝试在您使用的任何文件存储类型的文件存储位置访问真正的内容。再一次,这样你需要重新考虑安全问题之类的问题我不知道文档,但是从同一个文件中写入和读取通常不是要做的事情,除非文件的格式由相同大小的记录组成(然后你无论如何也不能在中间删除记录)。是这样吗?另外,请定义“巨大”?这些文件最多可达20 GB,并且将包含静态二进制数据。您是否有指向API的javadoc的链接?“同时写入和读取同一文件”:始终是一个坏主意。当然,Documentum方面没有解决方案。您可以微调UCF传输的处理方式,但部分加载、在同一文件上同时写入等都让我认为,至少在处理二进制文件时,这是一个很难实现的目标。我不知道Documentum,但从同一文件写入和读取数据通常不是一件容易的事情,除非文件的格式由相同大小的记录组成(然后,无论如何,你不能在中间删除记录)。是这样吗?另外,请定义“巨大”?这些文件最多可达20 GB,并且将包含静态二进制数据。您是否有指向API的javadoc的链接?“同时写入和读取同一文件”:始终是一个坏主意。当然,Documentum方面没有解决方案。您可以微调UCF传输的处理方式,但部分加载、在同一文件上同时写入等都让我认为,至少在处理二进制文件时,这是一个长期的尝试。
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();
}
}
InputStream stream = null;
try {
stream = ((ISysObjectInternal) object).getStream(null, 0, null, false);
// some logic here
} finally {
if (stream != null) {
stream.close();
}
}