Khi sử dụng HttpURLConnection, InputStream có cần được đóng nếu chúng tôi không 'nhận' và sử dụng nó không?Sử dụng an toàn HttpURLConnection
tức là điều này có an toàn không?
HttpURLConnection conn = (HttpURLConnection) uri.getURI().toURL().openConnection();
conn.connect();
// check for content type I don't care about
if (conn.getContentType.equals("image/gif") return;
// get stream and read from it
InputStream is = conn.getInputStream();
try {
// read from is
} finally {
is.close();
}
Thứ hai, nó là an toàn để đóng một InputStream trước khi tất cả các nội dung của nó đã được hoàn toàn đọc?
Có nguy cơ rời khỏi ổ cắm cơ bản trong trạng thái ESTABLISHED hoặc thậm chí CLOSE_WAIT không?
Rất thú vị. Câu hỏi này thực sự là nền tảng cho một vấn đề tôi có, nơi tôi nhìn thấy LOTS của CLOSE_WAIT ổ cắm vào cùng một IP, nhưng vì bộ nhớ đệm (tôi không gọi URLConnection.disconnect() một cách rõ ràng) Tôi hy vọng có được chỉ có một, mà nên được sử dụng lại. – Joel
@Joel: Bằng cách gọi 'HttpUrlConnection.disconnect()', socket tcp nằm bên dưới bị đóng. Bằng cách đóng luồng đầu vào, socket tcp bên dưới được gộp lại để sử dụng lại sau này.Thông báo trước duy nhất là toàn bộ phản hồi (hoặc toàn bộ phản hồi lỗi) phải được đọc từ luồng đầu vào để kết nối tcp được lưu trữ. Điều này luôn được đề cập bất kể bạn thực sự cần toàn bộ dữ liệu từ luồng. Kiểm tra bài đăng trong câu trả lời của tôi – Cratylus
Điều gì xảy ra nếu bạn không đọc bất kỳ dữ liệu nào, như ví dụ đầu tiên của tôi - tôi đoán bạn vẫn cần đóng IS, nhưng nó vẫn không được lưu vào bộ nhớ cache nếu không có dữ liệu nào được đọc. đã đóng cửa. – Joel