2011-01-12 20 views

Respuesta

22

Se puede hacer utilizando el código siguiente sin mucho esfuerzo usando apache IO Commons.

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

Gracias,
Narendra

0

¿Es esto lo que está buscando?

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

ACTUALIZACIÓN:

Basado en el comentario de dkarp esto es incorrecto. De acuerdo con la documentación para InputStream:

Devuelve el número de bytes que se pueden leer (o saltadas) de este flujo de entrada sin bloquear por la siguiente llamada de un método de este flujo de entrada. La siguiente persona que llama podría ser el mismo hilo u otro hilo.

Parece que Costi tiene la respuesta correcta aquí.

+1

'InputStream.available()' es no apropiado para este propósito. El 'PipedInputStream' devuelto por' DataHandler' devuelve la cantidad de bytes disponibles en su búfer antes de que se bloquee, no el tamaño total. – dkarp

+0

Interesante. He visto este código en muchos lugares cuando se trata de servicios web. – Casey

+0

Actualizado, gracias. – Casey

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

Mira que ByteArrayOutputStream.toByteArray() crea una copia de la matriz de bytes interna.

11

Puede hacerlo de esta manera:

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

utilizo este código:

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

la operación de cierre debe estar en una cláusula finally o debe usar una captura de prueba de Java 7. –