[RESOLVIDO] Escrever em um arquivo que já existe

5 respostas
brunex92

Galera to com uma dúvida que o google não me satisfez, pois já tentei e não obtive sucesso, quero escrever em um arquivo que ja existe e que já criei na main, e quero escrever sem apagar o que já existe, só que uso um método que está em outra classe que faz a ordenação e escreve o que quero adicionar, porém, mesmo utilizando o que o google e fóruns me fornecem para escrever em um arquivo que já existe, no arquivo não escreve nada do que pretendo escrever em seguida

FileWriter arq = new FileWriter("ResultadoOrdenacao.txt",true);

Quando não coloco o true, a mesma coisa acontece, só escreve o que eu pedi para escrever na main.
Alguém pode me ajudar?

O que é escrito no programa, que está na main
FileWriter arq = new FileWriter("ResultadoOrdenacao.txt");
arq.write("INSERTION SORT" + newLine);
arq.write("Tamanho do vetor: " + String.valueOf(tamanho) + newLine);	//Escreve no arquivo
arq.write("Maior número que pode ser gerado: " + String.valueOf(max) + newLine);
arq.write("Vetor antes da Ordenação: " + Arrays.toString(v) + newLine);
arq.write("Ordenação escolhida: Crescente" + newLine);
								
Ordenacao.insercaoCrescenteAleatorio(v, tamanho);
								
System.out.printf("Vetor depois da ordenacao: ");
Funcao.exibeArray(v);
						
arq.write("Vetor depois da Ordenação: " + Arrays.toString(v));
O que eu quero escrever depois, que está em outra classe
public static void insercaoCrescenteAleatorio(Item v[], int n){
		int j;
		int comparacao=0;
		int movimentacao=0;
		long time=0;
		
		Cronometro.start();
		for(int i=1; i<n; i++){
			Item x = v[i];
			for(j=i-1; j >= 0 && x.compara(v[j]) < 0;j--)
				v[j+1] = v[j];
			v[j+1] = x;
		}
		Cronometro.stop();
		
		time = Cronometro.elapsedTime();
		System.out.print("Tempo de execucao: ");
		System.out.println(time/1000d + "ms");
		System.out.printf("Numero de comparacoes: %d\n", comparacao);
		System.out.printf("Numero de movimentacoes: %d\n", movimentacao);
		
		try {   
			FileWriter arq = new FileWriter("ResultadoOrdenacao.txt",true);
            arq.write("Tempo de execucao: " + time/1000d + "ms" + newLine);
            arq.write("Numero de comparacoes: " + comparacao + newLine);
            arq.write("Numero de movimentacoes: " + movimentacao + newLine);
            arq.close();  
        }  
        catch (Exception ee) {  
            ee.printStackTrace();  
        }  
	}

No arquivo só isso aparece
INSERTION SORT
Tamanho do vetor: 10
Maior número que pode ser gerado: 100
Vetor antes da Ordenação: [31, 84, 15, 81, 16, 98, 96, 15, 58, 8]
Ordenação escolhida: Crescente
Vetor depois da Ordenação: [8, 15, 15, 16, 31, 58, 81, 84, 96, 98]

que foi o que pedi na main

5 Respostas

ViniGodoy

Passe arq como parâmetro para o método Ordenacao.insercaoCrescenteAleatorio(v, tamanho);

Use-o lá dentro (sem reabrir o arquivo).

Seu problema é que você ainda não fechou o arquivo quando chamou esse método. E, pior do que isso, faz uma nova escrita nele e depois o salva.
Com isso, o que está na memória do primeiro FileWriter, criado no main, vai apagar o que foi escrito no segundo FileWriter, fora do main.

Outra forma de resolver o problema é fechar o arquivo na linha 07 do seu main. E reabri-lo igual você fez na função na linha 12.
E não esqueça de dar flush() e close() para fechar seu arquivo em todos os casos.

brunex92

ViniGodoy:
Passe arq como parâmetro para o método Ordenacao.insercaoCrescenteAleatorio(v, tamanho);

Use-o lá dentro (sem reabrir o arquivo).

Seu problema é que você ainda não fechou o arquivo quando chamou esse método. E, pior do que isso, faz uma nova escrita nele e depois o salva.
Com isso, o que está na memória do primeiro FileWriter, criado no main, vai apagar o que foi escrito no segundo FileWriter, fora do main.

Outra forma de resolver o problema é fechar o arquivo na linha 07 do seu main. E reabri-lo igual você fez na função na linha 12.
E não esqueça de dar flush() e close() para fechar seu arquivo em todos os casos.

