gpt4 book ai didi

java - 在没有中间副本的情况下将二进制数据从 URL 复制到 Java 文件

转载 作者:搜寻专家 更新时间:2023-11-01 01:11:57 24 4
gpt4 key购买 nike

我正在更新一些旧代码以从 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 中获取二进制数据并将其保存在文件中,而不会产生内存中的多个副本的成本?

最佳答案

无需将数据写入字节数组,然后将其转储到文件,您可以通过替换以下内容直接将其写入文件:

ByteArrayOutputStream out = new ByteArrayOutputStream();

与:

FileOutputStream out = new FileOutputStream("filename");

如果这样做,就不需要在最后调用 out.toByteArray()。只需确保在完成后关闭 FileOutputStream 对象,如下所示:

out.close();

请参阅 FileOutputStream 的文档了解更多详情。

关于java - 在没有中间副本的情况下将二进制数据从 URL 复制到 Java 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com