URLConnection通过setConnectTimeout()和setReadTimeout()设置超时,字符集需手动编码请求体并在Content-Type中声明,响应解码应优先解析响应头charset。

可以通过 URLConnection 的 setConnectTimeout()、setReadTimeout() 和 setRequestProperty("Accept-Charset", ...) 等方式设置超时与字符集,但要注意:HTTP 字符集主要由服务端响应头(Content-Type)决定,客户端无法强制“发送”字符集,只能在请求中建议(如通过 Accept-Charset)或在读取响应时显式指定解码方式。
设置连接与读取超时时间
超时控制是通过 URLConnection 实例的两个整型毫秒值方法完成的:
- connectTimeout:建立 TCP 连接的最大等待时间(DNS 解析 + TCP 握手),默认无限等待;
- readTimeout:连接建立后,等待服务器返回数据(首字节)的最大时长,也包括后续数据流阻塞等待时间,默认无限等待。
示例代码:
URL url = new URL("https://httpbin.org/get");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5_000); // 5 秒
conn.setReadTimeout(10_000); // 10 秒
conn.setRequestMethod("GET");
// 后续调用 conn.getInputStream() 等操作将受此约束
关于“字符集”的常见理解与正确做法
需要明确两点:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
-
客户端不能通过
openConnection()“设置请求字符集” —— HTTP 请求体(如 POST 表单)的编码需由你手动编码(如URLEncoder.encode(str, "UTF-8")),并在Content-Type头中声明(如application/x-www-form-urlencoded; charset=UTF-8); -
响应内容的解码字符集应优先依据响应头
Content-Type中的charset=...,若缺失,则按规范默认为ISO-8859-1,但实际开发中常需主动覆盖为UTF-8。
示例(读取响应并指定 UTF-8 解码):
InputStream is = conn.getInputStream();
// 推荐:先检查响应头中的 charset
String contentType = conn.getContentType(); // 如 "text/html; charset=utf-8"
String charset = "UTF-8"; // 默认兜底
if (contentType != null) {
int pos = contentType.toLowerCase().indexOf("charset=");
if (pos != -1) {
charset = contentType.substring(pos + 8).trim().replace(";", "").replace("\"", "");
}
}
BufferedReader reader = new BufferedReader(new InputStreamReader(is, charset));
补充:发送带编码的 POST 请求(含字符集声明)
若需发送非 ASCII 参数,必须手动编码并设置 Content-Type:
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
String body = "name=" + URLEncoder.encode("张三", "UTF-8") +
"&city=" + URLEncoder.encode("北京", "UTF-8");
try (OutputStream os = conn.getOutputStream()) {
os.write(body.getBytes(StandardCharsets.UTF_8));
}
注意事项
以下细节容易被忽略但影响行为:
- 超时方法必须在
connect()或首次 I/O(如getInputStream())前调用,否则无效; -
setRequestProperty("Accept-Charset", "UTF-8")仅是向服务器表明客户端能接受的字符集,服务器可忽略,不保证响应一定用该编码; - 使用
HttpURLConnection时,务必显式调用disconnect()(尤其在复用连接池场景外),或确保流被关闭以释放连接; - 对 HTTPS,超时同样生效,但 SSL 握手耗时包含在
connectTimeout内。


















