有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将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。但是我找不到一种方法来创建一个“空的”DataHandler,当我调用getOutputStream时,它返回一个非空的OutputStream

有人这样做过吗?如果你能给我任何帮助,或者给我提供正确的方向,我将不胜感激


共 (4) 个答案

  1. # 1 楼答案

    我也遇到了这个问题。如果源数据是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 javax.activation.DataHandler;
    import org.apache.axiom.attachments.ByteArrayDataSource;
    

    希望有帮助

  2. # 3 楼答案

    (bugs_uu)代码对我不适用。我使用DataSource创建电子邮件附件(从具有inputStreamname的对象)和丢失的附件内容。 看来Stefan是对的,每次都必须返回新的inputStream。至少在我的特殊情况下。下一个实现将处理以下问题:

    public class InputStreamDataSource implements DataSource {
    
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        private final String name;
    
        public InputStreamDataSource(InputStream inputStream, String name) {
            this.name = name;
            try {
                int nRead;
                byte[] data = new byte[16384];
                while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
                    buffer.write(data, 0, nRead);
                }
    
                buffer.flush();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        @Override
        public String getContentType() {
            return new MimetypesFileTypeMap().getContentType(name);
        }
    
        @Override
        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(buffer.toByteArray());
        }
    
        @Override
        public String getName() {
            return name;
        }
    
        @Override
        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Read-only data");
        }
    
    }
    
  3. # 4 楼答案

    《凯西·范·斯通》中答案的实现:

    首先创建助手类,该类从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;