2009-08-13 57 views
10

從Android平臺上的InputStream中讀取時,我遇到了一個奇怪的問題。我不確定這是一個Android特定的問題,還是我一般做錯的事情。從InputStream中讀取時出現IOException

是Android的特定的唯一事情是這樣調用:

InputStream is = getResources().openRawResource(R.raw.myfile); 

這將返回的InputStream從Android的資產的文件。不管怎麼說,這裏就是我碰到的問題:

bytes[] buffer = new bytes[2]; 
is.read(buffer); 

當讀()執行它拋出IOException異常。奇怪的是,如果我做兩個連續的單字節讀取(或任何數量的單字節讀取),沒有例外。在例子中,這個工程:

byte buffer; 
buffer = (byte)buffer.read(); 
buffer = (byte)buffer.read(); 

任何想法,爲什麼兩個連續的單字節讀取工作,但一個調用read兩者同時拋出一個異常? InputStream似乎很好... is.available()返回超過一百萬字節(因爲它應該)。

堆棧跟蹤顯示這些線路只是InputStream.read()前:

java.io.IOException 
at android.content.res.AssetManager.readAsset(Native Method) 
at android.content.res.AssetManager.access$800(AssetManager.java:36) 
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542) 

更改緩衝區大小爲一個字節仍引發錯誤。它看起來像只在讀入字節數組時纔會引發異常。

如果我截斷文件到100,000字節(文件是:最初1,917,408字節)它工作正常。有超過一定大小的文件有問題嗎?

任何幫助表示讚賞!
謝謝!

+0

1MB的文件工作,但一個1.5MB的文件都沒有。資產是否有一定的規模限制? – DJayC

回答

14

(我的崗位到Android開發人員沒有顯示出來,所以我會盡力在這裏重新張貼它)

IIRC,這個問題來自於試圖訪問被壓縮爲建設APK的一部分文件。

因此,要解決該問題,請爲其提供一個不會被壓縮的文件擴展名。我忘記了跳過什麼擴展名的列表,但已知已被壓縮的文件類型(例如,mp3,jpg)可能會起作用。

+1

你是對的。將擴展名重命名爲.MP3。這是一個愚蠢的錯誤,並且應該有辦法告訴它不要壓縮某個文件,如果它會導致這種類型的問題。 謝謝 – DJayC

+0

@ CommonsWare:有沒有其他方法從資產中讀取壓縮文件?我的意思是文件在打包到APK時被壓縮,但是我們可以讀取資產文件? – VSB

0

你是對的,因爲提取文件有一定的大小限制。您可能希望將較大的文件分成1MB,並且有一種方法可以讓您知道哪些文件由哪些文件組成,並在您的應用運行時再次將它們拼接在一起。

3

將文件擴展名更改爲.mp3以避免文件壓縮功能無法正常工作,但該應用的APK功能要大得多(在我的情況下爲2.3 MB而不是0.99 MB)。

是否有其他方法可以避免此問題?

這裏是我的回答: Load files bigger than 1M from assets folder

相關問題