Como inserir valores no meio de um arquivo de texto?

5 respostas
gconsentini

Olá gente, eu estou iniciando aqui no forum, eu gostaria de uma ajuda de como eu posso incluir texto no meio de um arquivo de texto, Ex.

Arquivo.txt>

Teste1
Teste2
Teste3
Teste4
Teste5
Teste6
Teste7
Teste8
Teste9
Teste11

e eu tenho o texto Teste10 pra inserir, o exemplo de saida é:

Teste1
Teste2
Teste3
Teste4
Teste5
Teste6
Teste7
Teste8
Teste9
Teste10
Teste11

Alguem poderia me ajudar como poderia fazer isso?

desde já agradeço.

5 Respostas

PedroMorragudo

Boa-tarde. Encontrei no GUJ este código simples de como criar um arquivo de texto.

Link do GUJ de como manipular arquivos: http://www.guj.com.br/articles/13

package main;

import java.io.FileWriter;  
import java.io.File;  
import java.io.IOException;  
  
class Teste {  
    public static void main(String[] args) {  
        String textoQueSeraEscrito = "Texto que sera escrito2.";  
          
        FileWriter arquivo;  
          
        try {  
            arquivo = new FileWriter(new File("C:/teste.txt"));  
            arquivo.write(textoQueSeraEscrito);  
            arquivo.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
          
    }  
}

E este Feito pelo Emerson Ribeiro de Mello
http://wiki.sj.ifsc.edu.br/wiki/index.php/Trabalhando_com_arquivos_texto_em_Java

package arquivostexto;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.util.Scanner;
 
/**
 * Exemplo de como fazer a leitura e a escrita em arquivos TXT com Java
 * Para a leitura é feito uso da classe Scanner
 *
 * @author Emerson Ribeiro de Mello
 */
public class Principal {
 
    /* atributos */
    private String nomeDoArquivo;
 
    /* construtor */
    public Principal(String nomeArquivo) {
        this.nomeDoArquivo = nomeArquivo;
    }
 
    /* métodos */
    public void inserirDados(String registro) {
        File fArquivo = null;
        try {
            fArquivo = new File(this.nomeDoArquivo);
            FileWriter fwArquivo = null;
 
            // Verifica se o arquivo existe
            // Se existir, ele abre par adicionar dados
            // se nao existir, ele cria o arquivo
            if (fArquivo.exists() == true) {
                fwArquivo = new FileWriter(fArquivo, true);
            } else {
                fwArquivo = new FileWriter(fArquivo);
            }
 
            BufferedWriter bw = new BufferedWriter(fwArquivo);
 
            //escreve o registro no arquivo e pula uma linha com o \n
            bw.write(registro + "\n");
 
            System.out.println("Registro adicionado com sucesso...");
 
            //fecha o arquivo
            bw.close();
            fwArquivo.close();
 
        } catch (Exception e) {
            System.err.println("Erro ao inserir linhas no arquivo: " + fArquivo);
        }
    }
 
    public void listarDados() {
        Scanner lendoArquivo = null;
        File arquivo = null;
        try {
            // abrindo o arquivo para leitura
            // se o arquivo nao existir será disparada uma exceção
            arquivo = new File(this.nomeDoArquivo);
            lendoArquivo = new Scanner(arquivo);
 
            // leia o arquivo linha por linha até chegar ao seu fim
            while (lendoArquivo.hasNextLine()) {
                this.processandoLinha(lendoArquivo.nextLine());
            }
 
 
        } catch (FileNotFoundException e) { // tratando quando o arquivo nao existe
            System.err.println("Erro: arquivo nao existe. " + arquivo);
        } finally {
            // fechando o scanner
            try {
                lendoArquivo.close();
            } catch (Exception e) {
            }
        }
    }
 
    private void processandoLinha(String linha) {
        // toda linha do arquivo segue o formato:
        // nome:telefone
        if (linha != null) {
            // separando os campos através do delimitador ':'
            String[] campos = linha.split(":");
 
            System.out.print("Nome: " + campos[0].trim());
            System.out.println("\tFone: " + campos[1].trim());
            System.out.println("--------------------------------------\n");
        }
    }
 
