102 votes

Comment utiliser Java pour lire à partir d'un fichier en cours d'écriture?

J'ai une application qui écrit des informations sur le fichier. Cette information est utilisée post-exécution pour déterminer la réussite/échec/de l'exactitude de l'application. Je aimerais être en mesure de lire le fichier comme il est écrit afin que je puisse faire ces de réussite/échec/de l'exactitude des contrôles en temps réel.

Je suppose qu'il est possible de le faire, mais quels sont les pièges impliqués lors de l'utilisation de Java? Si la lecture des captures de l'écriture, il vous suffit d'attendre plus d'écritures jusqu'à la fermeture du fichier ou le lire lever une exception à ce point? Dans ce dernier cas, que dois-je faire ensuite?

Mon intuition est actuellement de me pousser vers BufferedStreams. Est-ce la voie à suivre?

42voto

Joseph Gordon Points 950

Impossible que l'exemple fonctionne avec FileChannel.read (ByteBuffer) car il ne s'agit pas d'une lecture bloquante. Cependant, le code ci-dessous a-t-il fonctionné:

 boolean running = true;
BufferedInputStream reader = new BufferedInputStream( 
    new FileInputStream( "out.txt" ) );

public void run() {
    while( running ) {
        if( reader.available() > 0 ) {
            System.out.print( (char)reader.read() );
        }
        else {
            try {
                sleep( 500 );
            }
            catch( InterruptedException ex )
            {
                running = false;
            }
        }
    }
}
 

Bien sûr, la même chose fonctionnerait comme une minuterie au lieu d'un fil, mais je laisse cela au programmeur. Je cherche toujours un meilleur moyen, mais cela fonctionne pour moi pour le moment.

Oh, et je tiens à le préciser: j'utilise 1.4.2. Oui, je sais que je suis encore dans l'âge de pierre.

12voto

Joshua Points 8315

Envisagez d’utiliser le Tailer d’Apache Commons IO. Il gère la plupart des cas marginaux.

6voto

Frederic Morin Points 1944

Vous pouvez également jeter un coup d'œil à java channel pour verrouiller une partie d'un fichier.

http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html

Cette fonction du FileChannel pourrait être un début

 lock(long position, long size, boolean shared)
 

Un appel de cette méthode sera bloqué jusqu'à ce que la région puisse être verrouillée

3voto

Anthony Cramp Points 1665

La réponse semble être "non" ... et "oui". Il semble y avoir aucun moyen réel de savoir si un fichier est ouvert en écriture par une autre application. Ainsi, la lecture d'un tel fichier sera juste progresser jusqu'à ce que le contenu est épuisé. J'ai pris les conseils de Mike et a écrit quelques-unes de code de test:

Writer.java écrit une chaîne de caractères sur fichier, puis attend que l'utilisateur appuyez sur entrée avant d'écrire une ligne dans un fichier. L'idée étant qu'il pourrait être mis en service, puis un lecteur peut être commencé à voir comment il se débrouille avec les "partielle" du fichier. Le lecteur que j'ai écrit est en Reader.java.

Writer.java

public class Writer extends Object

Reader.java


Aucune garantie que ce code est la meilleure pratique.

Cela laisse l'option suggérée par Mike de vérifier régulièrement si il y a de nouvelles données à lire à partir du fichier. Cela nécessite alors une intervention de l'utilisateur pour fermer le lecteur de fichier lorsqu'il est déterminé que la lecture est terminée. Ou, le lecteur doit connaître le contenu du fichier et être en mesure de déterminer et à la fin de l'écriture de la condition. Si le contenu XML, à la fin du document pourrait être utilisé pour le signaler.

1voto

Matthew Schinckel Points 15596

Pas Java per se, mais vous pouvez rencontrer des problèmes lorsque vous avez écrit quelque chose dans un fichier, mais il n'a pas été réellement écrit encore - c'est peut-être dans un cache quelque part, et de la lecture à partir du même fichier peut ne pas vous donner de nouvelles informations.

Version courte - utiliser la méthode flush() ou quel que soit le système d'appel est de s'assurer que vos données sont écrites sur le fichier.

Notez que je ne parle pas de l'OS au niveau du cache disque - si vos données se ici, il doit apparaître dans un read() après ce point. Il se peut que la langue elle-même caches écrit, en attente jusqu'à ce qu'un tampon se remplit ou le fichier est vidé/fermé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X