2017-01-23 73 views
0

我需要使用uri來加載文件。 Uri不能轉換爲絕對路徑(外部音量)。使用uri將文件讀取到字節數組

我發現例如:

private String readTextFromUri(Uri uri) throws IOException { 
    InputStream inputStream = getContentResolver().openInputStream(uri); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            inputStream)); 
    StringBuilder stringBuilder = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
        stringBuilder.append(line); 
    } 
    fileInputStream.close(); 
    parcelFileDescriptor.close(); 
    return stringBuilder.toString(); 
} 

但我不明白如何修改它以字節爲單位閱讀。

+0

你的意思是讀取文件並將其掛接到一個字節數組中? – mob41

+0

簡單的Google搜索:http://stackoverflow.com/questions/35939527/android-how-read-file-to-byte-array。我已經將FileInputStream用於絕對路徑,但現在我需要使它與uri協同工作。 ' – Daimonium

+0

'「以字節讀取」'?你什麼意思?你有:'InputStream inputStream = getContentResolver()。openInputStream(uri);'所以使用'InputStream'來讀 – pskink

回答

1

正如pskink所說,您的主要問題是您將InputStream包裝在Reader中。 Reader是爲了將字節解碼爲字符,也就是說,通過定義,你想避免什麼。您需要分配一個緩衝區並使用InputStream的讀取方法來填充它。

請記住,在處理已收到的數據時,您必須知道傳入字節的數量或多次讀取。

或者,您可以使用read方法獲取int,檢查流是否已結束,然後將該int轉換爲一個字節並逐個處理。但通常情況下,您想使用緩衝區,因爲速度更快。

+0

像這樣的東西? 'InputStream inputstream = context.getContentResolver()。openInputStream(uri); \t \t \t \t \t data = new byte [4 * 1024]; \t \t \t int bytesRead = inputstream.read(data); \t \t \t \t \t \t而(bytesRead = -1!){ \t \t \t bytesRead = inputstream.read(數據); \t \t \t} \t \t \t inputstream.close();' – Daimonium

+0

很難在評論閱讀,但它看起來像一個良好的開端。 ;) – Silverclaw

+0

是的,它的工作原理:3 – Daimonium

0
URL url = new URL("http://www.craftychild.com/image-files/kids-paint-center.jpg"); 
BufferedImage image = ImageIO.read(url); 
File file = new File("D:\\picture\demo.jpg"); 
ImageIO.write(image, "jpg",file); 
+0

你可以爲圖像文件 –

+0

做網址不是uri。 – Daimonium

+0

URI標識和URL定位;然而,定位器也是標識符,所以每個URL也是一個URI –