[RESOLVIDO]Como adicionar conteudo em um arquivo já existente?

4 respostas
A

Eai galera, estou com uma duvida para manipulação de arquivo...
eu tenho um arquivo que necessita ser adicionado conteudo novo, sem sobrescreve-lo,
So que este arquivo novo, virá com informações que são iguais a do arquivo antigo (EX. cabeçalho),
este conteudo novo, terá que ser comparado e descartado, assim adicionando somente o conteudo
realmente necessario...

A duvida é: Como comparar este conteudo se os arquivos estao em um StringBuffer, e como
excluir o conteudo desnecessario, adicionando somente o conteudo novo?

espero que tenha sido claro na esplicação, caso nao tenham entendido a minha duvida podem me perguntar, que tentarei esplica-la novamente.
package gc.gerador.reader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

import java.io.Writer;

public class TestandoLeitores
{
	public static void main(String[] args) throws FileNotFoundException, IOException
	{
//Aki eu defino o caminho que o arquivo está o diretório
	String nomeProjeto = "Projeto";
	File file = new File("C:\Des\" + nomeProjeto.toLowerCase() + "\src\br\" + nomeProjeto.toLowerCase() + "\util\facade\MensagemSucesso.java");
		FileReader reader = new FileReader(file);
		BufferedReader buffer = new BufferedReader(reader);

		StringBuffer sb = new StringBuffer();

		if(file.isFile())
		{

//no while eu estou percorrendo todas as linhas do meu arquivo e armazenando em um buffer.
			while (buffer.ready())
			{
				sb.append(buffer.readLine() + "\n");
			}

//neste momento eu deleto o ultimo caracter do meu arquivo, que no caso é um '}'
			sb.reverse().delete(1,2);
			sb.reverse();

//este metodo simboliza o conteudo necessario a ser adicionado no meu arquivo
			sb.append(conteudoADD());

//este é o ponto em que eu acredito que devo comparar o conteudo antigo com o novo e
//deletar as linhas que forem iguais, mantendo
//somente o conteudo novo para assim ser adicionado
 }
//		//Gravar Arquivo
		
		file.getParentFile().mkdirs();

		Writer fw = new OutputStreamWriter( new FileOutputStream(file) ) ;
		fw.write( sb.toString() );

		fw.close();
//		//Fim Gravar Arquivo
	}

	static String conteudoADD()
	{
		String nomeProjeto = "projeto";

		StringBuffer sb = new StringBuffer();
		sb.append("package br." + nomeProjeto.toLowerCase() + ".util.facade;\n");
		sb.append("\n");
		sb.append("/**\n");
		sb.append(" * ESCREVA O JAVADOC!!!\n" );
		sb.append(" */\n");
		sb.append("public interface MensagemSucesso\n");
		sb.append("{\n");
		sb.append("\t/* GENÉRICA */\n");
		sb.append("\tpublic static final String EXCLUSAO_EFETUADA_COM_SUCESSO = \"Exclusão efetuada com sucesso.\";\n");
		sb.append("}");
		return sb.toString();
	}
}
Esse é o arquivo com o conteudo que deverá ser alterado com adicão de mais conteudo.
package br.projeto.util.facade;

/**
 * ESCREVA O JAVADOC!!!
 */
public interface MensagemSucesso
{
	/* GENÉRICA */
	public static final String INCLUSAO_EFETUADA_COM_SUCESSO = "Inclusão efetuada com sucesso.";
	public static final String ALTERACAO_EFETUADA_COM_SUCESSO = "Alteração efetuada com sucesso.";
}
Desde já agradeço a colaboração de todos!!

4 Respostas

A
Pessoal, estou postando aqui o código que criei para resolver o meu problema, pelo menos resolveu parcialmente, porem agora surgiu outra dificuldade. o código que estou postando grava um arquivo novo em um diretorio se o mesmo nao existir, se ele existir ele somente incrementa o conteudo necessario( o método conteudoRealADD() ). Aqui surge o meu problema, se eu rodar duas vezes a classe ele duplica o codigo do método conteudoRealADD(). Alguem que souber, ou tiver uma ideia para resolver este problema, agradeceria muito se postasse sua ideia.
package gc.gerador.reader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class TestandoLeitores
{
	private static final String FILE = "C:\Des\Projeto\src\br\projeto\util\facade\MensagemSucesso.java";

	public static void main(String[] args) throws FileNotFoundException, IOException
	{
		StringBuffer sb = new StringBuffer();
		if (new File(FILE).isFile())
		{
			File file = new File(FILE);
			BufferedReader buffer = new BufferedReader(new FileReader(file));
			while (buffer.ready())
			{
				sb.append(buffer.readLine() + "\n");
			}
			sb.reverse().delete(sb.indexOf("}"), sb.indexOf("}")+1);
			sb.reverse();
			if (conteudoADD().substring(0, conteudoADD().indexOf("{")).contentEquals(sb.substring(0, sb.indexOf("{"))))
			{
				sb.append(conteudoRealADD());
				//Gravar Arquivo
				GravarArquivoLocal(sb);
			}
		}
		else
		{
			sb.append(conteudoADD());
			//Gravar Arquivo
			GravarArquivoLocal(sb);
		}
//		System.out.println(sb);
	}

	static String conteudoADD()
	{
		String nomeProjeto = "projeto";
		StringBuffer sb = new StringBuffer();
		sb.append("package br." + nomeProjeto.toLowerCase() + ".util.facade;\n");
		sb.append("\n");
		sb.append("/**\n");
		sb.append(" * ESCREVA O JAVADOC!!!\n");
		sb.append(" */\n");
		sb.append("public interface MensagemSucesso\n");
		sb.append("{\n");
		sb.append("\t/* GENÉRICA */\n");
		sb.append(conteudoRealADD());
		return sb.toString();
	}

	static String conteudoRealADD()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("\tpublic static final String EXCLUSAO_EFETUADA_COM_SUCESSO = \"Exclusão efetuada com sucesso.\";\n");
		sb.append("}");
		return sb.toString();
	}

