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:
publicvoidescreverArquivo()throwsIOException{Strings1;Stringpath="C:/squid.conf.txt";BufferedReaderin1=newBufferedReader(newFileReader(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();}
é 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?
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
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:
J
jaymemattos
entanglement
Vou dar uma pesquisada, qualquer coisa posto aqui. Se alguem tiver algum exemplo de como usar, agradeço.
Valeu.
E
entanglement
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
J
jaymemattos
Alguem tem algum exemplo de como fazer essa jogada do arquivo temporario?
D
douglaskd
le o arquivo e grava em uma String,
ai depois da um append ou um TextoDoArquivo+TextoDaTela e manda gravar no arquivo
J
jaymemattos
Galera, resolvi meu problema usando o arquivo temporario.
Segue o código
publicvoidescreverArquivo()throwsIOException{Strings1;Stringout1;Stringpath="C:/squid.conf - Cópia.txt";//Praparo o arquivo original para leitura BufferedReaderin1=newBufferedReader(newFileReader(path));//Crio o arquivo temporario temp.txtFiletemp=File.createTempFile("temp",".txt",newFile(System.getProperty("user.dir")));//Digo que vou escrever no temporarioBufferedWriterout=newBufferedWriter(newFileWriter(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 temporarioBufferedReadertemporario=newBufferedReader(newFileReader(temp));//Preparo para escrever no originalFileWriterf=newFileWriter(newFile(path));//Aqui nada mais que copio todo o conteudo do temporario pro originalwhile((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
douglaskd
caso queira usar strings e processar mais rapido segue:
publicvoidescreverArquivo()throwsIOException{Strings1;Stringtmp="";Stringpath="C:/Arquivo.txt";BufferedReaderin1=newBufferedReader(newFileReader(path));while((s1=in1.readLine())!=null){tmp+=s1+"\r\n";if(s1.equals("=")){tmp+="tem um sinal de = logo acima \r\n";}}in1.close();BufferedWriterout1=newBufferedWriter(newFileWriter(newFile(path)));out1.write(tmp);out1.close();}
caso queira usar strings e processar mais rapido segue:
publicvoidescreverArquivo()throwsIOException{Strings1;Stringtmp="";Stringpath="C:/Arquivo.txt";BufferedReaderin1=newBufferedReader(newFileReader(path));while((s1=in1.readLine())!=null){tmp+=s1+"\r\n";if(s1.equals("=")){tmp+="tem um sinal de = logo acima \r\n";}}in1.close();BufferedWriterout1=newBufferedWriter(newFileWriter(newFile(path)));out1.write(tmp);out1.close();}
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
douglaskd
felipeaps tem razão, não imaginava que a diferença era tão gritante..
publicvoidescreverArquivo()throwsIOException{Strings1;StringBuildersb=newStringBuilder();Stringpath="C:/Arquivo.txt";BufferedReaderin1=newBufferedReader(newFileReader(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();BufferedWriterout1=newBufferedWriter(newFileWriter(newFile(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