将DataHandler转换为byte[]

12
我需要一个用于将 DataHandler 转换为 byte[] 的代码段。

该数据处理程序包含 Image

5个回答

30

使用Apache IO Commons,以下代码可以轻松实现。

final InputStream in = dataHandler.getInputStream();
byte[] byteArray=org.apache.commons.io.IOUtils.toByteArray(in);

13

你可以像这样做:

public static byte[] toBytes(DataHandler handler) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    handler.writeTo(output);
    return output.toByteArray();
}

4
private static final int INITIAL_SIZE = 1024 * 1024;
private static final int BUFFER_SIZE = 1024;

public static byte[] toBytes(DataHandler dh) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream(INITIAL_SIZE);
    InputStream in = dh.getInputStream();
    byte[] buffer = new byte[BUFFER_SIZE];
    int bytesRead;
    while ( (bytesRead = in.read(buffer)) >= 0 ) {
        bos.write(buffer, 0, bytesRead);
    }
    return bos.toByteArray();
}

请注意,ByteArrayOutputStream.toByteArray()会创建内部字节数组的副本。


2

我使用这段代码:

public static byte[] getContentAsByteArray(DataHandler handler) throws IOException {
    byte[] bytes = null;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    handler.writeTo(bos);
    bos.flush();
    bos.close();
    bytes = bos.toByteArray();

    return bytes;
}

关闭操作应该在finally子句中执行,或者您应该使用Java 7的try-catch。 - Christophe Roussy

0

你是在寻找类似这样的东西吗?

public static byte[] getBytesFromDataHandler(final DataHandler data) throws IOException {
    final InputStream in = data.getInputStream();
    byte out[] = new byte[0];
    if(in != null) {
        out = new byte[in.available()];
        in.read(out);
    } 
    return out;
}

更新:

根据dkarp的评论,这是不正确的。根据InputStream文档:

返回可以从此输入流读取(或跳过)的字节数,而不会被下一个调用此输入流方法的调用者阻塞。下一个调用者可能是同一线程或另一个线程。

看起来Costi在这里给出了正确的答案。


1
InputStream.available() 不适用于此目的。从 DataHandler 返回的 PipedInputStream 返回其缓冲区中可用字节数,在阻塞之前,并非总大小。 - dkarp
有趣。处理 Web 服务时我在很多地方看到过这段代码。 - Casey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接