    public void menu() {
        // passando para o objeto da classe Scanner o dispositivo de entrada padrão
        // que é o teclado
        Scanner teclado = new Scanner(System.in);
        int op = 0;
        do {
            System.out.println("..:: Trabalhando com Arquivos Texto ::..");
            System.out.println("1 - Inserir linha");
            System.out.println("2 - Listar todo arquivo");
            System.out.println("3 - Sair");
            System.out.print("Entre com uma opcao: ");
            op = teclado.nextInt();
 
            switch (op) {
                case 1:
                    teclado.nextLine();
                    String nome;
                    String telefone;
                    System.out.println("Entre com os dados:");
                    System.out.print("Nome: ");
                    nome = teclado.nextLine();
                    System.out.print("Fone: ");
                    telefone = teclado.nextLine();
                    this.inserirDados(nome + ":" + telefone);
                    break;
                case 2:
                    this.listarDados();
                    break;
                default:
                    System.out.println("Opção inválida!");
            }
 
        } while (op != 3);
    }
 
    public static void main(String[] args) {
 
        Principal p = new Principal("agenda-poo.txt");
 
        p.menu();
    }
gconsentini

então, mas a idéia nao é adicionar linhas do fim do arquivo, e sim no meio do arquivo, vc conhece como?

PedroMorragudo

Ainda não cara. Poste o código que você fez para eu dar uma olhada.

gconsentini

Então, eu to usando o buffered readear, ainda não fiz o codigo até pq não sei, mas a idéia é ler um arquivo e escrever uma linha no meio dele.
tipo, dar um append no meio do arquivo.

rogeriopaguilar

Cara, ve se isso resolve. Nesse código eu fiz gerar um outro arquivo no mesmo diretório com o sufixo _novo. O arquivo original não é alterado, talvez vc tenha que alterar isso.

package teste;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Classe de teste para inserir uma linha num arquivo existente. O método escreverLinhaNoArquivo deve ser chamado <br></br>
 * com o caminho do arquivo atual, o índice da linha que será inserida no arquivo (o índice da primeira linha     <br></br>
 * é zero, o da segunda é 1 e assim por diante) e o conteúdo que será inserido.									  <br></br>	
 * Será gerado no mesmo local um arquivo com o mesmo nome e o sufixo _novo ao final do nome, contendo 			  <br></br>
 * a linha inserida na posição passada como parâmetro.															  <br></br>
 * 
 * @author Rogério de Paula Aguilar
 * */
public class TesteArquivo {

	public static void escreverLinhaNoArquivo(String caminhoArquivo, long linha, String conteudoLinha) throws IOException {
		if(linha < 0) {
			throw new IllegalArgumentException("O parâmetro linha deve ser >= 0 (0 é o índice da primeira linha)!");
		}
		if(conteudoLinha == null) {
			throw new IllegalArgumentException("O parâmetro conteudoLinha deve ser <> null!");
		}
		File arquivoAntigo = new File(caminhoArquivo);
		BufferedReader raf = new BufferedReader(new FileReader(arquivoAntigo));
		FileChannel channelAntigo = null;
		FileChannel channelNovo = null;
		try {
			String strLinha = null;
			long tamanho = 0;
			long contadorLinha = 0;
			while( contadorLinha < linha && (strLinha = raf.readLine()) != null) {
				tamanho += (strLinha + System.getProperty("line.separator")).getBytes().length;
				contadorLinha++;
			}

			File arquivoNovo = new File(caminhoArquivo + "_novo");
			arquivoNovo.createNewFile();
			channelAntigo = new FileInputStream(arquivoAntigo).getChannel();
			channelNovo = new FileOutputStream(arquivoNovo).getChannel();
			channelNovo.transferFrom(channelAntigo, 0, tamanho);
			byte bstr[] = (conteudoLinha + System.getProperty("line.separator")).getBytes();
			ByteBuffer b = ByteBuffer.wrap(bstr);
			channelNovo.position(tamanho);
			channelNovo.write(b);
			channelAntigo.position(tamanho);
			channelAntigo.transferTo(tamanho, channelAntigo.size(), channelNovo);
		} finally {
			if(raf != null) {
				raf.close();
			}
			if(channelNovo != null){
				channelNovo.close();
			}
			if(channelAntigo != null){
				channelAntigo.close();
			}
		}
		
		
		
	}
	
	
	public static void main(String[] args) {
		try {
			TesteArquivo.escreverLinhaNoArquivo("/tmp/testeArquivo.txt", 3L, "TESTE NOVA LINHA");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
Criado 30 de agosto de 2012
Ultima resposta 30 de ago. de 2012
Respostas 5
Participantes 3