2017-01-26 141 views
1

所以我的問題聽起來像這樣。我需要做一個文件的base64編碼字符串,對於這一點,我用這個方法:ByteArrayOutputStream的RAM內存的Extream使用

public String getStringFile(File f) { 
    InputStream inputStream = null; 
    String encodedFile= "", lastVal; 
    try { 
     inputStream = new FileInputStream(f.getAbsolutePath()); 

     byte[] buffer = new byte[10240]; 
     int bytesRead; 

     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); 

     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      output64.write(buffer, 0, bytesRead); 
     } 

     output64.close(); 
     encodedFile = output.toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    lastVal = encodedFile; 

    return lastVal; 
} 

和的事情是,當我嘗試編碼文件的東西約20 MB(確切的文件大小爲19,35 MB )我得到一個OutOfMemoryException。

前:

enter image description here

後:

enter image description here

什麼我做錯了,我怎麼能解決這個問題?提前致謝。

+0

我認爲這是問題:encodedFile = output.toString(); – X3Btel

+0

我知道這個問題是在整個ByteArrayOutputStream,但我只是不知道使用別的什麼=( –

+1

CommonsWare解釋它。Id言編碼字符串寫入一個文件,然後從存儲從memmory – X3Btel

回答

2
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); 

如果你自己上傳的base64與HttpURLConnection的你可以做的方式與ByteArrayOutputStream和替換以上線路-while直接與

OutputStream output = con.getOutputStream(); 
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); 

未經檢驗uploading-。

你也可以直接使用Base64編碼對課程的FileOutputStream

OutputStream output = new FileOutputStream(......); 
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); 

然後用POJO上傳該文件。

4

我在做什麼錯

您正在嘗試編碼使用Base64轉換成字符串一個大約20MB的文件。許多Android設備上沒有足夠的堆空間來分配大量內存。

我怎樣才能解決這個問題?

如果「這個問題」是「創建一個~26MB的base64編碼數據字符串」,沒有可靠的方法來做到這一點。通過創建這樣一個字符串,您將不得不尋找其他解決方案解決您正在嘗試解決的任何問題。

+0

的事情是,我需要一個文件上傳到遠程服務器,它接受一個文件爲Base64字符串僅所以我沒有 –

+1

@ VladZbuker:服務器可能接受數據爲base64,但服務器根本不關心這是否爲si在Android中沒有字符串。 – CommonsWare

+0

我明白了,但我不太明白如何拆分字符串或類似的東西:( –

相關問題