首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将InputStream转换为DataHandler?

如何将InputStream转换为DataHandler?
EN

Stack Overflow用户
提问于 2010-05-14 05:49:22
回答 8查看 79.9K关注 0票数 28

我正在开发一个java web应用程序,其中的文件将存储在数据库中。最初,我们只是通过对结果集调用getBytes来检索数据库中已经存在的文件:

代码语言:javascript
复制
byte[] bytes = resultSet.getBytes(1);
...

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

代码语言:javascript
复制
dataHandler=new DataHandler(bytes,"application/octet-stream");

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

我的直接想法是使用getBinaryStream检索数据库中的数据流,并以某种方式以一种节省内存的方式将该InputStream转换为DataHandler。不幸的是,似乎没有一种直接的方法可以将InputStream转换为DataHandler。我一直在尝试的另一个想法是从InputStream读取数据块并将它们写入DataHandlerOutputStream。但是..。我找不到一种方法来创建一个在调用getOutputStream时返回非空OutputStream的“空”DataHandler ...

有人这么做过吗?如果你能给我任何帮助或指引我的方向,我将不胜感激。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-05-14 05:56:49

我的方法是编写一个自定义类,实现包装InputStreamDataSource。然后创建DataHandler,并为其提供创建的DataSource

票数 17
EN

Stack Overflow用户

发布于 2012-05-28 19:02:35

来自"Kathy Van Stone“的答案的实现:

首先创建助手类,该类从InputStream创建DataSource:

代码语言:javascript
复制
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:

代码语言:javascript
复制
DataHandler dataHandler = new DataHandler(new InputStreamDataSource(inputStream))

导入

代码语言:javascript
复制
import javax.activation.DataSource;
import java.io.OutputStream;
import java.io.InputStream;
票数 21
EN

Stack Overflow用户

发布于 2010-11-30 01:23:02

我也遇到了这个问题。如果您的源数据是byte[],Axis已经有了一个包装InputStream的类并创建了一个DataHandler对象。以下是代码

代码语言:javascript
复制
//this constructor takes byte[] as input
ByteArrayDataSource rawData= new ByteArrayDataSource(resultSet.getBytes(1));
DataHandler data= new DataHandler(rawData);
yourObject.setData(data);

相关进口

代码语言:javascript
复制
import javax.activation.DataHandler;
import org.apache.axiom.attachments.ByteArrayDataSource;

希望它能帮上忙!

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2830561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档