如何将InputStream转换为DataHandler?
我正在研究一个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
时,我找不到创建“空” DataHandler
的方法,该DataHandler
返回非null的OutputStream
…
有没有人这样做过? 我很感激你能给我的任何帮助或者正确的方向。
我的方法是编写一个实现DataSource
的自定义类来封装你的InputStream
。 然后创建DataHandler
,为其提供创建的DataSource
。
“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 :
import javax.activation.DataSource; import java.io.OutputStream; import java.io.InputStream;
我也遇到过这个问题。 如果源数据是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
import javax.activation.DataHandler; import org.apache.axiom.attachments.ByteArrayDataSource;
希望能帮助到你!
请注意,DataSource的getInputStream必须每次调用时返回一个新的InputStream。 这意味着,你需要复制到某个地方。 有关详细信息,请参阅http://sofzh.miximages.com/java/view_bug.do”); MimeBodyPart logoBodyPart = new MimeBodyPart(); DataSource logoFileDataSource = new SpringResourceDataSource(logoImage); logoBodyPart.setDataHandler(new DataHandler(logoFileDataSource));
- 线程“main”中的exceptionjava.lang.NoClassDefFoundError:org / apache / hadoop / hbase / HBaseConfiguration
- 为什么用Java检查双重检查锁定?