Je commence juste avec la sérialisation Java et je ne suis pas clair sur la manière dont vous êtes censé obtenir des objets d'une source dans un scénario avec des E / S non bloquant. P>
Toute la documentation que je peux trouver suggérer à l'aide d'ObjectInPhatStretre est le moyen approprié em> à lire dans des objets sérialisés. Cependant, comme je l'ai mentionné, j'utilise Java.nio et effectuer des opérations non bloquantes. Si ReadObject () bloquera jusqu'à ce qu'un nouvel objet soit disponible, cela ne peut pas m'aider P>
Résumé .. Comment faites-vous la sérialisation lorsque vous travaillez avec Java Nio? P>
3 Réponses :
Vous devrez mettre en œuvre (ou trouver une implémentation) d'un Cela semble une chose assez étrange à essayer de faire. Nio est tout à propos de la haute performance et la sérialisation n'est pas. P> INPUTStream code> qui se lit à partir d'un tampon que vous pouvez ajouter à partir d'un autre fil. P>
J'utilise NIO parce que j'ai trouvé l'interface plus facile à utiliser lorsqu'il s'agit d'un grand nombre de flux. La performance n'est pas une préoccupation principale.
Ceci est classique - Comment pouvez-vous .Fread () s'il n'y a rien à lire? Nio est clairement performant intensif, dédié à la réalisation de l'IO non bloquante. Essayez de faire Nio sur socket.Read () - Vous obtiendrez toujours une opération de blocage ou de tomber dans le délai d'attente ... Aucune quantité de fantaisie entraînera l'apparition de données sur le "port" à moins que vous ne produisiez certaines données ...
try { // Create a read/writeable file channel File file = new File("filename"); FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); // Create an output stream on the channel OutputStream os = Channels.newOutputStream(channel); // Create an inputstream on the channel InputStream is = Channels.newInputStream(channel); // Close the channel is.close(); } catch (IOException e) { }
Je ne pense pas que vous lisez mon post. Je cherche une façon de faire la sérialisation sur un flux non bloquant.
Enveloppez les instances sérialisées dans un protocole qui indique une longueur de charge utile et la charge utile est l'instance en question. Ensuite, une fois que vous savez que vous avez un segment qui représente une instance complète, vous pouvez utiliser ObjectInphatStream, sachant que cela ne bloque pas. P>
protocole comme celui-ci 32 premiers bits: longueur de la charge utile Longueur de charge utile BITS: Données sérialisées P>
Parfois, je m'abaze même moi-même. P>
Maintenant, je sais pourquoi les chaînes de Fortran commencent avec la taille de la chaîne, puis contentez-vous. ibiblio. org / pub / langues / fortran / ch2-13.html
Peut-être que vous pouvez utiliser la méthode disponible () si le flux au sondage s'il y a des octets à lire.
TYPO: Cela devrait bien sûr lire "... du flux."