作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在开发一个将文件存储在数据库中的 java web 应用程序。最初,我们通过简单地在结果集上调用 getBytes
来检索数据库中已经存在的文件:
byte[] bytes = resultSet.getBytes(1);
...
然后使用明显的构造函数将该字节数组转换为 DataHandler
:
dataHandler=new DataHandler(bytes,"application/octet-stream");
在我们开始尝试存储和检索更大的文件之前,这非常有效。将整个文件内容转储到一个字节数组中,然后从中构建一个 DataHandler
只需要太多内存。
我的直接想法是使用 getBinaryStream
检索数据库中的数据流,并以某种方式将该 InputStream
转换为 DataHandler
在节省内存的方式。不幸的是,似乎没有直接的方法可以将 InputStream
转换为 DataHandler
。我一直在玩的另一个想法是从 InputStream
读取数据 block 并将它们写入 DataHandler
的 OutputStream
。但是...当我调用 getOutputStream
时,我找不到创建返回非空 OutputStream
的“空”DataHandler
的方法...
有人做过吗?如果您能给我提供任何帮助或指引正确的方向,我将不胜感激。
最佳答案
“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;
关于java - 如何将 InputStream 转换为 DataHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2830561/
我是一名优秀的程序员,十分优秀!