2017-07-07 7 views
0

ich die Datei mit dem Google Drive in dem Hochladen dieses Problem konfrontiert bin, bin Hochladen ich die Audio-Verbindung zu dem Google zu dieser Zeit zum Schreiben des Inhalts in der Dateijava.lang.OutOfMemoryError bei java.io.ByteArrayOutputStream.expand (ByteArrayOutputStream.java:91)?

verwendet

Der Code

wird diese Ausnahme fahre aufgezeichnet auftretend
     OutputStream outputStream = result.getDriveContents().getOutputStream(); 
        FileInputStream fis; 
        try { 
         fis = new FileInputStream(file); 
         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
         byte[] buf = new byte[1024]; 
         int n; 
         while (-1 != (n = fis.read(buf))) 
          baos.write(buf, 0, n); 
         byte[] photoBytes = baos.toByteArray(); 
         outputStream.write(photoBytes); 

         outputStream.close(); 
         outputStream = null; 
         fis.close(); 
         fis = null; 

         Log.e("File Size", "Size " + file.length()); 

        } catch (FileNotFoundException e) { 
         Log.v("EXCEPTION", "FileNotFoundException: " + e.getMessage()); 
        } catch (IOException e1) { 
         Log.v("EXCEPTION", "Unable to write file contents." + e1.getMessage()); 
        } 

Die Ausnahme tritt in der Zeile `baos.write (buf, 0, n);

Bitte helfen Sie mir, wie Sie dieses error.` zu lösen

+0

Warum schreiben Sie es zu einem 'ByteArrayOutputStream' anstatt es direkt in' outputStream' zu schreiben? Abhängig von der Dateigröße ist es möglicherweise nicht möglich, die gesamte Datei im Speicher zu behalten. –

+0

@ piet.t erklären Sie ausführlich und posten Sie Ihre Antwort –

Antwort

1

Das Schreiben in eine ByteArrayOutputStream bedeutet zuerst, dass die vollständige Datei im JVM-Heap enden wird. Je nach Dateigröße und Größe des Heapspeichers ist dies möglicherweise nicht möglich, daher die Ausnahme. Wenn Sie die ByteArrayOutputStream für etwas nicht brauchen sonst schreiben Sie einfach direkt an outputStream:

OutputStream outputStream = result.getDriveContents().getOutputStream(); 
FileInputStream fis; 
try { 
    fis = new FileInputStream(file); 
    byte[] buf = new byte[1024]; 
    int n; 
    while (-1 != (n = fis.read(buf))) 
     outputStream.write(buf, 0, n); 


} catch (FileNotFoundException e) { 
    Log.v("EXCEPTION", "FileNotFoundException: " + e.getMessage()); 
} catch (IOException e1) { 
    Log.v("EXCEPTION", "Unable to write file contents." + e1.getMessage()); 
} finally { 
    outputStream.close(); 
    fis.close(); 
    Log.e("File Size", "Size " + file.length()); 
} 

PS: nulling die Referenzen nicht notwendig sein sollten, wenn sie bald aus dem Rahmen gehen ...

+0

Ihre Antwort funktioniert ... vielen Dank –

1

Du OOM bekommen, weil Sie versuchen, vollständige Datei in den Speicher zu lesen, bevor es mit dem Google Drive output zu schreiben. Die Datei ist möglicherweise zu groß, um im Speicher gespeichert zu werden. Auf diese Weise müssen Sie es Stück für Stück schreiben. Mit dieser Methode ist es einfach zu erreichen:

private static final int BUFFER_SIZE = 1024; 

    public static long copy(InputStream from, OutputStream to) 
     throws IOException { 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    long total = 0; 
    while (true) { 
     int r = from.read(buffer); 
     if (r == -1) { 
     break; 
     } 
     to.write(buffer, 0, r); 
     total += r; 
    } 
    return total; 
    } 

Die Methode gibt die Anzahl der kopierten Bytes zurück.

Verwandte Themen