como deletar o conteúdo do arquivo de texto sem deletar a si mesmo

89

Desejo copiar o conteúdo do arquivo 'A' para o arquivo 'B'. depois que a cópia terminar, desejo limpar o conteúdo do arquivo 'A' e quero escrever nele desde o início. Não consigo excluir o arquivo 'A' porque está relacionado a outra tarefa.

Consegui copiar o conteúdo usando a API de arquivo do java (readLine ()), mas não sei como limpar o conteúdo do arquivo e definir o ponteiro do arquivo para o início do arquivo.

brigue
fonte

Respostas:

134

Basta imprimir uma string vazia no arquivo:

PrintWriter writer = new PrintWriter(file);
writer.print("");
writer.close();
Vlad
fonte
14
A gravação não é necessária, e se outra tarefa tiver o arquivo aberto, a abertura pode nem mesmo ser possível.
Marquês de Lorne
writer.close ??, estamos em 2017 !!!. Além disso, não há necessidade de imprimir (""), porque o texto será sobrescrito
FSm
1
@Andro, reparou no carimbo de data / hora e nas tags? Naquela época, lembro que era a maneira mais confiável de esvaziar um arquivo em dispositivos Android.
Vlad
@Vlad Se não houver necessidade de fechar o escritor agora, talvez seja uma boa ideia atualizar a resposta?
Linha
70

Não acredito que você precise escrever uma string vazia no arquivo.

PrintWriter pw = new PrintWriter("filepath.txt");
pw.close();
camleng
fonte
9
Você está correto sobre isso. Todas as respostas que mostram uma escrita estão erradas ou, na melhor das hipóteses, redundantes.
Marquês de Lorne
33
Que tal new PrintWriter("filepath.txt").close();?
Supuhstar
1
citação de documentos java "Se o arquivo existir, ele será truncado para o tamanho zero"
Pinkerton
1
mas o que fazer se o arquivo estiver no modo anexar.
GURMEET SINGH
Oh cara, eu não posso acreditar que perdi a resposta simples. Abra o arquivo no modo truncado. Eu odeio o modo truncado tanto que me escapou.
30

Você deseja o método setLength () na classe RandomAccessFile.

Urso Burleigh
fonte
5
Na verdade, esta é a única resposta correta, pois não exclui o arquivo. Todas as outras respostas sim.
Marquês de Lorne
Eu preciso disso porque gostaria de limpar o arquivo de log criado pela biblioteca logback-android . Se eu excluir o arquivo de log manualmente, a biblioteca não é inteligente o suficiente para criá-lo novamente se houver log para gravar até que eu reinicie meu aplicativo. Portanto, usei este método e trabalho. Não estudei muito. Não é a melhor abordagem? Conselho por favor.
Yeung
curiosamente, eu tenho um problema de produção porque o cartão Intenso classe 10 congela (e força a redefinição da bateria) quando eu chamo fileOnSdCard.setLength (0) para um aplicativo instalado de um arquivo .apk. Seu cartão de classe 4 nunca mostrou o problema.
Poutrathor
10

Um liner para fazer a operação de truncamento:

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

Mais informações disponíveis em Java Documentation: https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html

Michał
fonte
+1 Por não instanciar uma classe inteira de escrita de arquivo (e pior ainda, escrever nela). Esta realmente deveria ser a resposta aceita.
Kröw
6

Que tal abaixo:

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

Depois de copiar de A para B, abra o arquivo A novamente para o modo de escrita e depois escreva uma string vazia nele

Rasel
fonte
5

Um dos melhores companheiros para java são os projetos Apache e por favor consulte-os. Para operações relacionadas a arquivos, você pode consultar o projeto Commons IO .

O código abaixo de uma linha nos ajudará a esvaziar o arquivo.

FileUtils.write(new File("/your/file/path"), "")
Anver Sadhat
fonte
4

Apenas escreva:

FileOutputStream writer = new FileOutputStream("file.txt");
Manh Vu
fonte
2

Grave uma string vazia no arquivo, esvazie e feche. Certifique-se de que o gravador de arquivo não esteja no modo anexar. Eu acho que isso deve funcionar.

hakon
fonte
2

Se você não precisar usar o gravador depois, a maneira mais curta e limpa de fazer isso é:

new FileWriter("/path/to/your/file.txt").close();
Markus L.
fonte
1

usando: Nova biblioteca Java 7 NIO, tente

        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();

O código acima verifica se existe Directoty se não cria o diretório, verifica se o arquivo existe é sim ele grava uma string vazia e limpa o buffer, no final você obtém o gravador apontando para o arquivo vazio

Harsha
fonte
0

Você pode usar

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

Lembre-se de não usar

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

True no construtor de filewriter permitirá anexar.

Revanth Kumar
fonte
0
FileOutputStream fos = openFileOutput("/*file name like --> one.txt*/", MODE_PRIVATE);
FileWriter fw = new FileWriter(fos.getFD());
fw.write("");
Harpreet Singh
fonte
Bem-vindo ao SO! Use as ferramentas de formatação integradas para tornar seu código mais fácil de ler.
Michael L.
0

Com o gravador try-with-resources será fechado 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
Bartek
fonte
0

Tudo o que você precisa fazer é abrir o arquivo no modo truncado. Qualquer classe de saída de arquivo Java fará isso automaticamente para você.


fonte
-2

você pode escrever um método genérico como (é tarde demais, mas o código abaixo ajudará você / outros)

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;
}
Vishal
fonte
5
Isso não cria um arquivo vazio, mas sim um arquivo com um byte nulo.
Marquês de Lorne