Insertion de texte dans un fichier existant via Java
Je voudrais créer un programme simple (en Java) qui édite des fichiers texte - en particulier celui qui effectue l'insertion arbitraire des morceaux de texte à des positions aléatoires dans un fichier texte. Cette fonctionnalité fait partie d'un vaste programme que je suis en train d'écrire.
La lecture de la description à propos de java.util.RandomAccessFile, il semble que toute écriture des opérations effectuées au moyen d'un fichier de remplacer la sortie de contenu. C'est un effet secondaire qui je tiens à éviter (si possible).
Est-il un moyen simple pour y parvenir?
Merci d'avance.
- Juste pour que vous le comprenez, ce n'est pas seulement une limite de Java. C'est assez bien comment toutes les I/O fonctionne. C'est la fonctionnalité que l'OS sous-jacent fournit.
- Peut-être qu'il est un système de fichiers de mise en œuvre qui prend en charge quelque chose comme lié liste des blocs de données qui pourrait permettre de données rapide insertion dans le milieu d'un fichier. Cependant, on aurait besoin d'assez bas niveau des appels système pour atteindre cet objectif.
- Je ne trouve pas l'exact de l'article, mais j'ai lu un expliquant comment utiliser une corde comme la structure de données de la conduite d'un simple éditeur de texte. en.wikipedia.org/wiki/Rope_%28computer_science%29
Vous devez vous connecter pour publier un commentaire.
D'accord, cette question est assez vieux, mais FileChannels existent depuis Java 1.4 et je ne sais pas pourquoi ils ne l'ont pas mentionné nulle part de traiter le problème du remplacement ou de l'insertion de contenu dans des fichiers. FileChannels sont rapidement, de les utiliser.
Voici un exemple (en ignorant les exceptions et quelques autres trucs):
Graphic
objet au lieu de FileChannel.Eh bien, non, je ne crois pas qu'il existe un moyen pour éviter d'écraser le contenu existant avec un seul standard de Java IO appel d'API.
Si les fichiers ne sont pas trop gros, il suffit de lire l'intégralité du fichier dans une liste de tableaux (un par ligne) et des entrées de réécriture ou d'insérer de nouvelles entrées pour les nouvelles lignes.
Puis écraser le fichier existant avec de nouveaux contenus, ou déplacer les fichiers d'une sauvegarde et d'écrire un nouveau fichier.
Selon le degré de sophistication des modifications doivent être, de votre structure de données peut être nécessaire de changer.
Une autre méthode serait de lire des caractères à partir du fichier existant lors de l'écriture dans le fichier modifié et modifier le flux de lecture.
Si Java a une façon de carte mémoire les fichiers, puis ce que vous pouvez faire est d'étendre le fichier à sa nouvelle longueur, carte le fichier, memmove tous les octets jusqu'à la fin pour faire un trou et écrire les nouvelles données dans le trou.
Cela fonctionne dans C. Jamais essayé dans Java.
Une autre façon je viens de penser à faire la même chose mais avec un accès au fichier.
Utiliser une plus grande taille de la mémoire tampon pour accélérer les performances.
Vous pouvez utiliser le code suivant:
Je ne sais pas si il y a un moyen pratique de faire droit autrement que
Sur la cible : Vous pouvez construire le nouveau contenu du fichier dans la mémoire et ensuite remplacer l'ancien contenu du fichier si les fichiers gérés ne sont pas si grand. Ou vous pouvez écrire le résultat dans un fichier temporaire.
La chose serait probablement plus facile à faire avec des ruisseaux, des RandomAccessFile ne semble pas être destiné à une insertion dans le milieu (autant que je sache). De vérifier la tutoriel si vous avez besoin d'.
Je crois que la seule façon d'insérer du texte dans un fichier texte existant est de lire le fichier d'origine et écrire le contenu dans un fichier temporaire avec le nouveau texte inséré. Puis effacer le fichier d'origine et de renommer le fichier temporaire avec le nom d'origine.
Ce exemple est porté sur d'insérer une seule ligne dans un fichier existant, mais encore peut-être de l'utiliser pour vous.
Si c'est un fichier texte,,,,Lire le fichier existant dans StringBuffer et ajouter le nouveau contenu dans le même StringBuffer maintenant u peut écrire la SrtingBuffer sur fichier. alors maintenant, le fichier contient à la fois l'existant et le nouveau texte.