Arquivo - Escrever em outra linha?

13 respostas
D

Estou escrevendo em um arquivo .txt, então eu quero escrever em uma outra linha, como que eu faço esse deslocamento?

13 Respostas

gabrielmassote

esta escrevendo com que?

PrintWriter ?

se for tem um método chamado println()

ex:

PrintWriter p = new PrintWriter("files.txt");
 p.println("Opa linha 1");
 p.println("Opa linha 2");

acho que é isso…
abraços

D
public void imprime() //Imprimir todo o codigo.
    {
        try
        {
            int i = 0;
            RandomAccessFile file = new RandomAccessFile(new File("Teste.txt"),"rw"); 
        
             while(linha[i] != null)
             {
                 file.writeBytes(linha[i]);
                 System.out.println(linha[i]);
                 i++;
             }
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

Eu fiz desse jeito.
Esse linha[i] é cada linha que ele leu de um outro arquivo, esse imprime aí é só um teste.
Se tiver alguma advertência para fazer ou mudar alguma coisa, fique a vontade. :D
Obrigado!

rogeriop80

Da uma lida aqui:

http://www.guj.com.br/java.tutorial.artigo.13.1.guj

gabrielmassote

o tutorial do rogerio explica bem…

troque a forma que esta utilizando para PrintWriter…

abraco

D

Vou mudar aqui sim.
Obrigado pela ajuda!

D

O que eu posso estar fazendo errado aqui:

public void leArquivo()
    {
        try
        {
             int i = 0;
             FileReader reader = new FileReader("maximo.lmt"); //Lendo o arquivo para escrever em outro criado
             FileWriter fw = new FileWriter("Teste.txt");  //Criando um arquivo novo
             BufferedReader buffer = new BufferedReader(reader); //Criando um BufferReader para ler de linha em linha
             PrintWriter file = new PrintWriter(fw);  //Escrever no arquivo criado.
             
             
             while(buffer.readLine() != null)
             {      
                 file.println(buffer.readLine());
                 System.out.println(buffer.readLine());
                 linha[i] = buffer.readLine();
                 i++;
             }
             cont = i;
             
        }
        catch(Exception e)
        {
            Erro error = new Erro();
            
            error.erro(6);
        }
    }

O arquivo lido não está sendo lido corretamente e não está escrevendo no arquivo novo, ele está criando mas não está escrevendo.

T

Cuidado - readLine sempre lê uma linha e posiciona na linha seguinte, então o mais indicado é sempre armazenar seu valor em uma variável temporária. No código que você postou, a cada iteração do loop, você está tentando ler 4 linhas de cada vez (já que há 4 readLines). Se você fizer isso, então seu arquivo de entrada deverá ter um número de linhas múltiplo de 4, senão ocorrerá uma EOFException em alguma das linhas.

O que você escreveu:

while(buffer.readLine() != null)  
{        
    file.println(buffer.readLine());  
    System.out.println(buffer.readLine());  
    linha[i] = buffer.readLine();  
    i++;  
}

O que você deveria ter feito:

String linhaCorrente;
for (linhaCorrente = buffer.readLine(); linhaCorrente != null; linhaCorrente = buffer.readLine())
{        
    file.println(linhaCorrente);  
}
D

thingol:
Cuidado - readLine sempre lê uma linha e posiciona na linha seguinte, então o mais indicado é sempre armazenar seu valor em uma variável temporária. No código que você postou, a cada iteração do loop, você está tentando ler 4 linhas de cada vez (já que há 4 readLines). Se você fizer isso, então seu arquivo de entrada deverá ter um número de linhas múltiplo de 4, senão ocorrerá uma EOFException em alguma das linhas.

O que você escreveu:

while(buffer.readLine() != null)  
{        
    file.println(buffer.readLine());  
    System.out.println(buffer.readLine());  
    linha[i] = buffer.readLine();  
    i++;  
}

O que você deveria ter feito:

String linhaCorrente;
for (linhaCorrente = buffer.readLine(); linhaCorrente != null; linhaCorrente = buffer.readLine())
{        
    file.println(linhaCorrente);  
}

Eu tava vendo que tava lendo errado, agora ele leu certinho, eu não tava imaginando isso que o readLine() tava posicionando 4 linhas a frente.
Agora tem outro problema bobo que eu não to conseguindo ver, ele não está escrevendo no arquivo “Teste.txt”, o que será que tá errado?

T

a) Tudo que você abre tem de fechar. Você fechou o arquivo?
b) Dê uma busca, provavelmente o arquivo foi criado em um outro diretório que você não está esperando (já que você não está especificando o diretório na instrução que abre o arquivo).

FileWriter fw = new FileWriter("Teste.txt");
D
thingol:
a) Tudo que você abre tem de fechar. Você fechou o arquivo? b) Dê uma busca, provavelmente o arquivo foi criado em um outro diretório que você não está esperando (já que você não está especificando o diretório na instrução que abre o arquivo).
FileWriter fw = new FileWriter("Teste.txt");

