2011-01-12 107 views

回答

22

可以通過使用下面的代碼來完成,而無需使用apache IO Commons。

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

感謝,
納倫德拉

0

是這樣的東西你在找什麼?

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

返回可以從該輸入流不被此輸入流的方法的下一呼叫者無阻塞讀取(或跳過)的字節數。下一個調用者可能是同一個線程或另一個線程。

它看起來像Costi在這裏有正確的答案。

+1

`InputStream.available()`是不適合於此目的。從'DataHandler`返回的`PipedInputStream`返回緩衝區之前緩衝區中可用的字節數,而不是總大小。 – dkarp 2011-01-12 17:27:36

+0

有趣。在處理Web服務時,我在很多地方都看到過這些代碼。 – Casey 2011-01-12 17:31:17

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

請注意,ByteArrayOutputStream.toByteArray()創建內部字節數組的副本。

11

你可以這樣說:

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

我用這個代碼:

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