2017-01-26 1168 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

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

相关问题