análisis de código fuente de Java readLine


readLine

  • hereda de la clase BufferedReader lector, y de un nuevo método de lectura de fila: String readLine()Este método devuelve una cadena que no contiene el contenido del terminador desviado, y si el final de la secuencia es null;
  • Utilice los siguientes ejemplos:
public class Test {
    public static void main(String[] args) throws IOException {
        // 创建流对象
        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\80626\\Desktop\\1.txt"));
        // 定义字符串,保存读取的一行文字
        String line = null;
        // 循环读取,读取到最后返回null
        while ((line = br.readLine()) != null) {
            System.out.print(line);
            System.out.println("------");
        }
        // 释放资源
        br.close();
    }
}

El método 1. API

    public String readLine() throws IOException {
        return readLine(false);
    }
  • De hecho, llamando al String readLine(boolean ignoreLF)método, ignoreLF = truehaciendo caso omiso de la siguiente nueva línea '\n';
	/** If the next character is a line feed, skip it */
    private boolean skipLF = false;
  • BufferedReader clase variables privadas skipLF = false;
  • Lea las instrucciones muestra que readLine()la función principal del método es leer una línea de texto, los avances de línea '\n', retorno de carro '\r', avance de línea después de un retorno de carro, o llegar al final del archivo se considera que ser terminada. Devuelve una cadena que contiene el contenido de la línea, que no incluye ningún carácter de línea de terminación , si llega a la final de la secuencia sin ningún tipo de caracteres leídos, en comparación null. readLine()El método es el siguiente:
	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;
                }
                boolean eol = false;
                char c = 0;
                int i;

                /* Skip a leftover '\n', if necessary */
                if (omitLF && (cb[nextChar] == '\n'))
                    nextChar++;
                skipLF = false;
                omitLF = false;

            charLoop:
                for (i = nextChar; i < nChars; i++) {
                    c = cb[i];
                    if ((c == '\n') || (c == '\r')) {
                        eol = true;
                        break charLoop;
                    }
                }

                startChar = nextChar;
                nextChar = i;

                if (eol) {
                    String str;
                    if (s == null) {
                        str = new String(cb, startChar, i - startChar);
                    } else {
                        s.append(cb, startChar, i - startChar);
                        str = s.toString();
                    }
                    nextChar++;
                    if (c == '\r') {
                        skipLF = true;
                    }
                    return str;
                }

                if (s == null)
                    s = new StringBuffer(defaultExpectedLineLength);
                s.append(cb, startChar, i - startChar);
            }
        }
    }
  • Leer BufferedReader clase, hay una variables de clases particulares defaultCharBufferSize:
	private static int defaultCharBufferSize = 8192;
  • Visible, readLine()llamada un bucle infinito, continuará para agregar datos a Buffer, si no se especifica el tamaño del búfer, el readLine()tampón utilizado son 8192 caracteres (8 * 1024), antes de alcanzar el tamaño del búfer, sólo se encontró /r, /n, /r/nno regresará ;
  • Cuando se utiliza socket de flujo de datos o similar, se debe evitar readLine(), con el fin de evitar la espera de un retorno de carro y avance de línea o que ha sido bloqueada;

2. Consideraciones modo de red

  • En la red readLine()se modo, es decir, si el bloqueo readLine()no leer los datos, siempre va a ser bloqueada, en lugar de regresar null, por lo que si desea realizar después de la operación, mientras que la forma de bucle relacionada no es posible, ya que es un muerto ciclo, una vez que los datos no se lee, comenzó a obstruir, y por lo tanto nunca puede ser ejecutado forma exterior mientras que la operación de bucle, la operación debe ser colocado en el interior del bucle while;
  • En el interior del bucle while para determinar readLine()!= nullcuándo debe asignar una cadena, porque si no null, entonces este tiempo de la línea que se ha leído. Si while (br.readLine()!=null), a continuación, el siguiente no puede llegar a la línea de nuevo, por lo que se debe utilizar while ((line = br.readLine())!=null){};
  • readLine()Por uno de los siguientes caracteres se puede considerar una línea discontinuada: nueva línea '\n', retorno de carro '\r'seguido inmediatamente o después de un avance de línea de retorno de carro, así que agregamos estos identificadores más tarde, cuando el envío de datos de nuevo, de lo contrario el programa se bloqueará. Esta directamente usando el siguiente método: PrintStream ps = new PrintStream(socket.getOutputStream(), true, "UTF-8");ps.println();, ps.println()se ha incluido para el viaje, así que no use print(), si es necesario para ser seguido por el carácter de nueva línea;
  • readLine()Sólo una anomalía se produce en el flujo de datos o el otro extremo es close()cuando está apagado, no devuelve nullun valor.

Lectura recomendada: la Corriente del búfer de la secuencia de Java tamponada >>>

Publicados 281 artículos originales · ganado elogios 285 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/Regino/article/details/105060868
Recomendado
Clasificación