Pregunta

Tengo el siguiente ejemplo de la lectura de un lector tamponada:

while ((inputLine = input.readLine()) != null) {
   System.out.println("I got a message from a client: " + inputLine);
}

El código en el println bucle se ejecuta cada vez que aparece algo en el lector tamponada (input en este caso). En mi caso, si un cliente de la aplicación escribe algo en el zócalo, se ejecutará el código del bucle (en el servidor de aplicaciones).

Pero no entiendo cómo funciona. inputLine = input.readLine() espera hasta que algo aparece en el lector tamponada y cuando algo no parece que devuelve true y se ejecuta el código en el bucle. Pero cuando null puede ser devuelto.

Hay otra cuestión. El código anterior se tomó de un método que throws Exception y utilizo este código en el método de ejecución de la rosca. Y cuando intento poner throws Exception antes de la run el compilador se queja: método reemplazado no lanza una excepción. Sin la throws exception tengo otro se quejan del compilador: excepción no declarada. Por lo tanto, ¿qué puedo hacer?

¿Fue útil?

Solución

Cuando el enchufe en el otro extremo está cerrado, el lector debe devolver una cadena nula. Esta es la condición que se busca. Para manejar la excepción, envolver el bucle de lectura en un / bloque catch intentarlo.

 try {
   while ((inputLine = input.readLine()) != null) {
     System.out.println("I got a message from a client: " + inputLine);
   }
 }
 catch (IOException e) {
   System.err.println("Error: " + e);
 }

Usted puede encontrar este tutorial de lectura / escribir desde / a un enchufe en Java, útiles.

Otros consejos

Para su primera pregunta:

  

Pero no entiendo cómo funciona. inputLine = input.readLine () espera hasta que algo aparece en el lector tamponada y cuando algo aparece allí se devuelve verdadero y se ejecuta el código en el bucle. Pero cuando nulo puede ser devuelto.

BufferedReader.readLine() no devuelve true en el éxito. Devuelve una cadena que contiene la línea que se ha leído. Si se alcanza el final de la secuencia, devuelve null.

Su segunda pregunta:

  

El código anterior fue tomado de un método que lanza Excepción y utilizo este código en el método de ejecución de la rosca. Y cuando intento poner throws Exception antes de la carrera el compilador se queja: método reemplazado no lanza una excepción. Sin la excepción tiros tengo otro se quejan del compilador: excepción no declarada. Por lo tanto, ¿qué puedo hacer?

Se debe envolver el código en un bloque try / catch . Si no desea manejar la excepción capturada, sólo tiene que dejar esa parte en blanco (no recomendado)

try {
    while ((inputLine = input.readLine()) != null) {
        System.out.println("I got a message from a client: " + inputLine);
    }
} catch (Exception e) {
    //handle exception
}

readLine del lector () devolverá un valor de cadena cuando se ha leído algo, una cadena vacía cuando todavía no es nada, y nula cuando se cierra la conexión.

Yo recomendaría envolver un try / catch alrededor de su bloque de código con la función y controlar los errores IO adecuadamente.

lector input está conectado a la toma, que es un oyente, es decir, mantiene escuchar los mensajes entrantes.

Sobre su segunda pregunta, usted debe poner un bloque try / catch dentro del método, detectar la excepción y manejarlo. No vuelva a tirarlo.

  

Pero no entiendo cómo funciona. .... espera hasta que algo aparece en el   lector de buffer y cuando algo   Parece que hay que devuelve true

No, devuelve el valor de la expresión (inputLine = input.readLine ()), el propio inputLine. El inputLine se compara con un valor nulo.

Se devuelve NULL cuando se alcanza el "EOF (End Of File)". Dado que esta es la lectura de un enchufe de la red, al final del archivo se crea cuando se desconecta la toma de corriente (ya sea por el servidor o el cliente), pero es probable que obtendrá una excepción antes de que realmente ve el EOF.

Si esto no es para hacer la tarea, es posible que desee ver en Apache Commons IOUtils .

Suponiendo que no se crea el BufferedReader, y sólo se detienen en el InputStream:

String results = IOUtils.toString(inputStream);
System.out.println(results);
while ((inputLine = input.readLine()) != null) {

vistazo a cada parte de la expresión:

input.readLine()

Devuelve una cadena que será nulo si se ha alcanzado el final de la secuencia (o produce una excepción en error).

inputLine = input.readLine()

Asigna esta cadena para inputLine

((inputLine = input.readLine()) != null)

Comprueba que la cadena que fue asignado no es nulo (final de la corriente).

Se han recibido algunas buenas respuestas. Sólo detectar la excepción y tratar con él de forma local. Si tiene que pasar esto a otro código, pero no puede ya que el método run() no permite ninguna excepción verificación, se puede envolver la excepción en un RuntimeException de algún tipo. Si el método de ejecución se ejecuta directamente en una rosca (ya que es un Ejecutable probable), entonces usted debe tener cuidado con la re-lanzar una excepción ajustada.

En cuanto al resultado de readLine(), volverá null cuando no hay nada más para leer. En el caso de una toma de esto es cuando la otra parte limpiamente cierra el socket (cualquier terminación repentina o impuro estrecha típicamente como resultado una excepción en el código como el sistema operativo enviará un tipo diferente de notificación de socket cerca).

Tengo una palabra de precaución, ya que está envolviendo un enchufe en un java.io.BufferedReader. Usted debe tener mucho cuidado con el uso de este en cualquier tipo de código de producción.

El peligro es que BufferedReader no trata bien con excepciones en el medio de la lectura. Esto es especialmente un problema si se ha habilitado un tiempo de espera en el zócalo de lo que el código recibirá excepciones periódicas de forma automática desde el sistema operativo. El tiempo de espera (o de otro excepción) podrían venir mientras que el tampón en el interior del lector se está llenando. Si intenta volver a utilizar el objeto después de la excepción, ignorará cualquier contenido previo de la memoria intermedia. El paquete (s) que se recibieron previamente se pierden en silencio y no hay manera de recuperar esos bytes.

Tenga en cuenta que existen otros tipos de excepciones de socket que no queremos decir que la toma de corriente se ha perdido. Por ejemplo, mira la definición de java.io.InterruptedIOException. Esto tiene una variable pública que informa del número de bytes transferidos con éxito en el más reciente de E / S (lectura o escritura) por encargo. Esto significa que la operación IO se puede ejecutar de nuevo para recuperar o enviar los bytes restantes para el paquete.

Si a cualquier excepción que su diseño es cerrar inmediatamente el lector y el zócalo del método funcionará correctamente.

La forma correcta de leer desde una toma de corriente es utilizar la corriente toma directamente, utilice NIO (ByteBuffers y tal), o utilizar una biblioteca de red bien escrito con buenas abstracciones sobre estas clases de nivel inferior (varios más de código abierto están disponibles) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top