Ler e escrever no mesmo arquivo [RESOLVIDO]

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 :slight_smile:

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