2010-03-12 75 views
23

我想從Android Uri獲取一個字節數組。Android - 從Uri到InputStream到字節數組?

我有以下代碼,但它始終告訴我字節數組長度爲61字節,即使該文件相當大 - 所以我認爲它可能會將Uri 字符串轉換爲字節數組,比文件:(

Log.d(LOG_TAG, "fileUriString = " + fileUriString); 
    Uri tempuri = Uri.parse(fileUriString); 
    InputStream is = cR.openInputStream(tempuri); 
    String str=is.toString(); 
    byte[] b3=str.getBytes(); 
    Log.d(LOG_TAG, "len of data is " + imageByteArray.length 
    + " bytes"); 

請有人可以幫我找出做什麼

輸出爲 「fileUriString =內容://媒體/外部/視頻/媒體/ 53」?和「LEN的數據是61字節「。

謝謝!

+0

什麼是'cR'?你問如何「從一個Uri到一個InputStream」,但你已經有了一個'InputStream',而沒有說明你是如何得到它的。 – Vince 2015-04-17 17:05:16

+0

@Vince'cR'是ContentResolver類的一個實例 – mbelsky 2015-10-02 11:24:52

回答

57

is.toString()將爲您提供InputStream實例的字符串表示形式,而不是其內容。

您需要從InputStream讀取()字節到您的數組中。有兩種讀取方法可以做到這一點,read()一次只讀取一個字節,read(byte[] bytes)從InputStream讀取字節到您傳遞給它的字節數組中。


更新:讀取因爲一個InputStream不具有長度這樣的字節,則需要讀取的字節中,直到有一無所有。我建議爲自己創建一個方法,這是一個很好的簡單起點(這是我至少會在Java中執行的方法)。

public byte[] readBytes(InputStream inputStream) throws IOException { 
    // this dynamically extends to take the bytes you read 
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 

    // this is storage overwritten on each iteration with bytes 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 

    // we need to know how may bytes were read to write them to the byteBuffer 
    int len = 0; 
    while ((len = inputStream.read(buffer)) != -1) { 
    byteBuffer.write(buffer, 0, len); 
    } 

    // and then we can return your byte array. 
    return byteBuffer.toByteArray(); 
} 
+0

謝謝。雖然這並不能解決問題,因爲在我提供它之前我必須指定byte []數組的長度,並且我無法從InputStream獲取它。任何想法如何我可以計算給出的Uri數據的長度? – AP257 2010-03-13 11:10:28

+0

對不起,那是不可能的 – user1324936 2012-05-26 22:35:22

+0

你不必提前知道文件大小。建議的解決方案將適用於任何流長度。 – 2013-04-10 14:11:53

2
while ((len = inputStream.read(buffer)) != -1) 

應該

while (inputStream.available() >0 && (len = inputStream.read(buffer)) != -1) 

如果流具有在this answer解釋沒有可用的字節該讀的方式將不會阻止。

byte[] recordData = IOUtils.toByteArray(inStream); 

下載JAR: http://commons.apache.org/io/download_io.cgi

+0

如果您只收到一半文件,則阻止是正確的行爲。檢查可用性是檢查文件結尾的可怕替代方法。 – 2015-06-18 01:18:58

8

隨着阿帕奇百科全書,你可以從一個Stream感謝IOUtils.toByteArray(InputStream)爲下一讀取所有字節d

private static byte[] getStringFromInputStream(InputStream is) 
{ 

    BufferedReader br = null; 
    StringBuilder sb = new StringBuilder(); 
    byte[] bReturn = new byte[0]; 

    String line; 
    try 
    { 

     br = new BufferedReader(new InputStreamReader(is, "Big5")); 
     while ((line = br.readLine()) != null) 
     { 
      sb.append(line); 
     } 
     String sContent = sb.toString(); 
     bReturn = sContent.getBytes();   
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     if (br != null) 
     { 
      try 
      { 
       br.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return bReturn; 
} 
0

分享我的想法:

+0

InputStreamReader使用Big5編碼格式,因爲我的內容有中文字符,所以可以使用UTF-8 – user2374654 2013-05-12 10:14:56

0

如果你有一個開放的,而不是一個普通的文件名,你應該使用內容解析器。 Android: Getting a file URI from a content URI?

我試過了,它的工作原理。 Uri uri; //這是一些東西,我從文件選擇器中獲得。當然,我必須確定,uri指向一個文件名,它不是圖像,音頻或其他內容......

InputStream is=getContentResolver().openInputStream(uri); 
InputStreamReader ir=new InputStreamReader(is); 
bu=new BufferedReader(ir); 
String s; 
while ((s=bu.readLine())!=null){ 
    //do something with the line... 
} 
bu.close(); 

我從代碼中省略了一些try-catch-finally,但最重要的是這裏。 首先,如果你有一個uri,你不能使用標準的文件閱讀器。