2012-06-27 4 views
0

Сначала загрузите файл в приложении, и сохраните его с именем try.pdfOutOfMemoryError в 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 у меня есть OutOfMemory ошибки, любое решение?

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 single threaded.

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 очевидно). Поскольку один поток добавляет в очередь ожидающих данных, другой поток извлекает из него. Таким образом, вы уделяете процессорное время чиллаксу.

Убедитесь, что вы используете LinkedList и ArrayList для этой очереди между двумя потоками с общим потоком.

+0

Ошибка здесь: sb.append (строка); Как я могу это решить? – jlopez