我正在更新一些旧代码以从 URL 而不是从数据库中获取一些二进制数据(数据即将从数据库中移出,而是可以通过 HTTP 访问)。数据库 API 似乎直接以原始字节数组的形式提供数据,并且有问题的代码使用 BufferedOutputStream 将该数组写入文件。
我对 Java 一点也不熟悉,但是通过谷歌搜索找到了这段代码:
URL u = new URL("my-url-string");
URLConnection uc = u.openConnection();
uc.connect();
InputStream in = uc.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
final int BUF_SIZE = 1 << 8;
byte[] buffer = new byte[BUF_SIZE];
int bytesRead = -1;
while((bytesRead = in.read(buffer)) > -1) {
out.write(buffer, 0, bytesRead);
}
in.close();
fileBytes = out.toByteArray();
这似乎在大多数情况下都有效,但是当被复制的数据很大时我遇到了一个问题——我得到了一个 OutOfMemoryError 数据项,这些数据项在旧代码中运行良好。
我猜这是因为这个版本的代码同时在内存中有多个数据副本,而原始代码没有。
有没有一种简单的方法可以从 URL 中获取二进制数据并将其保存在文件中,而不会在内存中产生多个副本的成本?