在 Java 中将二进制数据从 URL 复制到文件,无需中间复制

2024-03-28

我正在更新一些旧代码,以从 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();

With:

FileOutputStream out = new FileOutputStream("filename");

如果您这样做,则无需致电out.toByteArray()在最后。只需确保关闭FileOutputStream完成后对象,如下所示:

out.close();

请参阅文档文件输出流 http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中将二进制数据从 URL 复制到文件,无需中间复制 的相关文章

随机推荐

  • 将 Grails 2.1.1 应用程序部署到 Tomcat 作为爆炸战争?

    我正在尝试在 OpenShift 上部署 Grails 应用程序 并且尝试避免每次更改都在网络上推送 50MB 的文件 我创建了一个项目 dev apps grails test测试它 基于这个答案 https stackoverflow
  • 如何使用批处理文件运行R语言(.r)文件?

    我想使用批处理文件运行 R 脚本文件 r 如果 R exe 在您的 PATH 中 那么您的 Windows 批处理文件 bat 将仅包含一行 R CMD BATCH your r script R 否则 您需要给出 R exe 的路径 例如
  • 为什么 Numba 的“急切编译”会减慢执行速度

    附上一个最小的例子 from numba import jit import numba as nb import numpy as np jit nb float64 nb int32 def go fast a trace 0 0 fo
  • jQuery DataTables 多选列过滤器

    我想要得到的是类似于 Excel 的针对各个 DataTables 列的多条件过滤 我在 stackoverflow 上遇到了一些与该主题相关的主题 但这些主题似乎都没有实现我正在寻找的内容 到目前为止 我只有样本表 我很感激任何有关下一步
  • NGINX 反向代理:许多 html 状态代码 400 响应,为什么?

    我们最近实现了一个基于 nginx 的反向代理 在调试访问日志时 我们看到大量状态代码 400 结果 它们看起来像这样 07 Sep 2011 05 49 04 0700 400 0 我们启用了调试错误日志记录 它们通常对应于这样的内容 2
  • 使用 IHttpHandler 时 Firefox 无法正确处理内容类型

    由于某种原因 Firefox 无法正确处理通过我的 NET HTTP 处理程序发送的内容 它似乎不遵守内容类型标头 相反 它将内容视为 HTML 映射到请求的 URL 甚至具有 csv 扩展名 Internet Explorer 和 Chr
  • Debian:使用 bash 找出 CPU 使用情况

    我正在使用 PHP 来读取当前的 CPU 使用情况 我在虚拟服务器上 因此启用了 shell exec 我努力了grep on ps 但没有成功 如何使用 bash 读取当前的 CPU 使用率百分比 最简单的方法就是使用sys getloa
  • 我们如何使用 JPA2 (Hibernate) 实体作为两个 Web 应用程序之间的 DTO?

    我们在 Glassfish 3 0 1 上运行并使用 Hibernate 3 5 3 我们的项目设置如下所示 前端战争 公共jar 后端战争 我们希望将 jpa2 带注释的实体放入 common jar 中 以便后端将它们视为 JPA2 实
  • 如何提高轮廓精度?

    我正在做一个使用 OpenCV 的项目 我需要从高清照片中精确地裁剪出一些物体 我使用四边形树将照片切成碎片 然后计算每个四边形的同质性以确定物体的一部分是否在四边形中 我根据四边形的同质性应用了一些具有不同阈值的 Canny 滤波器 我希
  • 何时使用 __() 和 esc_html_e?

    谁能解释一下为什么我会使用 https developer wordpress org reference functions over esc html e https codex wordpress org Function Refer
  • Vim Supertab 插件在导航完成菜单时反转方向

    当我通过 supertab 循环浏览完成选项列表时 即通过按
  • Android 启动画面不显示

    我的应用程序中的启动屏幕不显示 仅显示白色背景 然后它进入下一页 我在 stackoverflow 中看到了其他类似的问题 但它对我没有帮助 飞溅 xml
  • emberjs 和 Foundation4

    我正在尝试使用 emberjs 和 Foundation 4 现在使用 zepto 框架 但一旦我将 emberjs 添加到我的 application js 中 基础代码就停止工作 包含的顺序有问题吗 require jquery req
  • Task.Run 在同一线程上继续,导致死锁

    考虑以下我将同步等待的异步方法 等一下 我知道 我知道这被认为是不好的做法导致死锁 https blog stephencleary com 2012 07 dont block on async code html 但我完全有意识的 ht
  • @Autowired 不在内部类中工作

    我在内部类中有一个类是 Autowired 但是在执行时它会抛出空指针异常 而在外部类中自动装配时它工作正常 class outer class inner Autowired private var somevar private pro
  • Matlab:提取矩阵的第N个元素,同时保持矩阵的原始顺序

    我正在尝试设置一些代码来提取矩阵的某些元素 并按照提取的顺序仅将这些值保留在另一个矩阵中 示例 如果我有一个随机 1X20 矩阵 但只想要以 4 和 5 开头的每个 Nth 5 个元素 我希望它构造一个仅包含 4 5 9 10 14 15
  • AppClassloader 和 SystemClassloader 之间的区别

    我对这两个类加载器很困惑 当谈论Java类加载器的层次结构时 通常会提到引导类加载器和扩展类加载器以及第三类加载器 系统类加载器或应用程序类加载器 为了更准确 我查了JDK的源码 在班上Launcher 有代码 loader AppClas
  • D3.js(威尔金森型)点图示例

    我已经搜索过 但无法找到 D3 中点图的示例 有谁知道这种类型的绘图已在任何基于 D3 构建的图表库中实现 或者在基础 D3 中的示例 需要明确的是 点图与直方图类似 只不过点彼此堆叠在一起 而不是直方图的条形图 在 R 中 可以使用 gg
  • 如何使用 Homebrew 将 Postgis 安装到 [email protected] 的 Keg 安装中?

    我已经安装了 电子邮件受保护 cdn cgi l email protection使用 Homebrew 1 2 到我的 OSX El Capitan 机器 不幸的是 在安装 Postgis 并执行 CREATE EXTENSION pos
  • 在 Java 中将二进制数据从 URL 复制到文件,无需中间复制

    我正在更新一些旧代码 以从 URL 而不是从数据库获取一些二进制数据 数据即将从数据库中移出 并且可以通过 HTTP 访问 数据库 API 似乎直接以原始字节数组形式提供数据 并且相关代码使用 BufferedOutputStream 将此