Olá pessoal, estou com uma dificuldade em trabalhar com arquivo. Eu tenho um arquivo.txt com um conteudo escrito nele, e fiz um script que varre o arquivo e encontre a parte do texto que eu quero, até ai beleza, só que eu nao consigo escrever no arquivo. Aqui embaixo ta o codigo em que eu leio o arquivo:
[code]public void escreverArquivo()throws IOException {
String s1;
String path = "C:/squid.conf.txt";
BufferedReader in1 = new BufferedReader(new FileReader(path));
while((s1=in1.readLine())!=null){
//Encontra a linha de texto do aquivo desejado
if(s1.equals("# Aqui definiremos nossas Regras .") ) {
System.out.println("Entrou");
}
}
in1.close();
}[/code]
Ali onde tem if(s1.equals("# Aqui definiremos nossas Regras .") )
é quando que acho o linha do arquivo e quero inserir um certo conteudo abaixo dela.
Só que ja procurei e todos os exemplos que vi achei apenas trabalhando com 2 arquivos. Já usei FileWriter mas ele apaga o restante do conteudo do arquivo e isso nao me interessa.
O codigo ali é o da leitura, como faço para escrever nele mesmo? Alguem pode dar uma luz?
Abraços
Se você quer ler e escrever em um mesmo arquivo ao mesmo tempo, tem de usar um RandomAccessFile e terá também de ter uma forma de controlar onde é que você vai inserir ou sobrepôr novos dados. Em bancos de dados, isso é feito através de estruturas de dados especiais (B-Trees).
É que você não pode “inserir linhas dentro de um arquivo” - os editores de texto fingem que inserem linhas dentro de um arquivo, mas na verdade lêem o arquivo inteiro , trabalham com ele na memória, e então o gravam de volta.
Você pode criar um arquivo temporário.
Vai lendo seu arquivo e enquanto não encontra sua tag, vai copiando tudo no arquivo temporário.
Quando encontrar a tag, escreve o que vc quer acrescentar no arquivo temporário, e depois volta a ler o arquivo original e copiar todo o resto para o arquivo temporário.
Move o arquivo temporário para o original.
Não sei se é a única maneira, mas é uma opção. :lol:
entanglement
Vou dar uma pesquisada, qualquer coisa posto aqui. Se alguem tiver algum exemplo de como usar, agradeço.
Valeu.
[quote=felipeaps]Você pode criar um arquivo temporário.
Vai lendo seu arquivo e enquanto não encontra sua tag, vai copiando tudo no arquivo temporário.
Quando encontrar a tag, escreve o que vc quer acrescentar no arquivo temporário, e depois volta a ler o arquivo original e copiar todo o resto para o arquivo temporário.
Move o arquivo temporário para o original.
Não sei se é a única maneira, mas é uma opção. :lol: [/quote]
De fato o que você falou é o que eu faria
Alguem tem algum exemplo de como fazer essa jogada do arquivo temporario?
le o arquivo e grava em uma String,
ai depois da um append ou um TextoDoArquivo+TextoDaTela e manda gravar no arquivo
Galera, resolvi meu problema usando o arquivo temporario.
Segue o código
[code]public void escreverArquivo()throws IOException {
String s1;
String out1;
String path = "C:/squid.conf - Cópia.txt";
//Praparo o arquivo original para leitura
BufferedReader in1 = new BufferedReader(new FileReader(path));
//Crio o arquivo temporario temp.txt
File temp = File.createTempFile(“temp”, “.txt”, new File(System.getProperty(“user.dir”)));
//Digo que vou escrever no temporario
BufferedWriter out = new BufferedWriter(new FileWriter(temp));
//Varro o arquivo original linha por linha e vou copiando pro temporario
while((s1=in1.readLine())!=null){
out.write(s1 + "\r\n");
//Condição onde encontro a linha que eu quero fazer as alterações
if(s1.equals("# Aqui definiremos nossas Regras .") ) {
out.write(“Entrou” + “\r\n”);
}
}
out.close();
//Leio o arquivo temporario
BufferedReader temporario = new BufferedReader(new FileReader(temp));
//Preparo para escrever no original
FileWriter f = new FileWriter(new File(path));
//Aqui nada mais que copio todo o conteudo do temporario pro original
while((out1=temporario.readLine())!=null) {
f.write(out1 + “\r\n”);
}
//Excluo o temporario e fecho os demais.
temp.deleteOnExit();
f.close();
in1.close();
}[/code]
Valeu ae pelas ideias, abraço!
caso queira usar strings e processar mais rapido segue:
[code]public void escreverArquivo() throws IOException{
String s1;
String tmp = "";
String path = "C:/Arquivo.txt";
BufferedReader in1 = new BufferedReader(new FileReader(path));
while((s1=in1.readLine())!=null){
tmp += s1 + "\r\n";
if(s1.equals("=") ) {
tmp += "tem um sinal de = logo acima \r\n";
}
}
in1.close();
BufferedWriter out1 = new BufferedWriter(new FileWriter(new File(path)));
out1.write(tmp);
out1.close();
}[/code]
[code]/* conteudo do Arquivo.txt
algo aqui
algo aqui
*/[/code]
[quote=douglaskd]caso queira usar strings e processar mais rapido segue:
[code]public void escreverArquivo() throws IOException{
String s1;
String tmp = "";
String path = "C:/Arquivo.txt";
BufferedReader in1 = new BufferedReader(new FileReader(path));
while((s1=in1.readLine())!=null){
tmp += s1 + "\r\n";
if(s1.equals("=") ) {
tmp += "tem um sinal de = logo acima \r\n";
}
}
in1.close();
BufferedWriter out1 = new BufferedWriter(new FileWriter(new File(path)));
out1.write(tmp);
out1.close();
}[/code]
[code]/* conteudo do Arquivo.txt
algo aqui
algo aqui
*/[/code]
[/quote]
Será que ficar “concatenando” Strings com o operador “+” é realmente mais rápido?
Lembre-se que Strings são imutáveis, e portanto, para concatenar Strings, cria-se outra String.
Se houver muitas Strings, que é no caso da leitura de um arquivo, serão criados vários objetos para realizar essas “concatenações”, o que pode gerar problemas de memória.
Se quiser concatenar mesmo, o ideal seria usar a classe StringBuilder.
felipeaps tem razão, não imaginava que a diferença era tão gritante…
[code]public void escreverArquivo() throws IOException {
String s1;
StringBuilder sb = new StringBuilder();
String path = "C:/Arquivo.txt";
BufferedReader in1 = new BufferedReader(new FileReader(path));
while((s1=in1.readLine())!=null){
sb.append(s1 + "\r\n");
if(s1.equals("=") ) {
sb.append("tem um sinal de = logo acima \r\n");
}
}
in1.close();
BufferedWriter out1 = new BufferedWriter(new FileWriter(new File(path)));
out1.write(sb.toString());
out1.close();
} [/code]
fiz o teste usando currentTimeMillis, coloquei bem mais texto no arquivo e o resultado usando StringBuilder chega a ser 8x mais rapido, na situação acima