这个问题在这里已有答案:
我有一个大小为32 MB的文件,我已将它从DocuShare服务器下载到DocuShare临时文件夹。我正在尝试从中读取文件内容以创建文件。我对base64内容进行URL编码时出错。当我将相同的代码运行一个简单的Java应用程序时,我没有得到任何异常。但是当我在DocuShare服务中使用相同的代码来获取文档内容时,我得到了Exception。 HTTP状态500 - org.glassfish.jersey.server.ContainerException:java.lang.OutOfMemoryError:Java堆空间
org.glassfish.jersey.server.ContainerException:java.lang.OutOfMemoryError:Java堆空间
File file = new File(filePath);
FileInputStream fileInputStreamReader = new FileInputStream(file);
byte[] bytes = new byte[(int)file.length()];
fileInputStreamReader.read(bytes);
String encodedBase64 = String encodedBase64 = java.util.Base64.getEncoder().encodeToString(bytes);
String urlEncoded = URLEncoder.encode(encodedBase64);
如何解决这个错误?我是否需要增加tomcat堆大小?
Base64将每3个字节转换为4个字母。这意味着您可以以块的形式读取数据并以与解码整个文件相同的方式对其进行解码。
试试这个:
File file = new File(filePath);
FileInputStream fileInputStreamReader = new FileInputStream(file);
StringBuilder sb = new StringBuilder();
Base64.Encoder encoder = java.util.Base64.getEncoder();
int bufferSize = 3 * 1024; //3 mb is the size of a chunk
byte[] bytes = new byte[bufferSize];
int readSize = 0;
while ((readSize = fileInputStreamReader.read(bytes)) == bufferSize) {
sb.append(encoder.encodeToString(bytes));
}
if (readSize > 0) {
bytes = Arrays.copyOf(bytes, readSize);
sb.append(encoder.encodeToString(bytes) );
}
String encodedBase64 = sb.toString();
有两种方法可以解决问题。
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
public class Launcher {
public static void main(String[] args) throws Exception {
final Path input = Paths.get("example");
final Path output = Paths.get("output");
try (InputStream in = Files.newInputStream(input); OutputStream out = Base64.getUrlEncoder().wrap(Files.newOutputStream(output))) {
final byte[] buffer = new byte[1024 * 8];
for (int read = in.read(buffer); read > 0; read = in.read(buffer)) {
out.write(buffer, 0, read);
}
}
}
}
PS:如果你真的需要URL编码器,你将不得不创建它的流媒体版本,但我认为一个URL安全的base64就足够了
如果您有大文件,则将始终根据文件大小遇到OOM错误。如果您的目标是使用Apache Commons Base64 Streams进行base64编码。