Pessoal, estou tendo dificuldade em apagar um conjunto de linhas de um arquivo txt. Exemplo:
tenho um arquivo com listas de nomes : claudio
alexandre
matheus
roberto
milena
claudio
marcela
matheus
e quero q tudo q esteja entre “claudio” e “matheus” seja apagado restado apenas : alexandre, roberto, milena e marcela.
Se alguém puder me ajudar, ficarei grata
Qual sua dificuldade exatamente?
Para arquivos pequenos, ao invés de modificar, o mais simples seria gerar um novo arquivo com as mudanças que você quer. O processo seria:
- Carregue o arquivo inteiro em memória (Files.readAllLines, Files.Files.lines)
- Remova as linhas que nao quer, do objeto em memória em java
- Escreva um novo arquivo com o conteúdo desejado (Files.write, Files.createFile)
AbelBueno Mas até aonde eu sei não tem como alterar um documento (ao menos em .txt) senão lendo ele, e reescrevendo o novamente.
Acho que você está praticamente certo.
Eu sei que você pode adicionar conteúdo no meio de um arquivo com a classe RandomAccessFile, por exemplo, e apagar conteúdo a partir do fim do arquivo, definindo um novo tamanho pro arquivo menor que o original.
Nao conheço uma maneira de simplesmente apagar conteúdo do meio do arquivo diretamente.
Mas na prática, é realmente muito mais fácil simplesmente reescrever o arquivo.
Se sua regra é “quero q tudo q esteja entre “claudio” e “matheus” seja apagado”… os nomes que restariam seriam: claudio, matheus, roberto, milena, claudio, matheus. Pois existem somnete duas ocorrências que estão entre claudio e matheus que são: alexandre e marcela.
Como você disse “restado apenas : alexandre, roberto, milena e marcela.”, acredito que sua regra de negócio seja: apagar todas as ocorrências de claudio e matheus.
Considerando que a regra seja a que citei acima. testei o código abaixo resolve seu problema.
Uma sugestão de melhoria seria enviar os nome que vc quer apagar como argumentos para o método tornando a escolha dos nomes a serem apagado dinâmica.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileWriter;
public class BufferedReaderExample {
public static void main(String[] args) {
BufferedReader br = null;
PrintWriter pw = null;
File novoArquivo = null;
File arquivoOriginal = null;
try {
novoArquivo = new File("D:\\Fábio\\Testes\\Guj\\arquivoAlterado.txt");
pw = new PrintWriter(new FileWriter(novoArquivo));
String linhaAtual;
arquivoOriginal = new File("D:\\Fábio\\Testes\\Guj\\arquivoASerLido.txt");
br = new BufferedReader(new FileReader(arquivoOriginal));
while ((linhaAtual = br.readLine()) != null) {
if(!linhaAtual.equals("claudio") && !linhaAtual.equals("matheus")){
System.out.println(linhaAtual);
pw.println(linhaAtual);
pw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null){
br.close();
pw.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
if (!arquivoOriginal.delete()) {
System.out.println("O arquivo não pode ser deletado");
return;
}
if (!novoArquivo.renameTo(arquivoOriginal)){
System.out.println("O arquivo não pode ser renomeado");
}
}
}
Tente usar somente parte desse código em sua solução parcialmente implementada (caso exista) para evitar programar totalmente orientado a ctrl+c ctrl+v.