2011-03-17 25 views
14

我有一個使用Context.openFileInput()創建的FileInputStream。我現在想把文件轉換成一個字節數組。我不能確定FileInputStream.read(byte[])所需的字節數組的大小。 available()方法不起作用,並且我無法使用特定路徑名創建文件以檢查它的長度,可能是因爲非root用戶無法訪問該路徑。FileInputStream在Android應用程序中的字節數組

我讀到ByteArrayOutputStream,它似乎動態調整字節數組的大小,以適應,但我不能讓如何從FileInputStream讀取寫入ByteArrayOutputStream

+0

可能重複(http://stackoverflow.com/questions/2436385/android-getting - 從一個u​​ri到一個輸入流到一個字節數組) – Thilo 2011-03-17 01:43:05

+2

你提供給'read(byte [])'的'byte []'並不打算成爲什麼的全部大小它正在嘗試閱讀。這是一個緩衝區,可以容納您一次最多可以讀取的字節數,每次調用read時,都會將一定數量的字節放入該緩衝區,並返回一個數字,告訴您放入的字節數。 – ColinD 2011-03-17 01:52:02

回答

42

這應該工作。

InputStream is = Context.openFileInput(someFileName); 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
byte[] b = new byte[1024]; 
while ((int bytesRead = is.read(b)) != -1) { 
    bos.write(b, 0, bytesRead); 
} 
byte[] bytes = bos.toByteArray(); 
+0

謝謝,我用另一種方法解決了。 'while(is .available> 0)' – 2011-03-17 02:05:10

+5

@Jeremy:Robby的方法是在Java中執行此操作的標準方法。他一次只能讀取1024個字節的輸入內容......一次只讀1個字節。我建議使用他的建議。 – ColinD 2011-03-17 03:04:19

+0

此方法僅適用於有根設備。 – Mihir 2012-01-25 07:59:19

0

對於方法的任何設備和aplication你只需要更換工作:

InputStream is = Context.getContentResolver().openInputStream(yourFileURi); 

這樣你就可以編碼外部的文件。

1

您可以預先分配使用

int size = context.getFileStreamPath(filename).length(); 

這樣的字節數組,你會避免每次你ByteArrayOutputStream填補了時間分配的內存塊。

5

這是最簡單的方法

FileInputStream fis = openFileInput(fileName); 

byte[] buffer = new byte[(int) fis.getChannel().size()]; 

fis.read(buffer); 
[Android的? - 從URI獲取到的InputStream字節數組]的
+0

請注意'openFileInput'方法不接受路徑分隔符。因此,而不是'openFileInput',你可以使用'fis = new FileInputStream(new File(filename_with_path));' – Atul 2016-12-29 12:49:49

相關問題