2011-01-12 18 views

Odpowiedz

22

Można to zrobić za pomocą poniższego kodu bez większego wysiłku przy użyciu Apache IO Commons.

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

Dzięki
Narendra

0

Czy jest coś takiego, czego szukasz?

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:

podstawie komentarzu dkarp jest to nieprawidłowe. Zgodnie z docs dla InputStream:

Zwraca liczbę bajtów, które można odczytać (lub pomijane) z tego strumienia wejściowego bez blokowania przez następny wywołującego metodę dla tego strumienia wejściowego. Następny dzwoniący może być tym samym wątkiem lub innym wątkiem.

Wygląda na to, że Costi ma poprawną odpowiedź tutaj.

+1

'InputStream.available()' jest nie nadaje się do tego celu. 'PipedInputStream' zwrócony z' DataHandler' zwraca liczbę bajtów dostępnych w buforze, zanim się zablokuje, a nie całkowity rozmiar. – dkarp

+0

Interesujące. Widziałem ten kod w wielu miejscach podczas korzystania z usług internetowych. – Casey

+0

Zaktualizowany, dzięki. – 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(); 
} 

Uwaga! ByteArrayOutputStream.toByteArray() tworzy kopię wewnętrznej tablicy bajtów.

11

Można to zrobić tak:

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

używam tego kodu:

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

operacja close powinna znajdować się w klauzuli finally lub należy użyć catch try 7 Java 7. –