其他分享
首页 > 其他分享> > 使用apache IOUtils.copy()和setContent()复制documentum内容

使用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 DfException

Copies 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 DfException

Sets 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