12
votes

Comment puis-je réinitialiser le pointeur de fichier au début du fichier en Java?

J'écris un programme en Java qui me demande de comparer les données dans 2 fichiers. Je dois vérifier chaque ligne du fichier 1 contre chaque ligne de fichier 2 et si je trouve une correspondance, écrivez-les dans un troisième fichier. Après avoir lu à la fin du fichier 2, comment réinitialiser le pointeur au début du fichier? xxx


2 commentaires

Ok - j'ai fait l'orthographe et la grammaire, je ne fais pas le formatage.


Je soupçonne que l'affiche originale peut être erronée à interpréter la mission et ce qui a été demandé était un Diff . Cette hypothèse est basée sur des questions antérieures de l'OP et de la difficulté comparative des solutions.


10 Réponses :


5
votes

Je pense que la meilleure chose à faire serait de mettre chaque ligne du fichier 1 dans un hashmap ; Ensuite, vous pouvez vérifier chaque ligne de fichier 2 pour l'appartenance à votre hashmap plutôt que de lire dans l'ensemble du fichier une fois pour chaque ligne de fichier 1.

Mais pour répondre à votre question de savoir comment revenir au début du fichier, la chose la plus facile à faire est d'ouvrir un autre InputStream / lecteur .


1 commentaires

+1 - Il est beaucoup plus efficace de charger le fichier 1 en premier. Sauf si les fichiers peuvent être très importants.



14
votes

Je crois RandomAccessFile est ce dont vous avez besoin. Il contient: randomAccessfile # rechercher et aléatoireAccessfile # getFilePointer .

rewind () est recherche (0)


0 commentaires

1
votes

Eh bien, Gennady S. Réponse est ce que j'utiliserais pour résoudre votre problème.

J'écris un programme en Java qui me demande de comparer les données dans 2 fichiers

Cependant, je préférerais ne pas le décoder. Je préférerais utiliser quelque chose comme http://code.google.com/p/java-diff-utils/


5 commentaires

C'est un plaisir de savoir qu'il existe une source ouverte qui s'attaque à ce type de problèmes, bien que le type de licence GPL puisse devenir un problème grave dans l'utilisation.


@Gennady - seulement au pays des dinosaures :-). Mais sérieusement, si vous n'êtes pas satisfait de la GPL, vous êtes libre de développer vos propres bibliothèques non-GPL.


@Stephen C, ce n'est pas moi, c'est le département de droit de la société :-) Mais de toute façon, GPL exige que votre code devienne GPL qui ne soit pas approprié dans de nombreux cas.


@Gennady - et ma réponse reste la même. Si GPL ne convient pas à vous / votre entreprise, ne vous plaignez pas. Il suffit de trouver une alternative non-gpl ou de développer une sur place.


@Stephen c, qui ne s'est pas plaint. C'était l'information qui importe de décider si la bibliothèque est utilisable pour la personne qui pose une question.



2
votes

Évidemment, vous pouvez simplement fermer et rouvrir le fichier comme celui-ci:

     while((s1=file1.data.readLine())!=null){
         System.out.println("s1: "+s1);
         FileReader file2=new FileReader("d:\\testfiles\\FILE2.txt");
         while((s2=file2.data.readLine())!=null){
             System.out.println("s2: "+s2);
             //compare s1 and s2;
         }
         file2.closeFile()
     }


0 commentaires

0
votes

Comme d'autres ont suggéré, vous devez envisager d'autres approches du problème. Pour la question spécifique du retour à un point précédent dans un fichier, java.io.filereader hérite Mark () et réinitialiser () méthodes qui abordent cet objectif.


0 commentaires

0
votes

Comme indiqué, il y a de meilleurs algorithmes - enquêtez sur ces

Misté:

FileReader ne met pas en œuvre la marque et la réinitialisation, les commentaires de Trashgod sont donc inexacts. Vous devrez soit mettre en œuvre une version de ceci (à l'aide de RandomAccessFile ou quoi non) ou enveloppez-la dans une mémoire tampon. Cependant, ce dernier chargera le tout en mémoire si vous le marquez


0 commentaires

0
votes

juste une question rapide. Vous ne pouvez pas garder un objet pointé au début du fichier et traverser le fichier avec un autre objet? Ensuite, lorsque vous arrivez à la fin, dirigez-le à l'objet au début du fichier (flux). Je crois que C ++ a de tels mécanismes avec des fichiers d'E / S (ou s'agit-il d'I / O)


0 commentaires

0
votes

Je crois que vous pourriez simplement réinitialiser le lecteur de fichier de fichier 2 et cela devrait le réinitialiser.


0 commentaires

0
votes

Si vous pouvez clairement identifier la dimension de votre fichier, vous pouvez utiliser mark (int Readaheadlimit) et réinitialiser () de la classe < em> bufferedreader . La méthode marque (int Readahedlimit) ajoutez un marqueur à la position actuelle de votre bufferedReader et vous pouvez revenir sur le marqueur en utilisant réinitialiser () .

doivent faire attention au nombre de caractères à lire jusqu'à ce que réinitialiser () , vous devez les spécifier comme argument de la fonction marque (int Readahedlimit) .

En supposant une limite de 100 caractères Votre code doit ressembler à: xxx


0 commentaires

0
votes

Si vous souhaitez simplement réinitialiser le pointeur de fichier en haut du fichier, réinitialiser votre lecteur de tampon. Je suppose que vous utilisez également l'essai et que vous attrapez le bloc pour vérifier la fin du fichier. XXX PRE>

Disons que c'est ainsi que vous avez votre lecteur de tampon défini. Maintenant, voici comment vous pouvez vérifier pour la fin du fichier = NULL. P>

boolean has_data= true;

while(has_data)
     {    
      try
     {
     record = read_data_file.readLine();
     delimit = new StringTokenizer(record, ",");
     //Reading the input in STRING format. 
     cus_ID = delimit.nextToken();
     cus_name = delimit.nextToken();'
      //And keep grabbing the data and save it in appropriate fields. 
     }
catch (NullPointerException e)
     {
      System.out.println("\nEnd of Data File... Total "+ num_of_records 
                       + " records were printed. \n \n");
      has_data = false; //To exit the loop. 
      /*
        ------> This point is the trouble maker. Your file pointer is pointing at the end of the line. 
     -->If you want to again read all the data FROM THE TOP WITHOUT   RECOMPILING: 
      Do this--> Reset the buffer reader to the top of the file.
      */                      
      read_data_file = new BufferedReader(new FileReader(new File("datafile.dat")));
}


0 commentaires