Eu estou dando o close no fim da Main, é que isso é apenas uma parte do código.
A segunda solução me pareceu mais interessante, mas como devo reabrir o arquivo na linha 12 depois de fechado na linha 07? E como devo chamá-lo no método, passando o true como parâmetro como fiz?

ViniGodoy
Muda a função para:
public static void insercaoCrescenteAleatorio(FileWriter arq, Item v[], int n){
		int j;
		int comparacao=0;
		int movimentacao=0;
		long time=0;
		
		Cronometro.start();
		for(int i=1; i&lt;n; i++){
			Item x = v[i];
			for(j=i-1; j &gt;= 0 && x.compara(v[j]) &lt; 0;j--)
				v[j+1] = v[j];
			v[j+1] = x;
		}
		Cronometro.stop();
		
		time = Cronometro.elapsedTime();
		System.out.print(&quot;Tempo de execucao: &quot;);
		System.out.println(time/1000d + &quot;ms&quot;);
		System.out.printf(&quot;Numero de comparacoes: %d\n&quot;, comparacao);
		System.out.printf(&quot;Numero de movimentacoes: %d\n&quot;, movimentacao);
		
		try {   
            arq.write(&quot;Tempo de execucao: &quot; + time/1000d + &quot;ms&quot; + newLine);
            arq.write(&quot;Numero de comparacoes: &quot; + comparacao + newLine);
            arq.write(&quot;Numero de movimentacoes: &quot; + movimentacao + newLine);
            arq.flush();  
        }  
        catch (Exception ee) {  
            ee.printStackTrace();  
        }  
	}

E o main para:

FileWriter arq = new FileWriter(&quot;ResultadoOrdenacao.txt&quot;);
arq.write(&quot;INSERTION SORT&quot; + newLine);
arq.write(&quot;Tamanho do vetor: &quot; + String.valueOf(tamanho) + newLine);	//Escreve no arquivo
arq.write(&quot;Maior número que pode ser gerado: &quot; + String.valueOf(max) + newLine);
arq.write(&quot;Vetor antes da Ordenação: &quot; + Arrays.toString(v) + newLine);
arq.write(&quot;Ordenação escolhida: Crescente&quot; + newLine);
								
Ordenacao.insercaoCrescenteAleatorio(arq, v, tamanho);
								
System.out.printf(&quot;Vetor depois da ordenacao: &quot;);
Funcao.exibeArray(v);
						
arq.write(&quot;Vetor depois da Ordenação: &quot; + Arrays.toString(v));
ViniGodoy
Ou, para a segunda solução:
FileWriter arq = new FileWriter("ResultadoOrdenacao.txt");
arq.write("INSERTION SORT" + newLine);
arq.write("Tamanho do vetor: " + String.valueOf(tamanho) + newLine);	//Escreve no arquivo
arq.write("Maior número que pode ser gerado: " + String.valueOf(max) + newLine);
arq.write("Vetor antes da Ordenação: " + Arrays.toString(v) + newLine);
arq.write("Ordenação escolhida: Crescente" + newLine);
arq.flush();
arq.close();
								
Ordenacao.insercaoCrescenteAleatorio(v, tamanho);

arq = new FileWriter("ResultadoOrdenacao.txt");								
System.out.printf("Vetor depois da ordenacao: ");
Funcao.exibeArray(v);						
arq.write("Vetor depois da Ordenação: " + Arrays.toString(v));

Não esquecendo de fazer arq.close() na outra função também.

brunex92
ViniGodoy:
Ou, para a segunda solução:
FileWriter arq = new FileWriter("ResultadoOrdenacao.txt");
arq.write("INSERTION SORT" + newLine);
arq.write("Tamanho do vetor: " + String.valueOf(tamanho) + newLine);	//Escreve no arquivo
arq.write("Maior número que pode ser gerado: " + String.valueOf(max) + newLine);
arq.write("Vetor antes da Ordenação: " + Arrays.toString(v) + newLine);
arq.write("Ordenação escolhida: Crescente" + newLine);
arq.flush();
arq.close();
								
Ordenacao.insercaoCrescenteAleatorio(v, tamanho);

arq = new FileWriter("ResultadoOrdenacao.txt");								
System.out.printf("Vetor depois da ordenacao: ");
Funcao.exibeArray(v);						
arq.write("Vetor depois da Ordenação: " + Arrays.toString(v));

Não esquecendo de fazer arq.close() na outra função também.

a segunda funcionou perfeitamente com uma correção na linha 12 que faltou o true, valeu mesmo :)

Criado 20 de abril de 2013
Ultima resposta 21 de abr. de 2013
Respostas 5
Participantes 2