簡體   English   中英

Resources.openRawResource()發布Android

[英]Resources.openRawResource() issue Android

我在res/raw/文件夾中有一個數據庫文件。 我正在調用Resources.openRawResource() ,文件名為R.raw.FileName ,我得到一個輸入流,但我在設備中有另一個數據庫文件,所以要將該數據庫的內容復制到我使用的設備db:

 BufferedInputStream bi = new BufferedInputStream(is);

和FileOutputStream,但我得到一個例外,數據庫文件已損壞。 我該怎么辦? 我嘗試使用FileFileInputStream讀取文件,將路徑讀取為/res/raw/fileName ,但這也不起作用。

是的,您應該能夠使用openRawResource將原始資源文件夾中的二進制文件復制到設備。

根據API演示(content / ReadAsset)中的示例代碼,您應該能夠使用以下代碼段的變體來讀取db文件數據。

InputStream ins = getResources().openRawResource(R.raw.my_db_file);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
int size = 0;
// Read the entire resource into a local byte buffer.
byte[] buffer = new byte[1024];
while((size=ins.read(buffer,0,1024))>=0){
  outputStream.write(buffer,0,size);
}
ins.close();
buffer=outputStream.toByteArray();

您的文件副本現在應該存在於buffer ,因此您可以使用FileOutputStream將緩沖區保存到新文件中。

FileOutputStream fos = new FileOutputStream("mycopy.db");
fos.write(buffer);
fos.close();

InputStream.available具有嚴重的限制,絕不應用於確定可用於流式傳輸的內容的長度。

http://developer.android.com/reference/java/io/FileInputStream.html#available ():“[...]返回可以讀取或跳過的估計字節數,不會阻塞更多輸入。[。 ..]請注意,這種方法提供了這樣一種弱保證,即它在實踐中不是很有用。“

你有3個解決方案:

  1. 瀏覽內容兩次,首先只是計算內容長度,第二次是實際讀取數據
  2. 由於Android資源是由您(開發人員)准備的,因此硬編碼其預期長度
  3. 將文件放在/ asset目錄中並通過AssetManager讀取,通過AssetManager可以訪問AssetFileDescriptor及其內容長度方法。 但是,這可能會為您提供長度的UNKNOWN值,這不是很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM