En Java, ce qui est la meilleure/la plus sûre modèle pour l'analyse d'un fichier annexé?
De quelqu'un d'autre processus est la création d'un fichier CSV en ajoutant une ligne à la fois, que les événements se produisent. Je n'ai pas de contrôle sur le format de fichier ou l'autre processus, mais je sais que ce sera uniquement ajouter.
Dans un programme Java, je tiens à surveiller ce fichier, et quand une ligne est ajoutée lire la nouvelle ligne et de réagir en fonction de son contenu. Ignorer le CSV analyse de problème pour l'instant. Quelle est la meilleure façon de suivre le dossier de changement et d'en lire une ligne à la fois?
Idéalement, ce sera l'utilisation de la bibliothèque standard classes. Le fichier est peut-être sur un lecteur réseau, donc je voudrais quelque chose de solide à l'échec. Je préfère ne pas utiliser d'interrogation si possible, je préfèrerais une sorte de solution de blocage à la place.
Edit -- étant donné qu'une solution de blocage n'est pas possible avec les classes standard (merci pour cette réponse), ce qui est le plus robuste solution de vote? Je préfère ne pas re-lire le fichier en entier à chaque fois qu'il pourrait devenir assez grand.
OriginalL'auteur Nick Fortescue | 2009-07-02
Vous devez vous connecter pour publier un commentaire.
Depuis Java 7, il a été le newWatchService() méthode sur la Système de fichiers de classe.
Cependant, il ya quelques mises en garde:
Avant Java 7, il n'est pas possible avec l'Api standard.
J'ai essayé le suivant (interrogation sur un de 1 seconde d'intervalle) et il fonctionne (juste des impressions traitement de l'information):
Que personne d'autre a suggéré une solution qui utilise un courant de la production de Java j'ai pensé que je pourrais ajouter. Si il y a des failles, veuillez les ajouter dans les commentaires.
Mon exigence est de regarder un dossier et dès qu'un fichier est ajouté/écrit/déplacé dans le dossier, prendre des mesures immédiatement sur elle (par exemple, e-mail le fichier). Problème, je suis en cours d'exécution en est que lorsque le fichier est volumineux, il peut prendre un certain temps pour obtenir terminé écrits ou copiés, alors que la FILE_CREATE événement est annoncé dès les premiers octets du fichier sont écrites dans le dossier. Je ne peux donc pas effectuer l'action immédiatement. Ce qui est un moyen fiable pour déterminer si le fichier a été entièrement écrit avant d'effectuer toute action sur elle?
OriginalL'auteur
Vous pouvez vous inscrire pour être averti par le système de fichiers si un changement se produit dans le fichier à l'aide de WatchService classe. Cela nécessite Java7, voici le lien pour la documentation http://docs.oracle.com/javase/tutorial/essential/io/notification.html
ici l'extrait de code pour faire ça:
OriginalL'auteur
Utilisation de Java 7 WatchService, une partie de NIO.2
Actuellement, il y a l'accès anticipé à la version de l'aperçu, ou la dernière binaire instantané de la libération.
WatchService montres répertoires, pas les fichiers
OriginalL'auteur
Ce n'est pas possible avec la norme de la bibliothèque de classes. Voir ce question pour plus de détails.
Efficace de l'interrogation, il sera préférable d'utiliser D'Accès Aléatoire. Il vous sera utile de rappeler la position de la dernière fin de fichier et commencer la lecture à partir de là.
OriginalL'auteur
Juste pour élargir sur Nick Fortescue de la dernière entrée, ci-dessous, deux classes que vous pouvez exécuter simultanément (par exemple, dans deux différents shell windows) qui montre qu'un Fichier peut simultanément être écrit par un processus et lu par un autre.
Ici, les deux processus de l'exécution de ces classes Java, mais je présume que le processus d'écriture pourrait être de n'importe quelle autre application. (En supposant qu'il ne détient pas un verrou exclusif sur le fichier-y at-il des système de fichiers verrous sur certains systèmes d'exploitation?)
J'ai testé avec succès ces deux classes sur les deux Windoze et Linux. Je voudrais bien savoir si il y a une condition (par exemple, système d'exploitation) sur lequel ils échouent.
Classe #1:
Classe #2:
OriginalL'auteur
Malheureusement, TailInputStream classe, qui peut être utilisé pour surveiller la fin d'un fichier, n'est pas un standard de la plate-forme Java classes, mais il y a quelques implémentations sur le web. Vous pouvez trouver une mise en œuvre de TailInputStream classe avec un exemple d'utilisation sur http://www.greentelligent.com/java/tailinputstream.
OriginalL'auteur
Sondage, soit sur un même cycle ou aléatoires de cycle; 200-2000ms devrait être un bon sondage aléatoire de l'intervalle de durée.
Vérifier deux choses...
Si vous devez regarder pour la croissance de fichier, puis cochez la EOF /nombre d'octets, et assurez-vous de comparer et de les fileAccess ou fileWrite fois avec la fille du sondage. Si ( > ), alors le fichier a été écrit.
Ensuite, combinez cela avec la vérification de verrouillage exclusif /accès en lecture. Si le fichier peut être verrouillé en lecture et qu'il a grandi, puis tout ce qui était écrit qu'il a terminé.
Vérification soit bien seul ne sera pas nécessairement vous obtenir une garantie de l'état de l'écrit++ et réellement fait et disponible pour utilisation.
OriginalL'auteur