Lendo N bytes atomicamente sem bloqueio

votos
0

Eu só fiz uma pergunta sobre o porquê de meu fio desligamento não estava funcionando. Acabou sendo devido a readLine()bloqueando o meu fio antes da bandeira desligamento poderia ser reconhecido. Este foi fácil de corrigir, verificando ready()antes de chamar readLine().

No entanto, agora estou usando um DataInputStreampara fazer o seguinte na série:

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

Eu sei que eu poderia implementar minha própria buffer que iria verificar a bandeira de arquivo em execução enquanto carregando o buffer. Mas eu sei que isso seria tedioso. Em vez disso, eu poderia deixar os dados serão colocados dentro da InputStreamclasse, e esperar até que eu tenha minhas nbytes ler, antes de executar um non-blocking ler - como eu sei o quanto necessidade I de ler.

  • 4 bytes para o primeiro inteiro
  • 4 bytes para o segundo número inteiro y
  • e ybytes para a zmatriz de bytes.

Em vez de utilizar ready()para verificar se há uma linha no buffer, existe algum equivalente ready(int bytesNeeded)?

Publicado 14/02/2020 em 00:00
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

O available()método regressa a quantidade de bytes no InputStreambuffer interno s.

Assim, pode-se fazer algo como:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Respondeu 14/02/2020 em 00:19
fonte usuário

votos
0

Você pode usar InputStream.available()para obter uma estimativa da quantidade de bytes que pode ser lido. Citando o Javadoc :

Retorna uma estimativa do número de bytes que podem ser lidos (ou saltados por cima) a partir deste fluxo de entrada, sem bloqueio, que podem ser 0, ou 0, quando for detectado o fim do fluxo. A leitura pode ser no mesmo segmento ou outro segmento. Uma única leitura ou pular de este muitos bytes não vai bloquear, mas podem ler ou pular menos bytes.

Em outras palavras, se available()os retornos n, você sabe que você pode chamar com segurança read(n)sem bloqueio. Note que, como os estados de Javadoc, o valor retornado é uma estimativa. Por exemplo, InflaterInputStream.available () sempre retornará 1 se EOF não é alcançado. Verifique a documentação da InputStreamsubclasse que será utilizado para garantir que ele atenda às suas necessidades.

Respondeu 14/02/2020 em 00:20
fonte usuário

votos
0

Você está indo a necessidade de implementar o seu próprio equivalente BufferedInputStream. Quer como um único proprietário de um InputStreame uma rosca (possivelmente emprestado de uma piscina) para bloquear no. Alternativamente, implementar com NIO.

Respondeu 14/02/2020 em 00:51
fonte usuário

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