Je veux supprimer un contenu de fichier en utilisant le programme Java comme ci-dessous. Est-ce la méthode d'écriture à remplacer dans le même fichier ou doit-elle être copiée dans un autre fichier?
Mais sa suppression de tout le contenu du fichier.
class FileReplace
{
ArrayList<String> lines = new ArrayList<String>();
String line = null;
public void doIt()
{
try
{
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while (line = br.readLine() != null)
{
if (line.contains("Java"))
line = line.replace("Java", " ");
lines.add(line);
}
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
out.write(lines.toString());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public statc void main(String args[])
{
FileReplace fr = new FileReplace();
fr.doIt();
}
}
Je commencerais par fermer le lecteur et l'écrivain:
public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;
public void doIt() {
try {
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (line.contains("Java"))
line = line.replace("Java", " ");
lines.add(line);
}
fr.close();
br.close();
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
for(String s : lines)
out.write(s);
out.flush();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String args[]) {
FileReplace fr = new FileReplace();
fr.doIt();
}
}
La réponse acceptée est géniale. Cependant, il existe un moyen plus simple de remplacer le contenu d'un fichier à l'aide de la bibliothèque commons-io
d'Apache (commons-io-2.4.jar
- vous pouvez utiliser n'importe quelle version récente).
private void update() throws IOException{
File file = new File("myPath/myFile.txt");
String fileContext = FileUtils.readFileToString(file);
fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED");
FileUtils.write(file, fileContext);
}
Remarque: Thrown IOException
doit être capturé et traité par l'application en conséquence.
Lire + écrire simultanément sur le même fichier n’est pas correct.
EDIT: reformuler et être plus correct et plus spécifique - lire et écrire dans le même fichier, dans le même fil, sans fermer correctement le lecteur (et laisser filer le scripteur) n’est pas acceptable.
Assurez-vous de:
close
n'importe quel flux lorsque vous n'en avez plus besointruncate
le fichier, pour vous assurer qu'il est réduit si vous écrivez moins que ce qu'il était.toString
.flush
et close
lorsque vous avez fini d'écrire!Si vous utilisez buffered IO, vous devez toujours vous assurer que le tampon est vidé à la fin, sinon vous risquez de perdre des données!
Je peux voir trois problèmes.
D'abord, vous écrivez dans out
qui, je suppose, est System.out et non un flux de sortie dans le fichier.
Deuxièmement, si vous écrivez dans un flux de sortie dans le fichier, vous devez le fermer.
Troisièmement, la méthode toString()
sur une ArrayList
ne va pas écrire le fichier comme prévu. Faites une boucle sur la liste et écrivez chaque String
une à la fois. Demandez-vous également si vous devez écrire des caractères de nouvelle ligne.
La réponse acceptée est légèrement fausse. Voici le bon code.
public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;
public void doIt() {
try {
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (line.contains("Java"))
line = line.replace("Java", " ");
lines.add(line);
}
fr.close();
br.close();
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
for(String s : lines)
out.write(s);
out.flush();
}
out.close();
catch (Exception ex) {
ex.printStackTrace();
}
}