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?
10 Réponses :
Je pense que la meilleure chose à faire serait de mettre chaque ligne du fichier 1 dans un 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 hashmap code>; Ensuite, vous pouvez vérifier chaque ligne de fichier 2 pour l'appartenance à votre
hashmap code> plutôt que de lire dans l'ensemble du fichier une fois pour chaque ligne de fichier 1. P>
InputStream code> /
lecteur code>. p >
+1 - Il est beaucoup plus efficace de charger le fichier 1 en premier. Sauf si les fichiers peuvent être très importants.
Je crois RandomAccessFile code>
est ce dont vous avez besoin. Il contient: randomAccessfile # rechercher code> et
aléatoireAccessfile # getFilePointer code>. P>
rewind () code> est
recherche (0) code> p>
Eh bien, Gennady S. Réponse est ce que j'utiliserais pour résoudre votre problème. p>
J'écris un programme en Java qui me demande de comparer les données dans 2 fichiers p> blockQuote>
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/ p>
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.
É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() }
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 code>
hérite Mark () code>
et réinitialiser () code>
méthodes qui abordent cet objectif. P>
Comme indiqué, il y a de meilleurs algorithmes - enquêtez sur ces p>
Misté: p>
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 p>
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) p>
Je crois que vous pourriez simplement réinitialiser le lecteur de fichier de fichier 2 et cela devrait le réinitialiser. P>
Si vous pouvez clairement identifier la dimension doivent En supposant une limite de 100 caractères Votre code doit ressembler à: p>
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. 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")));
}
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 code>. Cette hypothèse est basée sur des questions antérieures de l'OP et de la difficulté comparative des solutions.