一、背景
写了一个使用 InputStream 接收 Socket 字节流的 demo ,发现只要 socket 不关闭的情况下读这个InputStream 会一直 block。如果是读的是 FileInputStream,读完文件却会立刻返回。
二、原理分析
行为的差异主要来自 InputStream 。Socket 的 InputStream 在 tcp 链接断开后(收到 tcp Fin 请求)会给 InputStream 一个信号代表所有数据已经读完了,连接已经断开不可能再拿到任何数据了。这时通过 InputStream 进行读取会直接返回 -1 或 null,不会继续 block 了。如果没有收到 Fin 请求,读取 InputStream 会一直 block 。这点上和 FileInputStream 就不同了,FileInputStream 如果读到了文件结尾得到 EOF 就会返回,即便后续再有数据写入文件也拿不到了,只能重新读一次。
三、代码验证
同时读写文件:两个线程分别读写一个文件,虽然写线程一直在写,但是读线程很快就返回了,不会等读线程写完。
package com.zhuo.io;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedInputStreamTest {
private static final String fileName = "/Users/lc/mine/b.txt";
pub