Meu professor disse que não precisamos fechar o arquivo, a JVM fecha automaticamente pra nós, agora fiquei na dúvida.
Sobre a criação do arquivo, ele tá criando sim, só que ele não está escrevendo, ele cria com 0 bytes de tamanho.

Eu coloquei assim:

public void leArquivo()
    {
        try
        {
             int i = 0;
             FileReader reader = new FileReader("maximo.lmt"); //Lendo o arquivo
             //File file1 = new File("C:/Documents and Settings/douglastc/NetBeansProjects/Trabalho Arquitetura 1/Teste.txt");
             FileWriter fw = new FileWriter("arquivo.txt",true);  //Criando um arquivo
             BufferedReader buffer = new BufferedReader(reader); //Criando um BufferReader do arquivo Lido
             PrintWriter file = new PrintWriter(fw);  //Escrever no arquivo criado.
             String linhaCorrente;  

             for (linhaCorrente = buffer.readLine(); linhaCorrente != null; linhaCorrente = buffer.readLine())   
             {
                 System.out.println(linhaCorrente);
                 file.write(linhaCorrente);     
             }   
            
             cont = i;
             
        }
        catch(Exception e)
        {
            Erro error = new Erro();
            
            error.erro(6);
        }
    }
D

thingol:
a) Tudo que você abre tem de fechar. Você fechou o arquivo?
b) Dê uma busca, provavelmente o arquivo foi criado em um outro diretório que você não está esperando (já que você não está especificando o diretório na instrução que abre o arquivo).

FileWriter fw = new FileWriter("Teste.txt");

O problema era de fechar o arquivo mesmo, que raiva,hehehehehe. Fiquei a manhã inteira só pra resolver esses probleminha bestas. :oops:
Obrigado pela ajuda, abraços!

T

Seu professor não foi orientado corretamente. Você quer a explicação completa ou a simples?

A explicação simples: arquivos se fecham sozinhos sim, mas depois de muito tempo, ou seja, é melhor não confiar e sempre fechar.
É a mesma coisa que deixar uma toalha molhada em cima da cama.
Uma hora (talvez sua mãe ou a diarista, ou pior, sua esposa) alguém acha a tal toalha e a pendura no varal ou no cabide do banheiro, mas você vai levar uma bronca daquelas por ser descuidado e relaxado.*

A explicação completa: em algumas implementações, as classes de acesso a arquivos implementam o método finalize, que deve fechar automaticamente o arquivo se não houver mais referência a ele. Só que há dois problemas:

  • A JVM não se compromete a chamar “finalize” em tempo razoável. Pode até ser que o programa seja encerrado e o método finalize nunca seja chamado.
  • A JVM só chama “finalize”, normalmente, duas interações de “full garbage collection” depois que não houver mais nenhuma referência para esse objeto pendente em algum lugar. Isso pode levar muito tempo.
    Portanto, não se esqueça de fechar direito os arquivos, e sempre.
  • Quanto à toalha molhada: pode ser que no fim das contas ninguém ache a tal toalha molhada e você vá ter de dormir com a cama úmida. É melhor sempre deixar a toalha no cabide ou no varal!
D

thingol:
douglastc:

Meu professor disse que não precisamos fechar o arquivo, a JVM fecha automaticamente pra nós, agora fiquei na dúvida.

Seu professor não foi orientado corretamente. Você quer a explicação completa ou a simples?

A explicação simples: arquivos se fecham sozinhos sim, mas depois de muito tempo, ou seja, é melhor não confiar e sempre fechar.
É a mesma coisa que deixar uma toalha molhada em cima da cama.
Uma hora (talvez sua mãe ou a diarista, ou pior, sua esposa) alguém acha a tal toalha e a pendura no varal ou no cabide do banheiro, mas você vai levar uma bronca daquelas por ser descuidado e relaxado.*

A explicação completa: em algumas implementações, as classes de acesso a arquivos implementam o método finalize, que deve fechar automaticamente o arquivo se não houver mais referência a ele. Só que há dois problemas:

  • A JVM não se compromete a chamar “finalize” em tempo razoável. Pode até ser que o programa seja encerrado e o método finalize nunca seja chamado.
  • A JVM só chama “finalize”, normalmente, duas interações de “full garbage collection” depois que não houver mais nenhuma referência para esse objeto pendente em algum lugar. Isso pode levar muito tempo.
    Portanto, não se esqueça de fechar direito os arquivos, e sempre.
  • Quanto à toalha molhada: pode ser que no fim das contas ninguém ache a tal toalha molhada e você vá ter de dormir com a cama úmida. É melhor sempre deixar a toalha no cabide ou no varal!

Cara, vc falou tudo, ótima explicação, muito obrigado pela sua resposta.

Criado 26 de outubro de 2008
Ultima resposta 27 de out. de 2008
Respostas 13
Participantes 4