如何将输入流转换为数据处理程序?

2022-09-01 11:31:23

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

byte[] bytes = resultSet.getBytes(1);
...

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

dataHandler=new DataHandler(bytes,"application/octet-stream");

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

我的直接想法是检索数据库中的数据流,并以某种方式将其转换为内存效率高的方式。不幸的是,似乎没有直接的方法将 a 转换为 .我一直在玩的另一个想法是从 中读取数据块,并将它们写入 .但。。。我找不到一种方法来创建一个“空”,当我调用...getBinaryStreamInputStreamDataHandlerInputStreamDataHandlerInputStreamOutputStreamDataHandlerDataHandlerOutputStreamgetOutputStream

有人这样做过吗?我很感激你能给我的任何帮助,或者朝着正确的方向前进。


答案 1

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

首先创建帮助器类,该类从 InputStream 创建数据源:

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;

答案 2

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

//this constructor takes byte[] as input
ByteArrayDataSource rawData= new ByteArrayDataSource(resultSet.getBytes(1));
DataHandler data= new DataHandler(rawData);
yourObject.setData(data);

相关进口

import javax.activation.DataHandler;
import org.apache.axiom.attachments.ByteArrayDataSource;

希望它有帮助!


推荐