Écrire à FileOutputStream à partir de plusieurs threads en Java
Est-il sûr d'appel write
sur Java FileOutputStream
forme d'objet de plusieurs threads? Sera la sortie être sérialisé correctement?
précisions:
Dans mon cas, la classe logger est titulaire d'un FileOutputStream de référence, et plusieurs threads peuvent appeler enregistreur écrire, que les formats de sortie et les appels FileOutputStream écrire.
Devrais-je synchroniser mon enregistreur de la méthode d'écriture de garantir que les messages à partir de plusieurs threads ne sont pas mixtes?
vous voudrez peut-être regarder dans FileChannel
Je seconde Nerdtron de réponse. La Java nio FileChannel solution est de loin la plus simple à mettre en œuvre.
Je seconde Nerdtron de réponse. La Java nio FileChannel solution est de loin la plus simple à mettre en œuvre.
OriginalL'auteur José | 2011-12-07
Vous devez vous connecter pour publier un commentaire.
Un fichier ne peut être ouvert plus d'une fois dans
write-mode
, donc la réponse est non.Après avoir vu ton edit, oui, vous devez introduire la synchronisation de votre enregistreur à assurez-vous que le flux est accessible que par un seul thread à la fois. Juste une suggestion, pourquoi ne pas vous aller pour Log4J? Déjà, elle s'occupe de votre cas d'utilisation.
Juste édité ma réponse, veuillez jeter un oeil à elle
À propos de log4j, qui fait partie d'une bibliothèque, il y a un journal de l'interface et la mise en œuvre simple il suffit d'écrire dans un fichier, les applications peuvent toujours utiliser log4J ou d'autres, mais je ne veux pas la force de cette dépendance pour les cas simples.
ah ok. Si vous ne souhaitez pas utiliser log4j alors c'est très bien. Juste assurez-vous que vos fils sont synchronisés lors de la rédaction de votre fichier de log
Pouvons-nous obtenir une source pour cette affirmation? Je vais avoir du mal à trouver toute réclamation à ce sujet dans la documentation officielle.
OriginalL'auteur GETah
Ici est une simple mise en œuvre d'un synchronisé de l'enregistreur en utilisant le java nio FileChannel.
Dans cet exemple, les messages du journal sont limité à 1024 octets. Vous pouvez régler le journal de la longueur du message en changeant le BUFFER_SIZE valeur.
C'est comment vous pouvez l'utiliser :
OriginalL'auteur Akos Cz
Pas. Java ne supporte pas de streaming pour le même flux à partir de plusieurs threads.
Si vous voulez faire usage filetée ruisseaux, consultez ce site: http://lifeinide.com/post/2011-05-25-threaded-iostreams-in-java/
Il explique bien les choses et a un exemple de code pour un
ThreadedOutputStream
, qui permettrait de faire ce que vous voulez.OriginalL'auteur Jon Egeland
Si vous voulez garder la commande (c'est à dire un message 1 dans le flux de sortie est venu avant que le message 2) vous avez pour verrouiller le flux. Ce à son tour, réduit la concurrence. (Tous les threads seront mis en file d'attente dans la serrure/du sémaphore de la file d'attente et attendre pour le flux de devenir à leur disposition)
Si vous n'êtes intéressés que par écrit à un flux de données en même temps et ne se soucient pas de la commande, vous pouvez avoir des tampons pour chaque thread. Chaque thread écrit de sa propre mémoire tampon. Lorsque le tampon est plein, il acquiert une serrure (ce qui peut impliquer une attente de la serrure) sur le cours d'eau et déverse son contenu dans le flux.
Edit:
Je viens de réaliser que, si vous vous souciez de la commande et que vous voulez encore le multi-threading, si vous aussi écrire à la fois dans le flux de sortie au format unix (comme un long). Après le flux est vidé sur un autre conteneur, les contenus peuvent être triés en fonction du temps, et vous devriez avoir un ordre de fichier.
OriginalL'auteur Adrian