跳转到主内容
极星编程网:以代码为星,赴技术山海!

怎么利用 java.net.URL 类的 openStream() 下载互联网上的文件资源

不能。openStream()仅返回InputStream,不自动保存文件,需手动完成打开流→读取→写入→关闭全过程,且不支持超时设置、请求头、状态码检查、重定向控制及断点续传。 openStream() 能直接下载文件吗? 不能。
openStream()
只返回一个
InputStream
,它不处理文件保存、进度反馈、重定向跟随或断点续传——它只是打开连接并读取原始字节流。如果你期望调用一次就自动写入磁盘,会发现什么都没生成。 用 openStream() 下载文件的最小可行步骤 必须手动完成「打开流 → 读取 → 写入本地文件 → 关闭资源」全过程。常见错误是忽略异常时流未关闭,或用
read()
单字节读取导致性能极差。 用
try-with-resources
同时管理
URL.openStream()
和
FileOutputStream
用带缓冲的读取方式,例如
byte[] buffer = new byte[8192]
配合
in.read(buffer)
检查 HTTP 状态码:
openStream()
不抛出 404/500 异常,它可能静默返回错误页内容,建议改用
HttpURLConnection
获取响应码 若需支持重定向(如 302),
URL
默认开启,但某些代理或自定义
URLStreamHandler
可能禁用,可显式设置:
System.setProperty("sun.net.client.defaultFollowRedirects", "true")
URL url = new URL("https://example.com/data.zip"); try (InputStream in = url.openStream(); FileOutputStream out = new FileOutputStream("data.zip")) { byte[] buf = new byte[8192]; int len; while ((len = in.read(buf)) != -1) { out.write(buf, 0, len); } }
为什么不用 openStream() 处理大文件或需要控制的场景 它无法获取响应头(如
Content-Length
)、无法设置超时、无法添加请求头(如
User-Agent
、认证 token),也不支持分块读取或暂停恢复。一旦连接卡住,
openStream()
默认无限等待(底层 socket 超时由系统决定,不可控)。 必须设超时?→ 改用
HttpURLConnection
,调用
setConnectTimeout()
和
setReadTimeout()
需要带 header 请求?→
HttpURLConnection
的
setRequestProperty()
是唯一可靠方式 要校验下载完整性?→
openStream()
不提供
Content-MD5
或
ETag
访问途径,得自己解析响应头 容易被忽略的编码与重定向陷阱
openStream()
对重定向是“透明”的——它自动跳转并返回最终资源流,但你完全不知道中间跳了几步、最终 URL 是什么。如果服务端返回的是 HTML 错误页(比如 404 时返回友好的 HTML),
openStream()
仍会成功打开并把 HTML 当作二进制内容写入文件,而你毫无察觉。 Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 立即学习 “ Java免费学习笔记(深入) ”; 验证是否真拿到目标资源:下载后检查文件魔数(如 ZIP 是
50 4B 03 04
)或先用
HttpURLConnection
检查
getResponseCode()
注意重定向可能改变协议(HTTP → HTTPS)或域名,
URL
对象本身不会更新,所以无法通过原
url.toString()
得知最终地址 某些 CDN 或网关对无
User-Agent
的请求直接返回 403,而
openStream()
无法设置该 header 真正安全的下载逻辑,往往从
HttpURLConnection
开始,而不是依赖
URL.openStream()
的便利性。

相关文章