如何将InputStream转换为DataHandler?

pco*_*rey 23 java inputstream outputstream

我正在研究一个java Web应用程序,其中文件将存储在数据库中.最初我们通过调用getBytes结果集来检索DB中已有的文件:

byte[] bytes = resultSet.getBytes(1);
...
Run Code Online (Sandbox Code Playgroud)

然后DataHandler使用明显的构造函数将此字节数组转换为a :

dataHandler=new DataHandler(bytes,"application/octet-stream");
Run Code Online (Sandbox Code Playgroud)

这很有用,直到我们开始尝试存储和检索更大的文件.将整个文件内容转储到一个字节数组中然后构建一个DataHandler只需要太多内存.

我的直接想法是在数据库中检索数据流,getBinaryStream并以某种方式将其InputStream转换DataHandler为内存有效的方式.不幸的是,似乎没有直接的方法将一个转换InputStream成一个DataHandler.另一个想法我一直在玩从读取数据块InputStream,并将其写入OutputStreamDataHandler.但是...... 当我打电话时,我无法找到一种方法来创建一个DataHandler返回非空的"空" ...OutputStreamgetOutputStream

有没有人这样做过?我很感激你能给我的任何帮助或者正确的方向.

bug*_*gs_ 18

"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";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以从InputStream创建DataHandler:

DataHandler dataHandler = new DataHandler(new InputStreamDataSource(inputStream))
Run Code Online (Sandbox Code Playgroud)

进口:

import javax.activation.DataSource;
import java.io.OutputStream;
import java.io.InputStream;
Run Code Online (Sandbox Code Playgroud)


Kat*_*one 16

我的方法是编写一个实现DataSource包装你的自定义类InputStream.然后创建DataHandler给它创建的DataSource.


小智 16

我也遇到过这个问题.如果您的源数据是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);
Run Code Online (Sandbox Code Playgroud)

相关进口

import javax.activation.DataHandler;
import org.apache.axiom.attachments.ByteArrayDataSource;
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 由于它将所有数据加载到内存中,因此在管理大数据时会出现问题. (6认同)