Comment puis-je Réinitialiser Le Pointeur de Fichier au Début du Fichier en Java?
Je suis en train d'écrire un programme en Java qui m'oblige à comparer les données dans les 2 fichiers. Je dois vérifier chaque ligne du fichier de 1 pour chaque ligne du fichier 2 et si je trouve un match de les écrire dans un troisième fichier. Après j'ai lu à la fin du fichier 2, comment puis-je réinitialiser le pointeur au début du fichier?
public class FiFo {
public static void main(String[] args)
{
FileReader file1=new FileReader("d:\\testfiles\\FILE1.txt");
FileReader file2=new FileReader("d:\\testfiles\\FILE2.txt");
try{
String s1,s2;
while((s1=file1.data.readLine())!=null){
System.out.println("s1: "+s1);
while((s2=file2.data.readLine())!=null){
System.out.println("s2: "+s2);
}
}
file1.closeFile();
file2.closeFile();
}catch (IOException e) {
e.printStackTrace();
}
}
}
class FileReader {
BufferedReader data;
DataInputStream in;
public FileReader(String fileName)
{
try{
FileInputStream fstream = new FileInputStream(fileName);
data = new BufferedReader(new InputStreamReader(fstream));
}
catch (IOException e) {
e.printStackTrace();
}
}
public void closeFile()
{
try{
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
Ok - je ne l'orthographe et la grammaire, je ne fais pas la mise en forme.
Je soupçonne l'affiche originale peut être mis-interprétation de l'affectation et à ce qui était demandé était un dégénéré
Je soupçonne l'affiche originale peut être mis-interprétation de l'affectation et à ce qui était demandé était un dégénéré
diff
. Cette supposition est basée sur les questions préalables par les OP et les comparatifs de la difficulté de trouver les solutions.OriginalL'auteur Shaz | 2010-02-09
Vous devez vous connecter pour publier un commentaire.
Je crois
RandomAccessFile
est ce que vous avez besoin. Il contient:RandomAccessFile#seek
etRandomAccessFile#getFilePointer
.rewind()
estseek(0)
OriginalL'auteur
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 du fichier 2 membres de votreHashMap
plutôt que de lire le fichier en entier une fois pour chaque ligne de fichier 1.Mais pour répondre à votre question de savoir comment revenir au début du fichier, la meilleure chose à faire est d'ouvrir un autre
InputStream
/Reader
.OriginalL'auteur
Évidemment, vous pouvez simplement fermer et rouvrir le fichier comme ceci:
Mais vous ne voulez vraiment pas à le faire de cette façon, depuis cet algorithme est temps d'exécution est O(n2). si il y avait 1000 lignes dans Un fichier, et 10000 lignes dans le fichier B, votre boucle interne irait à 1 000 000 de fois.
Ce que vous devez faire est de lire chaque ligne et de le stocker dans une collection qui permet d'effectuer une recherche rapide pour voir si un élément est déjà contenue(probablement un HashSet).
Si vous avez uniquement besoin de vérifier pour voir ce que chaque ligne dans le fichier 2 est dans le fichier 1, alors il suffit d'ajouter à chaque ligne dans le fichier un à un HashSet, puis vérifiez que chaque ligne dans le fichier 2 est dans cet ensemble.
Si vous avez besoin de faire une comparaison où vous trouverez toutes les chaînes dans l'un mais pas l'autre, alors vous aurez besoin de deux hachage des ensembles, un pour chaque fichier. (Même si il y a un truc que vous pouvez faire pour utiliser un seul)
Si les fichiers sont volumineux que vous n'avez pas assez de mémoire, puis l'original de votre n2 méthode n'aurait jamais travaillé de toute façon.
OriginalL'auteur
bien, Gennady S. réponse est que je voudrais utiliser pour résoudre votre problème.
cependant, je préfère ne pas le code de ce nouveau.. je préfère utiliser quelque chose comme http://code.google.com/p/java-diff-utils/
seulement, dans la terre des dinosaures :-). Mais sérieusement, si vous n'êtes pas satisfait avec la GPL, libre à vous de développer vos propres non-GPL bibliothèques.
C, c'est pas moi, c'est la société département de droit 🙂 Mais de toute façon GPL requiert votre code pour devenir GPL qui n'est pas approprié dans de nombreux cas.
et ma réponse reste la même. Si la GPL n'est pas approprié pour vous/votre entreprise, ne se plaignent pas. Il suffit de trouver un non-GPL alternative ou aménager une maison.
C, qui n'était pas à plaindre. C'était l'information que c'est important de décider si la bibliothèque est utilisable pour la personne qui pose la question.
OriginalL'auteur
Comme d'autres l'ont suggéré, vous devriez envisager d'autres approches du problème. Pour la question spécifique de revenir à un point antérieur dans un fichier,
java.io.FileReader
héritemarque()
etreset()
méthodes qui répondent à cet objectif.OriginalL'auteur
Comme l'a noté, il y a de meilleurs algorithmes de - enquêter sur ces
de côté:
FileReader ne pas mettre en œuvre de marque et de réinitialisation, alors trashgod les commentaires sont inexactes.
Vous feriez soit de mettre en œuvre une version de ce (à l'aide de RandomAccessFile ou ne pas) ou enveloppez-les dans un BufferedReader. Cependant, ce dernier prendra en charge la totalité de la chose en mémoire si vous marquez
OriginalL'auteur
Juste une Question rapide. ne pouvez-vous pas de garder un objet pointé au début du fichier et de parcourir à travers le fichier avec un autre objet? Puis, quand vous arrivez à la fin il suffit de pointer vers l'objet au début du fichier de flux(stream). Je crois que C++ a ces mécanismes avec les e/S de fichier ( ou de flux I/O)
OriginalL'auteur
Je crois que vous pourriez tout simplement ré-initialiser le fichier 2 fichier lecteur et qui devrait réinitialiser.
OriginalL'auteur
Si vous pouvez clairement identifier les dimension de votre fichier, vous pouvez utiliser marque(int readAheadLimit) et reset() de la classe BufferedReader.
La méthode marque(int readAhedLimit) ajouter un marqueur à la position actuelle de votre BufferedReader et vous pouvez revenir au marqueur à l'aide de reset().
Utilisation, vous avez à être prudent le nombre de caractères à lire jusqu'à ce que le reset(), vous devez les spécifier comme argument de la fonction marque(int readAhedLimit).
En supposant une limite de 100 caractères de votre code devrait ressembler à:
OriginalL'auteur
Si vous voulez juste pour réinitialiser le pointeur de fichier au début du fichier, réinitialiser votre tampon lecteur. Je suppose que vous êtes aussi à l'aide de l'essayer et bloc catch pour vérifier à la fin du fichier.
Disons que c'est de cette façon que vous avez de votre tampon lecteur défini. Maintenant, c'est comment vous pouvez vérifier à la fin du fichier=null.
Par la réinitialisation de la mémoire tampon reader vous permet de réinitialiser le lecteur de fichiers marque/pointeur vers le haut du fichier et vous n'aurez pas à recompiler le fichier pour définir le lecteur de fichier marqueur/pointeur au début/à la tête de fichier.
Vous avez besoin de réinitialiser la mémoire tampon de lecture si vous ne voulez pas de recompiler et de tirer de la même cascade dans la même course. Mais si vous souhaitez simplement exécuter en boucle un moment, puis vous n'avez pas à tout cela, simplement recompiler le fichier, le lecteur repère sera mis vers le haut/début du fichier.
OriginalL'auteur