Salvando resultado em arquivo txt

24 respostas
java
L

Galera como como eu exportaria a saida do programa para arquivo txt ?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;



public class test {

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



		String line;
		Process saida;

		//executa o processo e armazena a referência em 'Saida'
		
		saida = Runtime.getRuntime().exec("cmd /c ipconfig");



		//pega o retorno do processo

		BufferedReader stdInput = new BufferedReader(new 
				InputStreamReader(saida.getInputStream()));

		//printa o retorno
		while ((line = stdInput.readLine()) != null) {
			System.out.println(line);

		}
		stdInput.close();

	}

}

24 Respostas

L

Exemplo na net é o que não falta!

L

eu conseguir fazer de uma forma mano mas ele não cria um arquivo e sim sobrescrever em um já existente! E no caso eu queria criar um novo arquivo toda vez que eu executar o código.

public class test {

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


	Path path = Paths.get("ArquivoFinal.txt");
	String line;
	Process saida;

	//executa o processo e armazena a referência em 'Saida'
	
	saida = Runtime.getRuntime().exec("cmd /c type arquivo1.txt");



	//pega o retorno do processo

	BufferedReader stdInput = new BufferedReader(new 
			InputStreamReader(saida.getInputStream()));
	
	
	
	//printa o retorno
	while ((line = stdInput.readLine()) != null) {
		Files.write(path, line.getBytes(), StandardOpenOption.APPEND);

	}
	System.out.println("Arquivo escrito");
	
	stdInput.close();

}

}

J

Bom utilizando o exemplo do meu amigo @LostSoldier
seria dessa forma:

public static void main(String[] args){
String line;
        Process saida;

        //executa o processo e armazena a referência em 'Saida'
        saida = Runtime.getRuntime().exec("cmd /c ipconfig");

        //pega o retorno do processo
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(saida.getInputStream()));
        //cria um arquivo, vc passa o diretorio, caso nao passar o diretorio ele cria na pasta do projeto
        File arquivo = new File("testando.txt");
        //classe responsável pela a escrita no arquivo
        PrintWriter escrever = new PrintWriter(arquivo);

        //printa o retorno
        while ((line = stdInput.readLine()) != null) {
            //escreve no arquivo pulando uma linha
            escrever.println(line);
        }
        //fecha
        escrever.flush();
        escrever.close();
        stdInput.close();

}
L

Essa nova api ainda não mexi, mas deve ser por causa disso

StandardOpenOption.APPEND

Isso quer dizer que se o arquivo existir, o conteúdo novo será adiciionado ao já existente, ou seja, o arquivo vai crescendo no hd…

Você pode mudar para a opção

StandardOpenOption.TRUNCATE_EXISTING

Que limpa o arquivo e escreve o conteúdo novo…

Dá uma lida na doc

https://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardOpenOption.html

L

Mas ai no caso não deveria ter os métodos de tratamento de exceção ?

J

Sim, teria sim, é só um exemplo ai esses tratamentos vc implementa

J

Não sabia dessa API do java 8 kkk curti ela vou dar uma olhada

L

Blz vou dá uma olhada aqui

L

Galera eu conseguir dessa forma, cria o arquivo certinho , agora não sei por mas ele não ler e consequentemente não escreve no arquivo todo o contéudo , nas ultimas linhas ele ignorar .

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

String line;
	Process saida;


	Path path = Paths.get("124.txt");
	try {
		Files.createFile(path);
	} catch (Exception e) {
		System.err.println(e);
	}



	//executa o processo e armazena a referência em 'Saida'

	saida = Runtime.getRuntime().exec("cmd /c ipconfig");



	//pega o retorno do processo

	BufferedReader stdInput = new BufferedReader(new 
			InputStreamReader(saida.getInputStream()));



	//printa o retorno
	while ((line = stdInput.readLine()) != null) {
		Files.write(path, line.getBytes(), StandardOpenOption.APPEND);

	}

	JOptionPane.showMessageDialog(null, "Arquivo foi escrito");

	stdInput.close();

}
J

Bom, como nunca utilizei essa API não sei ao certo, mas o problema pode ser algo pela forma de escrita byte a byte

L

Não seria mais fácil já mandar o próprio processo exportar o arquivo?

Veja se funciona…

Runtime.getRuntime().exec("cmd /c ipconfig > arquivo.txt"); //se existir, limpa e escreve

Runtime.getRuntime().exec("cmd /c ipconfig >> arquivo.txt"); //append

Depois você só pega o arquivo já pronto?

L

desse jeito funciona, mas ele não mostra a saida , só escreve direto. No caso eu queria mostrar a leitura do arquivo e salva-lo.

J

Bom mano se é algo só para escrever não é melhor utiliza só o PrintWrite?
ex:

PrintWrite escrever = new PrintWrite(new File("arquivo.txt"));
//escreve pulando linha
escrever.println("escrevendo alguma coisa");
//escreve sem pular a linha
escrever.write("escreve sem pular linha, tudo junto");
escrever.flush();
escrever.close();

