Lecture octets n atomiquement sans blocage

voix
0

Je viens de poser une question sur pourquoi mon arrêt de fil vers le bas ne fonctionnait pas. Il a fini par être en raison de readLine()bloquer mon fil avant de pouvoir être reconnu le drapeau d'arrêt. Cela a été facile de fixer en cochant ready()avant d' appeler readLine().

Cependant, j'utilise maintenant DataInputStreameffectuer les opérations suivantes en série:

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

Je sais que je pourrais mettre en œuvre mon propre tampon qui vérifierait le drapeau du fichier en cours d' exécution lors du chargement de la mémoire tampon. Mais je sais que ce serait fastidieux. Au lieu de cela, je pouvais laisser les données soient mises en mémoire tampon au sein de la InputStreamclasse, et d' attendre jusqu'à ce que j'ai mes noctets lus, avant d' exécuter un non-bloquante - comme je sais à quel point besoin de lire que je.

  • 4 octets pour le premier nombre entier
  • 4 octets pour le deuxième nombre entier y
  • et les yoctets du ztableau d'octets.

Au lieu d'utiliser ready()pour vérifier s'il y a une ligne dans la mémoire tampon, est - il un équivalent ready(int bytesNeeded)?

Créé 14/02/2020 à 00:00
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

La available()méthode retourne le nombre d'octets dans la InputStreams mémoire tampon interne.

Ainsi, on peut faire quelque chose comme:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Créé 14/02/2020 à 00:19
source utilisateur

voix
0

Vous pouvez utiliser InputStream.available()pour obtenir une estimation de la quantité d'octets qui peut être lu. Citant le Javadoc :

Retours une estimation du nombre d'octets qui peuvent être lus (ou sautée) à partir de ce flux d'entrée sans blocage, qui peut être 0, ou 0 en cas de détection de fin ruisseau. La lecture peut être sur le même fil ou un autre thread. Une lecture simple ou sauter de ce nombre d'octets ne bloque pas, mais peut lire ou sauter moins d'octets.

En d' autres termes, si les available()retours n, vous savez que vous pouvez appeler en toute sécurité read(n)sans bloquer. Notez que, comme l'indique Javadoc, la valeur retournée est une estimation. Par exemple, InflaterInputStream.available () retournera toujours 1 si EOF n'est pas atteint. Consultez la documentation de la InputStreamsous - classe que vous utiliserez pour vous assurer qu'il répond à vos besoins.

Créé 14/02/2020 à 00:20
source utilisateur

voix
0

Vous allez avoir besoin de mettre en œuvre votre propre équivalent BufferedInputStream. Soit en tant que propriétaire unique d'un InputStreamet un fil (peut - être emprunté à une piscine) pour bloquer en. Vous pouvez également mettre en œuvre avec NIO.

Créé 14/02/2020 à 00:51
source utilisateur

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