	private static void GravarArquivoLocal(StringBuffer sb) throws IOException
	{
		//Gravar Arquivo
		File file = new File(FILE);
		file.getParentFile().mkdirs();
		Writer fw = new OutputStreamWriter( new FileOutputStream(file) ) ;
		fw.write( sb.toString() );

		fw.close();
		//Fim Gravar Arquivo
	}
}
vlw galera!!
nel

Oi!

O que você quer dizer com isso?
De resto, me parece pura manipulação de String, usar métodos como subString, contains, startWith e etc serão muito úteis á você.
Se quiser, podes percorrer linha a linha e verificar o contéudo, mas deve ter uma noção do se trata.

Se fosse XML, seria mais simples ainda.
Abraços.

A

ola nel…
então, está classe é um gerador de código java,

eu quis dizer o seguinte,
neste método( conteudoRealADD() ), eu posso estar colocando arquivo dinamico(aonde o usuario que irá me informar o valor),
EX:

private static String conteudoRealADD(String nomeClasse)
	{
     String nomeClasse = "Pessoa";
		StringBuffer sb = new StringBuffer();
		sb.append("\t/* " + nomeClasse.toUpperCase() + " */\n");
		sb.append("\tpublic static final String " + nomeClasse.toUpperCase() + "_JA_CADASTRADO = \"" + nomeClasse + 
					 " já cadastrado.\";\n");
		sb.append("}");
		return sb.toString();
	}

ai que vem a duvida, pois se essa classe for executada duas vezes e o campo (nomeClasse) for o mesmo nas duas vezes(por algum descuido do usuario) ele duplicará o conteudo do arquivo.
o que eu necessito é fazer uma verificação para saber se o conteudo que está sendo inserido ja existe no arquivo, para não ter informações repetidas no arquivo.

acho que agora ficou um pouco mais claro, caso nao tenha compreendido pode perguntar denovo :smiley:
vlw

A

galera…
resolvi o problema depois de muita dor de cabeça e tentativas.
com duas simples variaveis de buffer e uma de boolean, o problema foi superado…
vou postar a minha resolução caso alguem necessite também, incrementar
conteúdo dinâminco em um arquivo já existente no diretório…

StringBuffer sb = new StringBuffer(); boolean liberar = true; if (new File("C:\Des\" + nomeProjeto.toLowerCase() + "\src\br\" + nomeProjeto.toLowerCase() + "\util\facade\MensagemErro.java").isFile()) { File file = new File("C:\Des\" + nomeProjeto.toLowerCase() + "\src\br\" + nomeProjeto.toLowerCase() + "\util\facade\MensagemErro.java"); BufferedReader buffer, buffer2; buffer = new BufferedReader(new FileReader(file)); buffer2 = new BufferedReader(new FileReader(file)); while (buffer.ready()) { sb.append(buffer.readLine() + "\n"); } while (buffer2.ready()) { if( buffer2.readLine().trim().contains(nomeClasse.toUpperCase() + "_NAO_LOCALIZADO") ) { liberar = false; } } if ( liberar == true ) { if (conteudoCompleto(atributos, nomeProjeto, nomeClasse).substring( conteudoCompleto(atributos, nomeProjeto, nomeClasse).indexOf("public"), conteudoCompleto(atributos, nomeProjeto, nomeClasse).indexOf("interface MensagemErro")). contentEquals(sb.substring(sb.indexOf("public"), sb.indexOf("interface MensagemErro")))) { sb.reverse().delete(sb.indexOf("}"), sb.indexOf("}")+1); sb.reverse(); sb.append(conteudoCorpo(atributos, nomeClasse)); } } GravarArquivoLocal(sb, nomeProjeto); } else { sb.append(conteudoCompleto(atributos, nomeProjeto, nomeClasse)); GravarArquivoLocal(sb, nomeProjeto); }
Espero que este código possa ajudar alguem!!
vlw galera…

Criado 1 de agosto de 2011
Ultima resposta 5 de ago. de 2011
Respostas 4
Participantes 2