我需要一个用于将
DataHandler
转换为 byte[]
的代码段。
该数据处理程序包含 Image
。
DataHandler
转换为 byte[]
的代码段。
该数据处理程序包含 Image
。
使用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();
}
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()会创建内部字节数组的副本。
我使用这段代码:
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;
}
你是在寻找类似这样的东西吗?
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在这里给出了正确的答案。
InputStream.available()
不适用于此目的。从 DataHandler
返回的 PipedInputStream
返回其缓冲区中可用字节数,在阻塞之前,并非总大小。 - dkarp