Esta é a melhor maneira de rewrite o conteúdo de um arquivo em Java?

Eu quero rewrite o conteúdo de um arquivo.

O que eu tenho pensado até agora é isto:

  1. Salve o nome do arquivo
  2. Exclua o arquivo existente
  3. Crie um novo arquivo vazio com o mesmo nome
  4. Escreva o conteúdo desejado para o arquivo vazio

É este o melhor caminho? Ou existe uma maneira mais direta, isto é, não ter que excluir e criar arquivos, mas simplesmente alterar o conteúdo?

Para sobrescrever o arquivo foo.log com FileOutputStream:

File myFoo = new File("foo.log"); FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append // false to overwrite. byte[] myBytes = "New Contents\n".getBytes(); fooStream.write(myBytes); fooStream.close(); 

ou com FileWriter:

 File myFoo = new File("foo.log"); FileWriter fooWriter = new FileWriter(myFoo, false); // true to append // false to overwrite. fooWriter.write("New Contents\n"); fooWriter.close(); 

Eu recomendo usar o FileUtil do Apache Common para isso. Eu encontrei este pacote inestimável. É fácil de usar e igualmente importante é fácil de ler / entender quando você voltar um pouco mais tarde.

 //Create some files here File sourceFile = new File("pathToYourFile"); File fileToCopy = new File("copyPath"); //Sample content org.apache.commons.io.FileUtils.writeStringToFile(sourceFile, "Sample content"); //Now copy from source to copy, the delete source. org.apache.commons.io.FileUtils.copyFile(sourceFile, fileToCopy); org.apache.commons.io.FileUtils.deleteQuietly(sourceFile); 

Mais informações podem ser encontradas em: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

Veja: java.io.RandomAccessFile

Você vai querer abrir um arquivo de leitura e escrita, assim:

 RandomAccessFile raf = new RandomAccessFile("filename.txt", "rw"); String tmp; while (tmp = raf.readLine() != null) { // Store String data } // do some string conversion raf.seek(0); raf.writeChars("newString"); 

A menos que você esteja apenas adicionando conteúdo no final, é razoável fazê-lo dessa maneira. Se você estiver anexando, tente FileWriter com o construtor append.

Uma ordem ligeiramente melhor seria:

  1. Gerar novo nome de arquivo (por exemplo, foo.txt.new)
  2. Escreva conteúdo atualizado para novo arquivo.
  3. Renomeie atomic de foo.txt.new para foo.txt

Infelizmente, renameTo não é garantido para fazer renomeação atômica.

No exemplo abaixo, o “falso” faz com que o arquivo seja sobrescrito, true causaria o oposto.

 File file=new File("C:\Path\to\file.txt"); DataOutputStream outstream= new DataOutputStream(new FileOutputStream(file,false)); String body = "new content"; outstream.write(body.getBytes()); outstream.close(); 

Há momentos em que se pode querer manter um enorme arquivo vazio, a fim de evitar o custo extra do sistema de alocação de espaço com base na necessidade. Isso geralmente é feito por bancos de dados, máquinas virtuais e também em programas em lote que processam e gravam dados em massa. Isso melhoraria significativamente o desempenho do aplicativo. Nestes casos, escrever um novo arquivo e renomeá-lo não ajudaria muito. Em vez disso, o arquivo vazio terá que ser preenchido. Isso é quando um deve ir para o modo de substituição.

Guava File.write “Sobrescreve um arquivo com o conteúdo de uma matriz de bytes”:

 Files.write(bytes, new File(path));