2011-01-12 7 views

Antwort

22

Es kann durch Verwendung von unten Code ohne viel Aufwand mit Apache IO Commons getan werden.

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

Danke,
Narendra

0

Ist etwas wie das, wonach Sie suchen?

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:

Basierend auf dkarp Kommentar dies ist falsch. Nach der Dokumentation für InputStream:

die Anzahl der Bytes zurück, die (oder übersprungen) aus diesem Eingangsstrom durch den nächsten Anrufer eines Verfahren für diesen Eingangsstrom gelesen werden können, ohne zu blockieren. Der nächste Aufrufer könnte derselbe Thread oder ein anderer Thread sein.

Es sieht so aus, als hätte Costi hier die richtige Antwort.

+1

'InputStream.available()' ist nicht geeignet für diesen Zweck. Der von dem 'DataHandler' zurückgegebene' PipedInputStream' gibt die Anzahl der verfügbaren Bytes in seinem Puffer zurück, bevor er blockiert, nicht die Gesamtgröße. – dkarp

+0

Interessant. Ich habe diesen Code an vielen Stellen im Umgang mit Webdiensten gesehen. – Casey

+0

Aktualisiert, danke. – 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(); 
} 

Vorsicht, dass ByteArrayOutputStream.toByteArray() erzeugt eine Kopie des internen Byte-Array.

11

Sie können es wie folgt tun:

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

ich diesen Code verwenden:

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

die close-Operation sollte in einer finally-Klausel sein oder Sie sollten einen Java 7 try catch verwenden. –