如何将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读取数据块并将它们写入DataHandlerOutputStream 。 但是……当我调用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));