BufferedReader/BufferedInputStream.readLine()

最新在学习socket写一个简单聊天室时,发现服务端能够输出,但是客户端总是收不到东西。很郁闷,debug后发现无法跳转出readline。于是百度之:

readLine()的实质(下面是从JDK源码摘出来的):

String readLine(boolean ignoreLF) throws IOException {
    StringBuffer s = null;
    int startChar;
        synchronized (lock) {
            ensureOpen();
        boolean omitLF = ignoreLF || skipLF;
        bufferLoop:
        for (;;) {
        if (nextChar >= nChars)
            fill(); //在此读数据
        if (nextChar >= nChars) { /* EOF */
            if (s != null && s.length() > 0)
            return s.toString();
            else
            return null;
        }
      ......//more
}

private void fill() throws IOException {
    ....//more
    int n;
    do {
        n = in.read(cb, dst, cb.length - dst); //实质
    } while (n == 0);
    if (n > 0) {
        nChars = dst + n;
        nextChar = dst;
    }
    }

从上面看出,readLine()是调用了read(char[] cbuf, int off, int len) 来读取数据,后面再根据”/r”或”/n”来进行数据处理。

在Java I/O书上也说了:

public String readLine() throws IOException
This method returns a string that contains a line of text from a text file. /r, /n, and /r/n are assumed to be line breaks and are not included in the returned string. This method is often used when reading user input from System.in, since most platforms only send the user’s input to the running program after the user has typed a full line (that is, hit the Return key).
readLine() has the same problem with line ends that DataInputStream’s readLine() method has; that is, the potential to hang on a lone carriage return that ends the stream . This problem is especially acute on networked connections, where readLine() should never be used.

小结,使用readLine()一定要注意

**1.读入的数据要注意有/r或/n或/r/n
2.没有数据时会阻塞,在数据流异常或断开时才会返回null
3.使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值