Lectura n bytes atómicamente sin bloqueo

votos
0

Yo sólo hice una pregunta acerca de por qué mi cerrada hilo hacia abajo no estaba funcionando. Se terminó siendo debido al readLine()bloqueo de mi hilo antes se podía reconocer la bandera de apagado. Esto era fácil de solucionar mediante la comprobación ready()antes de llamar readLine().

Sin embargo, ahora estoy usando un DataInputStreamhacer lo siguiente en la serie:

int x = reader.readInt();
int y = reader.readInt();
byte[] z = new byte[y]
reader.readFully(z);

Sé que podría poner en práctica mi propia búfer que compruebe el indicador de archivos que ejecutan durante la carga de la memoria intermedia. Pero sé que esto sería tedioso. En su lugar, podría dejar que los datos deben tamponar dentro de la InputStreamclase, y esperar hasta que tenga mis nbytes leídos, antes de ejecutar un no-bloqueo de lectura - que yo sepa cuánto necesidad que a leer.

  • 4 bytes para el primer entero
  • 4 bytes para el segundo número entero y
  • y ybytes para la zmatriz de bytes.

En lugar de utilizar ready()para comprobar si hay una línea en el búfer, ¿hay algún equivalente ready(int bytesNeeded)?

Publicado el 14/02/2020 a las 00:00
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

El available()método devuelve la cantidad de bytes en el InputStreambuffer interno s.

Así, uno puede hacer algo como:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Respondida el 14/02/2020 a las 00:19
fuente por usuario

votos
0

Se puede utilizar InputStream.available()para obtener una estimación de la cantidad de bytes que puede ser leído. Citando el Javadoc :

Devuelve una estimación del número de bytes que se pueden leer (o saltado) de este flujo de entrada sin bloqueo, que puede ser 0, o 0 cuando se detecta final de corriente. La lectura podría estar en el mismo hilo u otro hilo. Una sola lectura o saltar a esto muchos bytes no bloqueará, pero puede leer o saltar menos bytes.

En otras palabras, si available()vuelve n, usted sabe que puede llamar de forma segura read(n)sin bloquear. Tenga en cuenta que, como dice el Javadoc, el valor devuelto es una estimación. Por ejemplo, InflaterInputStream.available () siempre devuelve 1 si no se alcanza EOF. Consulte la documentación de la InputStreamsubclase que va a utilizar para asegurarse de que satisfaga sus necesidades.

Respondida el 14/02/2020 a las 00:20
fuente por usuario

votos
0

Usted va a necesitar para poner en práctica su propio equivalente BufferedInputStream. Ya sea como un único propietario de un InputStreamy una rosca (posiblemente tomado de una piscina) para bloquear en. Alternativamente, implementar con NIO.

Respondida el 14/02/2020 a las 00:51
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more