3 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
有兩種方法可以解決此問題。
您可以增加堆大小,但 IMO 這是一個(gè)糟糕的解決方案,因?yàn)槿绻盏蕉鄠€(gè)并行請(qǐng)求或嘗試處理更大的文件,則會(huì)遇到相同的問題。
您可以優(yōu)化算法 - 而不是在內(nèi)存中存儲(chǔ)文件的多個(gè)副本,而是可以以流方式處理它,從而在內(nèi)存中保存不超過幾個(gè)KB:
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編碼器,則必須創(chuàng)建它的流媒體版本,但我認(rèn)為URL安全的base64就足夠了

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
Base64 將每個(gè) 3 個(gè)字節(jié)轉(zhuǎn)換為 4 個(gè)字母。這意味著您可以以塊的形式讀取數(shù)據(jù),并以與解碼整個(gè)文件相同的方式對(duì)其進(jìn)行解碼。
試試這個(gè):
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();

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您有大文件,則根據(jù)文件大小,您將始終遇到OOM錯(cuò)誤。如果您的目標(biāo)是使用Apache Commons Base64 Streams進(jìn)行base64編碼。
添加回答
舉報(bào)