Мне нужен код snippt для преобразования DataHandler
в byte[]
.преобразование DataHandler в байт []
Этот обработчик данных содержит Image
.
Мне нужен код snippt для преобразования DataHandler
в byte[]
.преобразование DataHandler в байт []
Этот обработчик данных содержит Image
.
Это можно сделать, используя код ниже без особых усилий, используя apache IO Commons.
final InputStream in = dataHandler.getInputStream();
byte[] byteArray=org.apache.commons.io.IOUtils.toByteArray(in);
Спасибо,
нарендра
Что-то вроде этого, что вы ищете?
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;
}
UPDATE:
Основываясь на комментарий 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() создает копию внутреннего массива байтов.
Вы можете сделать это следующим образом:
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;
}
операция закрытия должна быть в условии finally или вы должны использовать попытку try 7 Java. –
'InputStream.available()' является не подходит для этой цели. «PipedInputStream», возвращаемый из «DataHandler», возвращает количество байтов, доступных в его буфере, прежде чем он блокирует, а не общий размер. – dkarp
Интересно. Я видел этот код во многих местах при работе с веб-службами. – Casey
Обновлено, спасибо. – Casey