Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将DataHandler转换为字节[]_Java_Javax.activation_Datahandler - Fatal编程技术网

Java 将DataHandler转换为字节[]

Java 将DataHandler转换为字节[],java,javax.activation,datahandler,Java,Javax.activation,Datahandler,我需要一个代码snippt,用于将DataHandler转换为byte[] 此数据处理程序包含图像这样的内容是您正在寻找的吗 public static byte[] getBytesFromDataHandler(final DataHandler data) throws IOException { final InputStream in = data.getInputStream(); byte out[] = new byte[0]; if(in != null

我需要一个代码snippt,用于将
DataHandler
转换为
byte[]


此数据处理程序包含
图像

这样的内容是您正在寻找的吗

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
的文档:

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

看起来科斯蒂在这里有正确的答案

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()会创建内部字节数组的副本。

可以通过使用以下代码来完成,而无需使用apache IO Commons

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

您可以这样做:

public static byte[] toBytes(DataHandler handler) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    handler.writeTo(output);
    return output.toByteArray();
}
我使用以下代码:

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;
}

InputStream.available()
不适用于此目的。从
DataHandler
返回的
PipedInputStream
返回其块前缓冲区中可用的字节数,而不是总大小。有趣的是。在处理web服务时,我在很多地方都看到过这段代码。close操作应该在finally子句中,或者应该使用Java7 try-catch。