我正在更新一些旧代码,以从 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(使用前将#替换为@)