使用apache IOUtils.copy()和setContent()复制documentum内容
作者:互联网
我想将内容从一个docbase中存储的一个对象复制到另一个docbase中存储的另一个对象.我不想创建文件,因为我要复制超过300个k文件.以下是我的代码的一部分:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(source.getContent(), baos);
[...]
targetObj.setContent(baos); // Documentum DFC
targetObj.save(); // Documentum DFC
如果我不调优JVM,请IOUtils.copy(source.getContent(),baos);给出java.lang.OutOfMemoryError:Java堆空间.
如果我通过设置Xmx max值来调整JVM,则前一条指令没问题,但是java.lang.OutOfMemoryError:Java堆空间与targetObj.setContent(baos);一起出现.
只有8332175字节的大内容……(7.94 MB)
知道什么是错的吗?从ByteArrayInputStream复制到ByteArrayOutputStream的更好方法是什么?别的什么?
一些Documentum API
getContent
public ByteArrayInputStream getContent()
throws DfExceptionCopies this object’s content from the Documentum server into a ByteArrayInputStream >object.
The following code example demonstrates how to copy an objects content from the >Documentum server into memory:
06001
Returns:
a ByteArrayInputStream object containing the objects content.
Throws:
DfException – if a server error occurs.
和
setContent
public boolean setContent(ByteArrayOutputStream content)
throws DfExceptionSets new content to an object. Use this method when you want to set data that resides >in working memory.
The following code example demonstrates how to set content residing in memory to a new document:
06002
Parameters:
content – the content as a ByteArrayOutputStream.
Throws:
DfException – if a server error occurs.
解决方法:
只要您使用ByteArrayOutputStream,数据就必须适合内存.
我对Documentum一无所知,但是有没有targetObj.setContent(File)或setContent(InputStream),这样你就可以避免将整个块读入一个byte []?
(8MB并不是那么大,也许你可以调整Java堆空间.它也可以帮助预先调整BAOS使用的缓冲区大小,你可以将初始大小传递给它的构造函数)
更新:您确定setContent采用ByteArray输出流吗?通常,setter会从InputStream中读取.
标签:documentum,java,copy,apache-commons 来源: https://codeday.me/bug/20190827/1742368.html