7
votes

Java Serializable, ObjectInPhatStream, E / S non bloquant

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.

Toute la documentation que je peux trouver suggérer à l'aide d'ObjectInPhatStretre est le moyen approprié à 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

Résumé .. Comment faites-vous la sérialisation lorsque vous travaillez avec Java Nio?


2 commentaires

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."


3 Réponses :


-1
votes

Vous devrez mettre en œuvre (ou trouver une implémentation) d'un INPUTStream qui se lit à partir d'un tampon que vous pouvez ajouter à partir d'un autre fil.

Cela semble une chose assez étrange à essayer de faire. Nio est tout à propos de la haute performance et la sérialisation n'est pas.


1 commentaires

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.



-2
votes

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) {
}


1 commentaires

Je ne pense pas que vous lisez mon post. Je cherche une façon de faire la sérialisation sur un flux non bloquant.



4
votes

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.

protocole comme celui-ci 32 premiers bits: longueur de la charge utile Longueur de charge utile BITS: Données sérialisées

Parfois, je m'abaze même moi-même.


1 commentaires

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