BufferedReader/BufferedInputStream.readLine()

来源:互联网 发布:手机淘宝能改差评吗 编辑:程序博客网 时间:2024/05/17 00:07

最新在学习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(),以免为了等待一个换行/回车符而一直阻塞**

0 0
原创粉丝点击