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