come eliminare il contenuto del file di testo senza eliminarlo


89

Voglio copiare il contenuto del file "A" nel file "B". una volta terminata la copia, desidero cancellare il contenuto del file "A" e scriverlo dall'inizio. Non riesco a eliminare il file "A" poiché è correlato a qualche altra attività.

Sono stato in grado di copiare il contenuto utilizzando l'API file di java (readLine ()), ma non so come cancellare il contenuto del file e impostare il puntatore del file all'inizio del file.

Risposte:


134

Basta stampare una stringa vuota nel file:

PrintWriter writer = new PrintWriter(file);
writer.print("");
writer.close();

14
La scrittura non è necessaria e se un'altra attività ha il file aperto, l'apertura potrebbe non essere nemmeno possibile.
Marchese di Lorne

writer.close ??, siamo nel 2017 !!!. Inoltre, non è necessario stampare (""), perché il testo verrà sovrascritto
FSm

1
@Andro, noti il ​​timestamp e i tag? Allora ricordo che era il modo più affidabile per svuotare un file su dispositivi Android.
Vlad

@Vlad Se non è necessario chiudere lo scrittore ora, forse è una buona idea aggiornare la risposta?
Linea

70

Non credo che tu debba nemmeno scrivere una stringa vuota nel file.

PrintWriter pw = new PrintWriter("filepath.txt");
pw.close();

9
Hai ragione su questo. Tutte le risposte che mostrano una scrittura sono sbagliate o nel migliore dei casi ridondanti.
Marchese di Lorne

33
Che ne dici di solo new PrintWriter("filepath.txt").close();?
Supuhstar

1
citazione da java docs "Se il file esiste, verrà troncato a zero dimensioni"
Pinkerton

1
ma cosa fare se il file è in modalità di aggiunta.
GURMEET SINGH

Oh uomo, non posso credere di aver perso la semplice risposta. Apri il file in modalità troncato. Odio così tanto la modalità troncato che mi è sfuggito.

30

Vuoi il metodo setLength () nella classe RandomAccessFile.


5
Questa è infatti l'unica risposta corretta, in quanto non cancella il file. Tutte le altre risposte lo fanno.
Marchese di Lorne

Ne ho bisogno perché vorrei cancellare il file di registro creato dalla libreria logback-android . Se elimino manualmente il file di registro, la libreria non è abbastanza intelligente da crearla di nuovo se c'è un registro da scrivere fino a quando non riavvio la mia app. Pertanto, ho usato questo metodo e lavoro. Non ho studiato molto. Non è l'approccio migliore? Per favore consiglio.
Yeung

Stranamente, ho un problema di produzione perché la classe 10 della scheda Intenso si blocca (e forza il ripristino della batteria) quando chiamo fileOnSdCard.setLength (0) per un'app installata da un file .apk. La loro carta di classe 4 non ha mai mostrato il problema.
Poutrathor


10

Un liner per eseguire l'operazione di troncamento:

FileChannel.open(Paths.get("/home/user/file/to/truncate"), StandardOpenOption.WRITE).truncate(0).close();

Ulteriori informazioni sono disponibili nella documentazione Java: https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html


+1 Per non aver istanziato un'intera classe di scrittura di file (e anche peggio per scriverci sopra). Questa dovrebbe essere davvero la risposta accettata.
Kröw

6

Che ne dici di seguito:

File temp = new File("<your file name>");
if (temp.exists()) {
    RandomAccessFile raf = new RandomAccessFile(temp, "rw");
    raf.setLength(0);
}

5

Dopo aver copiato da A a B, aprire di nuovo il file A in modalità di scrittura e quindi scrivere una stringa vuota al suo interno


5

Uno dei migliori compagni per java è Apache Projects e per favore fai riferimento ad esso. Per le operazioni relative ai file puoi fare riferimento al progetto Commons IO .

Il codice sotto una riga ci aiuterà a rendere il file vuoto.

FileUtils.write(new File("/your/file/path"), "")

4

Scrivi e basta:

FileOutputStream writer = new FileOutputStream("file.txt");

2

Scrivi una stringa vuota nel file, scarica e chiudi. Assicurati che il file writer non sia in modalità di aggiunta. Penso che dovrebbe fare il trucco.


2

Se non è necessario utilizzare lo scrittore in seguito, il modo più breve e pulito per farlo sarebbe questo:

new FileWriter("/path/to/your/file.txt").close();

1

using: New Java 7 NIO library, try

        if(!Files.exists(filePath.getParent())) {
            Files.createDirectory(filePath.getParent());
        }
        if(!Files.exists(filePath)) {
            Files.createFile(filePath);
        }
        // Empty the file content
        writer = Files.newBufferedWriter(filePath);
        writer.write("");
        writer.flush();

Il codice sopra controlla se Directoty esiste se no crea la directory, controlla se il file esiste è si scrive una stringa vuota e svuota il buffer, alla fine ottieni il writer che punta al file vuoto


0

Puoi usare

FileWriter fw = new FileWriter(/*your file path*/);
PrintWriter pw = new PrintWriter(fw);
pw.write("");
pw.flush(); 
pw.close();

Ricorda di non usare

FileWriter fw = new FileWriter(/*your file path*/,true);

True nel costruttore di filewriter abiliterà append.


0
FileOutputStream fos = openFileOutput("/*file name like --> one.txt*/", MODE_PRIVATE);
FileWriter fw = new FileWriter(fos.getFD());
fw.write("");

Benvenuto in SO! Utilizza gli strumenti di formattazione incorporati per rendere il tuo codice più facile da leggere.
Michael L.

0

Con try-with-resources il writer verrà chiuso automaticamente:

import org.apache.commons.lang3.StringUtils;
final File file = new File("SomeFile");
try (PrintWriter writer = new PrintWriter(file))  {
    writer.print(StringUtils.EMPTY);                
}
// here we can be sure that writer will be closed automatically

0

Tutto quello che devi fare è aprire il file in modalità troncato. Qualsiasi classe di file Java out lo farà automaticamente per te.


-2

puoi scrivere un metodo generico come (è troppo tardi ma il codice sottostante aiuterà te / gli altri)

public static FileInputStream getFile(File fileImport) throws IOException {
      FileInputStream fileStream = null;
    try {
        PrintWriter writer = new PrintWriter(fileImport);
        writer.print(StringUtils.EMPTY);
        fileStream = new FileInputStream(fileImport);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            writer.close();
        }
         return fileStream;
}

5
Questo non crea un file vuoto, crea un file con un byte nullo al suo interno.
Marchese di Lorne
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.