ou então usando o bufferedWrite, cujo essa nova API retorna um desse tipo tbm:
ex:

Path path = Paths.get("arquivo.txt");
try (BufferedWriter escrever = Files.newBufferedWriter(path)) {
    escrever.write("print('Hello World');");
}
L

Verdade , mas no caso eu queria mostrar o conteúdo retornado do processo e ao mesmo tempo salva-lo , no caso eu só ia usar o processo no caso o cmd para ler o arquivo para o meu programa e retorna o resultado , ai no meu programa eu iria mostrar a leitura no caso o conteúdo de tal e salva-lo em algum lugar, mas acontece que quando eu recebo o retorno ele não vem completo e consequentemente não escreve todo o conteudo .

J

como assim não vem completo mano ? vc fala do texto mostrando a configurações do ip?
Tanto mostrar o conteúdo e salvar vc já sabe!

L

Tipo arquivos maiores , ele não retorna todo o conteúdo do arquivo e consequentemente ele não salva todo o conteúdo, fiz alguns testes aqui e sempre dá no mesmo , arquivos menos ele captura tudo .

J

Você poderia passar esse arquivo aqui? para eu ver

L

O arquivo aqui que eu utilizo são dois de 9 mb , ou seja o arquivo final deveria ter 18mb certo ?! Só quando gera o arquivo final o tamanho é menor logo ele não conseguiu processar tudo . Faz um teste copia algo em um arquivo varias vezes e faz o teste.

J

Então deixa eu ver se entendi, vc que copiar os conteúdos de dois arquivos diferentes e colocar em apenas 1 arquivo?
Bom, pela lógica q já montei aqui daria, certo vou fazer um teste então! se for isso ai que vc falou

L

isso , dois ou mais arquivos ou apenas 1 mesmo . Aqui eu testei e não conseguir obter todo o conteúdo

J

Bom mano, consegui, desculpa a demora, estava testando essa API que vc utiliza, e ela é realmente boa, eu tinha feito de duas formas, uma da forma que eu conhecia, mas ficou meio que grande o código, e a outra eu olhei a API e ficou bem pequeno o código e fácil leitura, gostei dessa API:

public static void main(String[] args){
        //arquivos que vamos ler
        Path arquivo1 = Paths.get("arquivo1.txt");
        Path arquivo2 = Paths.get("arquivo2.txt");
        //arquivo que vamos gravar
        Path arquivo_final = Paths.get("arquivo_pronto.txt");
        //faço a leitura dos arquivo separadamente
        List<String> dados_do_arquivo1 = Files.readAllLines(arquivo1);
        List<String> dados_do_arquivo2 = Files.readAllLines(arquivo2);
        
        /*Aqui é onde eu junto os dados dois arquivos, em outras palavras
        eu to pegandos os dados do SEGUNDO arquivo e ADICIONANDO no PRIMEIRO
        arquivo.
        */
        dados_do_arquivo1.addAll(dados_do_arquivo2);
        /*após isso, eu passo os dados do arquivo 1 que já está junto com os dados
        do arquivo 2 e mando escrever e pronto.
        */
        Files.write(arquivo_final, dados_do_arquivo1, StandardOpenOption.WRITE);

}

Esses dois arquivo cada um tinha 11 MB cada, após testar o arquivo final ficou 23 MB deve ser para a forma que ele escreve os caracteres, mas em outras palavras funciona

L

Testei aqui mano realmente funciona ! Sair certinho , mas no caso como eu faria se a leitura fosse usando um processo externo ? Por que eu estava usando o cmd justamente com esse proposito . Já que o cmd é capaz de ler múltiplos arquivos.

J

Bom mano, ai no caso vc teria q montar uma lógica legal para trabalhar com esses multiplos arquivos, eu vi q essa API tem uns método que retorna o que tem na pasta, eu testei o seguinte:

Stream<Path> list = Files.list(Paths.get(""));
list.filter(path -> path.toFile().isFile()).forEach(encontrados -> System.out.println(encontrados));

Bom, peguei a lista de tudo que tem na pasta do projeto inclusive pastas, fiz um filtro(filter) para encontrar somente arquivos dentro dessa lista e após isso fiz um forEach para mostrar os arquivos encontrados.

Vc pode dar uma olhada em Colletors, ai o código sabendo os nomes dos arquivos e ai é faz um laço para ler esses arquivos.
Ex esse colletors me retorna os dados, que no caso é os nomes dos arquivos em uma List

Stream<Path> list = Files.list(Paths.get(""));        
        List<Path> encontrados = list.filter(path -> path.toFile().isFile()).collect(Collectors.toList());
        encontrados.forEach(nome_dos_arquivos -> {
            System.out.println(nome_dos_arquivos);
        });
L

eu vou dá uma olhada

Criado 30 de abril de 2017
Ultima resposta 1 de mai. de 2017
Respostas 24
Participantes 3