我正在开发一个java web应用程序,其中的文件将存储在数据库中。最初,我们只是通过对结果集调用getBytes来检索数据库中已经存在的文件:
byte[] bytes = resultSet.getBytes(1);
...然后使用明显的构造函数将此字节数组转换为DataHandler:
dataHandler=new DataHandler(bytes,"application/octet-stream");这很有效,直到我们开始尝试存储和检索更大的文件。将整个文件内容转储到一个字节数组中,然后构建一个DataHandler,这只需要太多的内存。
我的直接想法是使用getBinaryStream检索数据库中的数据流,并以某种方式以一种节省内存的方式将该InputStream转换为DataHandler。不幸的是,似乎没有一种直接的方法可以将InputStream转换为DataHandler。我一直在尝试的另一个想法是从InputStream读取数据块并将它们写入DataHandler的OutputStream。但是..。我找不到一种方法来创建一个在调用getOutputStream时返回非空OutputStream的“空”DataHandler ...
有人这么做过吗?如果你能给我任何帮助或指引我的方向,我将不胜感激。
发布于 2010-05-14 05:56:49
我的方法是编写一个自定义类,实现包装InputStream的DataSource。然后创建DataHandler,并为其提供创建的DataSource。
发布于 2012-05-28 19:02:35
来自"Kathy Van Stone“的答案的实现:
首先创建助手类,该类从InputStream创建DataSource:
public class InputStreamDataSource implements DataSource {
private InputStream inputStream;
public InputStreamDataSource(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public InputStream getInputStream() throws IOException {
return inputStream;
}
@Override
public OutputStream getOutputStream() throws IOException {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public String getContentType() {
return "*/*";
}
@Override
public String getName() {
return "InputStreamDataSource";
}
}然后,您可以从InputStream创建DataHandler:
DataHandler dataHandler = new DataHandler(new InputStreamDataSource(inputStream))导入
import javax.activation.DataSource;
import java.io.OutputStream;
import java.io.InputStream;发布于 2010-11-30 01:23:02
我也遇到了这个问题。如果您的源数据是byte[],Axis已经有了一个包装InputStream的类并创建了一个DataHandler对象。以下是代码
//this constructor takes byte[] as input
ByteArrayDataSource rawData= new ByteArrayDataSource(resultSet.getBytes(1));
DataHandler data= new DataHandler(rawData);
yourObject.setData(data);相关进口
import javax.activation.DataHandler;
import org.apache.axiom.attachments.ByteArrayDataSource;希望它能帮上忙!
https://stackoverflow.com/questions/2830561
复制相似问题