【发布时间】:2010-12-14 23:29:18
【问题描述】:
我想将内容从存储在一个文档库中的一个对象复制到存储在另一个文档库中的另一个对象。我不想创建文件,因为我有超过 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 heap space。
如果我通过设置 Xmx 最大值来调整 JVM,之前的指令是可以的,但是 java.lang.OutOfMemoryError: Java heap space 与 targetObj.setContent(baos); 发生。
只有 8332175 字节的大内容... (7.94 MB)
知道有什么问题吗?从 ByteArrayInputStream 复制到 ByteArrayOutputStream 的更好方法?还有什么?
一些 Documentum API
获取内容
公共 ByteArrayInputStream getContent() 抛出 DfException
将此对象的内容从 Documentum 服务器复制到 ByteArrayInputStream >对象中。
以下代码示例演示如何将对象内容从 >Documentum 服务器复制到内存中:
IDfSysObject sysObj = (IDfSysObject)session.getObject(new DfId("0900d5bb8001f900")); ByteArrayInputStream bais = sysObj.getContent(); if (bais.available() > 0) { // Data successfully fetched from the server... }返回: 包含对象内容的 ByteArrayInputStream 对象。 抛出: DfException - 如果发生服务器错误。
和
设置内容
public boolean setContent(ByteArrayOutputStream 内容) 抛出 DfException
为对象设置新内容。当您想要设置驻留在工作内存中的数据时,请使用此方法。
以下代码示例演示如何将驻留在内存中的内容设置为新文档:
IDfSysObject sysObj = (IDfSysObject)sess.newObject("dm_document"); sysObj.setObjectName("testDoc"); sysObj.setContentType("crtext"); byte b[] = {35,36,37,38,39}; ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(b, 0, 5); sysObj.setContent(out); sysObj.save();参数: content - 作为 ByteArrayOutputStream 的内容。 抛出: DfException - 如果发生服务器错误。
【问题讨论】:
-
你是从 IOUtils 还是从 setContent() 获得 OutOfMemory 的?
-
你在哪里发生异常。并请添加到 documentum api 的链接
-
"当您想要设置驻留在工作内存中的数据时,请使用此方法。"这听起来像是日期不在工作记忆中的另一种情况......
-
@jitter:错误和严重的错误! Documentum setContent 指令发生异常......根本不是 IOUtils.copy()。很抱歉这个错误。
-
@Thilo :是的,还有另一种方法可以设置存储在 FS 中的文件的内容……但我会阻止这种情况,以保持客户的轻松。
标签: java copy apache-commons documentum