Como faço para acessar um arquivo txt?

Como faço para acessar um arquivo txt, fazer algumas modificações e depois salvar este arquivo com um nome diferente:(

Um abarço.

Opa, bem vindo ao forum…

Entao, voce esta querendo abrir um arquivo em modo ASCII, alterar algo e salvar novamente, porem com outro nome.
Existe algumas dezenas de diferentes metodos que vao chegar no mesmo resultado. Vou te explicar um e se nao for o que interessa diga que posso explicar alguns outros.

Basicamente voce tem que primeiro abrir o arquivo que voce quer ler e o que voce quer gravar, fazemos isso ao com o seguinte codigo:

FileInputStream stream = new FileInputStream("arquivo.txt");
InputStreamReader streamReader = new InputStreamReader(stream);
BufferedReader reader = new BufferedReader(streamReader);

Linha 1: abre o arquivo numa stream
Linha 2: converte bytes em caracteres
Linha 3: cria um buffer para acesso mais rapido ao arquivo

E agora o de escrita:

FileWriter fileWriter = new FileWriter("arquivoalvo.txt");
PrintWriter writer = new PrintWriter(fileWriter);

Linha 1: abre o arquivo para escrita (voce pode abrir para append tambem se desejar)
Linha 2: abre o escritor (converte Strings em caracteres etc)

agora falta ler o arquivo ate o fim e ir jogando os dados no segundo arquivo. primeiro criamos uma variavel que vai ler cada linha e depois um loop do tipo while ira parsear o arquivo inteiro, linha por linha, gravando a nova linha no novo arquivo:

String line = null;
while((line=reader.readLine())!=null) {
	writer.println("Nova Linha: " + line);
}

e fechamos os objetos de io:

writer.close(); fileWriter.close(); reader.close(); streamReader.close(); stream.close();

esse metodo que te ensinei pode ser util quando voce quer alterar uma parte do arquivo, existem outros metodos que irao primeiro ler o arquivo e depois salvar, por exemplo.

detalhe importante: eh bom uso de java fechar todos os objetos de io criados, com o metodo close() apos o uso. Sempre na ordem contraria da abertura.

Espero ter ajudado,

Guilherme Silveira[/i]

alias esse eh um bom assunto pra um tutorial simples, muita gente ira perguntar sobre isso

Guilherme

Realmente, este é um tutorial bem simples. Se alguém quiser escrever…

Olá Guilherme , muito obrigado, valeu mesmo, foi uma explicação entanto.

Me diz mais uma coisa, como eu poderia criar uma arquivo.java com um código desse?? Será que haveria como você quebar meu galho nisso também.Gostaria de criar um .class para fazer umas alterações em um txt específico.

Valeu mesmo,
Darta.

Oi, aqui está um exemplo de um programa simples que ilustra como utilizar o que o Guilherme explicou:

import java.io.*;

public class ProcessadorTexto
{

  //
  // Este eh um simples programa para ilustrar
  // como acessar um arquivo, processar seu conteúdo
  // e escrever um novo arquivo texto.
  //
  // O programa recebe dois argumentos na linha de
  // comando: o nome do arquivo para ser processado e
  // o nome do arquivo novo. Neste exemplo transformamos
  // as letras minúsculas do texto em maiúsculas.
  //
  // Exemplo de uso do programa:
  //
  // java ProcessadorTexto arquivo.txt novoArquivo.txt 
  //

  public static void main (String [] args) throws Exception{
	
    // aqui vamos checar se foram passados 
    // os dois argumentos pedidos.
    // args[0] contém o nome do arquivo original
    // args[1] contém o nome do novo arquivo

    if(args.length != 2){
      System.out.println("uso: java ProcessamentoTexto arquivo.txt novoArquivo.txt");
      System.exit(1);
    }



    // agora vem a parte principal do programa, usando como base
    // o codigo que o Guilherme colocou no post anterior:

    FileInputStream stream = new FileInputStream(args[0]); 
    InputStreamReader streamReader = new InputStreamReader(stream); 
    BufferedReader reader = new BufferedReader(streamReader);

    FileWriter fileWriter = new FileWriter(args[1]); 
    PrintWriter writer = new PrintWriter(fileWriter); 

    // Neste while lemos o arquivo linha a linha
    String line = null;
    while( (line=reader.readLine() ) != null ) {

      // Como exemplo, vamos transformar todos 
      // as letras minúsculas em maiúsculas
      String novaLinha = line.toUpperCase();
      writer.println(novaLinha); 
    } 

    // fechando os objetos de io:
    writer.close(); 
    fileWriter.close(); 
    reader.close(); 
    streamReader.close(); 
    stream.close();

  }

}

Olá FLC, utilizei o seu código, compilei mas não faz nada!!!
será que está faltando algo??
Mudei tambem duas linhas, são elas:

FileInputStream stream = new FileInputStream(args[0]);
para
FileInputStream stream = new FileInputStream(“original.txt”);

e a outra
FileInputStream stream = new FileInputStream(args[1]);
para
FileInputStream stream = new FileInputStream('modificado.txt");

import java.io.*;

public class abrir_arquivo
{

//
// Este eh um simples programa para ilustrar
// como acessar um arquivo, processar seu conteúdo
// e escrever um novo arquivo texto.
//
// O programa recebe dois argumentos na linha de
// comando: o nome do arquivo para ser processado e
// o nome do arquivo novo. Neste exemplo transformamos
// as letras minúsculas do texto em maiúsculas.
//
// Exemplo de uso do programa:
//
// java ProcessadorTexto arquivo.txt novoArquivo.txt
//

public static void main (String [] args) throws Exception{

// aqui vamos checar se foram passados 
// os dois argumentos pedidos. 
// args[0] contém o nome do arquivo original 
// args[1] contém o nome do novo arquivo 

if(args.length != 2){ 
  System.out.println("uso: java ProcessamentoTexto original.txt modificado.txt"); 
  System.exit(1); 
} 
// agora vem a parte principal do programa, usando como base 
// o codigo que o Guilherme colocou no post anterior: 

//Modifiquei aqui para ver se ele pegava o arquivo e fazia a converssão,
//não adiantou?? Troquei o arg[0], pelo nome do arquivo??, o que falta?
//FileInputStream stream = new FileInputStream(args[0]);
FileInputStream stream = new FileInputStream(“original.txt”);
InputStreamReader streamReader = new InputStreamReader(stream);
BufferedReader reader = new BufferedReader(streamReader);

//FileWriter fileWriter = new FileWriter(args[1]);
FileWriter fileWriter = new FileWriter(args["modificado.txt"]);
PrintWriter writer = new PrintWriter(fileWriter); 

// Neste while lemos o arquivo linha a linha 
String line = null; 
while( (line=reader.readLine() ) != null ) { 

  // Como exemplo, vamos transformar todos 
  // as letras minúsculas em maiúsculas 
  String novaLinha = line.toUpperCase(); 
  writer.println(novaLinha); 
} 

// fechando os objetos de io: 
writer.close(); 
fileWriter.close(); 
reader.close(); 
streamReader.close(); 
stream.close(); 

}

}

um abraço,
Darta.

Olá!
Estranho nao ter funcionado, eu testei aqui e deu tudo certo! Você tentou testar o código sem modificá-lo? Voce não esqueceu de passar os parâmetros na linha de comando na hora de executar o programa?

Bem, mas se vc quiser deixar os nomes dos arquivos fixos no código faça o seguinte:

Remova o trecho da verificação dos argumentos:

if(args.length != 2){ 
  System.out.println("uso: java ProcessamentoTexto original.txt modificado.txt"); 
  System.exit(1); 
}

Se voce deixar essa verificação no programa e não passar os dois argumentos pedidos na linha de comando, o programa não irá fazer nada e vai imprimir a mensagem “uso: java ProcessamentoTexto original.txt modificado.txt”.

Outra coisa:

No código que voce colocou está assim:

FileWriter fileWriter = new FileWriter(args["modificado.txt"]); 

O vetor de Strings “args” só deve ser usado caso você queira pegar os argumentos da linha de comando. Além disso, ele só pode ser indexado por inteiros. Na hora de compilar, o javac vai reclamar dessa linha. Para corrigir isso, essa linha deve ficar assim:

FileWriter fileWriter = new FileWriter("modificado.txt"); 

Espero que isso resolva seu problema! Apenas uma última consideração: É sempre mais vantajoso passar parâmetros na linha de comando, do que deixar os nomes dos arquivos fixos dentro do programa. Dessa forma, se algum dia você quiser rodar o mesmo programa mas para arquivos de nomes diferentes, não será necessário editar o código e recompilar o programa.

Flávio

Foi mal, em uma linha que vc escreveu que caiu a ficha, eu só estava mandando executar assim:
java abrir_arquivo
mas precisava ser assim
java arquivo_abrir original.txt modificado.txt, assim funcionou!!!

Valeu!!
Qualquer coisa eu grito!!

ola, tudo pode disponibilizar tua classe, pois segui os passos e retorma pra mim, que não consegue encontrar o arquivo…

grato.

nossa há mais de 6 anos atrás!

Há algum problema em não fechar os objetos de io utilizando finally, caso seja lançado uma exceção antes de fecha-los? Eles ficaram abertos pra sempre, ou até qdo o gv “limpa-los”?

ops, …ou até qdo o gc “limpa-los”?

Há sim; o segundo passo do gc chama os finalizadores, que fecha os arquivos que ficaram abertos por acidente, mas não é bom confiar no segundo passo porque pode ser até que o programa seja encerrado antes do tal segundo passo ser chamado - e isso deixará arquivos mal-fechados e corrompidos. O correto é sempre fechar arquivos.