2012-06-27 53 views
0

首先下載應用程序文件,並與該名try.pdf的OutOfMemoryError中的FileInputStream

代碼在這裏留着,

try { 

URL url = new URL(aurl[0]); 
    URLConnection conexion = url.openConnection(); 
    conexion.connect(); 

    int lenghtOfFile = conexion.getContentLength(); 
    Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

    InputStream input = new BufferedInputStream(url.openStream()); 
    FileOutputStream fos = openFileOutput("try.pdf", Context.MODE_PRIVATE); 

    byte data[] = new byte[1024]; 

    long total = 0; 

     while ((count = input.read(data)) != -1) { 
      total += count; 
      publishProgress(""+(int)((total*100)/lenghtOfFile)); 
      fos.write(data, 0, count); 
     } 

     fos.flush(); 
     fos.close(); 
     input.close(); 
} catch (Exception e) {} 
return null; 

} 

現在,問題是當我想用打開它下面的代碼:

try { 
    FileInputStream in = openFileInput("try.pdf"); 
    InputStreamReader inputStreamReader = new InputStreamReader(in); 
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    try { 
     while ((line = bufferedReader.readLine()) != null){ 
      sb.append(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

當嘗試讀取文件「try.pdf」文件用的FileInputStream我有錯誤內存不足,任何解決方案?

Thanksss

+0

PDF不是一個文本文件,你不應該像這樣處理它(用線閱讀並把它放到'StringBuilder'中) –

+0

我在這裏沒有任何可疑的部分,你能給出額外的細節嗎? – 18bytes

+0

我在webView中顯示該文件? – jlopez

回答

0

看來,這是最有可能的原因是,該文件是太大在內存中保存的(你似乎是試圖加載整個文件到內存) - 雖然看到的錯誤當分配失敗發生時,它本身就會停下來。

此外,如果它確實是一個PDF文件,而不是一個純文本文件,我不認爲該BufferedReader將能夠正確地讀取它(並可能不會正確換行,因爲這需要CRLF可能不在pdf二進制文件中)。

如果它太大,你需要(取決於你在做什麼)控制顯示在屏幕上的內容,只加載該數據,或者以較小的塊進行處理,而不是在一個塊中進行處理你正在處理而不是顯示它。

+0

文件大小是多少?你有嘗試過在系統監視器上的應用程序在設備上?這是模擬器問題還是設備問題? – Siddharth

+0

filesize = 8MB謝謝! – jlopez

+0

8MB聽起來像是可能太大而無法融入單個StringBuilder。你運行的Android版本是什麼(改變了應用程序的最大堆),你想用數據做什麼?你不能直接在屏幕上顯示8MB的文本數據,所以真的不想把它全部加載到內存中。 – zeetoobiker

0

我懷疑問題在於你的編碼風格,C'ish DOS單線程。

while ((count = input.read(data)) != -1) { 
     total += count; 
     publishProgress(""+(int)((total*100)/lenghtOfFile)); 
     fos.write(data, 0, count); 
    } 

再次同C'ish DOC單線程風格

while ((line = bufferedReader.readLine()) != null){ 
     sb.append(line); 

您需要已經閱讀並publishProgress(的readLine和附加)在2級不同的線程(非顯然UI)。當一個線程添加到等待數據的隊列中時,另一個線程從中拉出。這樣你就可以給CPU一些時間。

請確保您在2個線程共享隊列之間爲此使用LinkedList和ArrayList。

+0

錯誤在這裏:sb.append(line);我該如何解決它? – jlopez