Ler e escrever no mesmo arquivo [RESOLVIDO]

10 respostas
J

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:

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

10 Respostas

E

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.

F

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:

J

entanglement

Vou dar uma pesquisada, qualquer coisa posto aqui. Se alguem tiver algum exemplo de como usar, agradeço.

Valeu.

E

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:

De fato o que você falou é o que eu faria :slight_smile:

J

Alguem tem algum exemplo de como fazer essa jogada do arquivo temporario?

D

le o arquivo e grava em uma String,

ai depois da um append ou um TextoDoArquivo+TextoDaTela e manda gravar no arquivo

J

Galera, resolvi meu problema usando o arquivo temporario.
Segue o código

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

Valeu ae pelas ideias, abraço!

D

caso queira usar strings e processar mais rapido segue:

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();
         
}
/* conteudo do Arquivo.txt

----
algo aqui
=
algo aqui
----

*/
F
douglaskd:
caso queira usar strings e processar mais rapido segue:
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();
         
}
/* conteudo do Arquivo.txt

----
algo aqui
=
algo aqui
----

*/

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.

D

felipeaps tem razão, não imaginava que a diferença era tão gritante..

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

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

Criado 16 de agosto de 2012
Ultima resposta 17 de ago. de 2012
Respostas 10
Participantes 4