Galera como como eu exportaria a saida do programa para arquivo txt ?
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclasstest{publicstaticvoidmain(String[]args)throwsIOException{Stringline;Processsaida;//executa o processo e armazena a referência em 'Saida'saida=Runtime.getRuntime().exec("cmd /c ipconfig");//pega o retorno do processoBufferedReaderstdInput=newBufferedReader(newInputStreamReader(saida.getInputStream()));//printa o retornowhile((line=stdInput.readLine())!=null){System.out.println(line);}stdInput.close();}}
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 {
publicstaticvoidmain(String[]args)throwsIOException{Pathpath=Paths.get("ArquivoFinal.txt");Stringline;Processsaida;//executa o processo e armazena a referência em 'Saida'saida=Runtime.getRuntime().exec("cmd /c type arquivo1.txt");//pega o retorno do processoBufferedReaderstdInput=newBufferedReader(newInputStreamReader(saida.getInputStream()));//printa o retornowhile((line=stdInput.readLine())!=null){Files.write(path,line.getBytes(),StandardOpenOption.APPEND);}System.out.println("Arquivo escrito");stdInput.close();}
}
J
Jeanderson_Silva1 like
Bom utilizando o exemplo do meu amigo @LostSoldier
seria dessa forma:
publicstaticvoidmain(String[]args){Stringline;Processsaida;//executa o processo e armazena a referência em 'Saida'saida=Runtime.getRuntime().exec("cmd /c ipconfig");//pega o retorno do processoBufferedReaderstdInput=newBufferedReader(newInputStreamReader(saida.getInputStream()));//cria um arquivo, vc passa o diretorio, caso nao passar o diretorio ele cria na pasta do projetoFilearquivo=newFile("testando.txt");//classe responsável pela a escrita no arquivoPrintWriterescrever=newPrintWriter(arquivo);//printa o retornowhile((line=stdInput.readLine())!=null){//escreve no arquivo pulando uma linhaescrever.println(line);}//fechaescrever.flush();escrever.close();stdInput.close();}
L
LostSoldier
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…
Mas ai no caso não deveria ter os métodos de tratamento de exceção ?
J
Jeanderson_Silva
Sim, teria sim, é só um exemplo ai esses tratamentos vc implementa
J
Jeanderson_Silva
Não sabia dessa API do java 8 kkk curti ela vou dar uma olhada
L
Lucas_Luan
Blz vou dá uma olhada aqui
L
Lucas_Luan
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 {
Stringline;Processsaida;Pathpath=Paths.get("124.txt");try{Files.createFile(path);}catch(Exceptione){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 processoBufferedReaderstdInput=newBufferedReader(newInputStreamReader(saida.getInputStream()));//printa o retornowhile((line=stdInput.readLine())!=null){Files.write(path,line.getBytes(),StandardOpenOption.APPEND);}JOptionPane.showMessageDialog(null,"Arquivo foi escrito");stdInput.close();}
J
Jeanderson_Silva
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
LostSoldier
Não seria mais fácil já mandar o próprio processo exportar o arquivo?
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
Jeanderson_Silva
Bom mano se é algo só para escrever não é melhor utiliza só o PrintWrite?
ex:
PrintWriteescrever=newPrintWrite(newFile("arquivo.txt"));//escreve pulando linhaescrever.println("escrevendo alguma coisa");//escreve sem pular a linhaescrever.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:
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
Jeanderson_Silva
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
Lucas_Luan
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
Jeanderson_Silva
Você poderia passar esse arquivo aqui? para eu ver
L
Lucas_Luan
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
Jeanderson_Silva
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
Lucas_Luan1 like
isso , dois ou mais arquivos ou apenas 1 mesmo . Aqui eu testei e não conseguir obter todo o conteúdo
J
Jeanderson_Silva
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:
publicstaticvoidmain(String[]args){//arquivos que vamos lerPatharquivo1=Paths.get("arquivo1.txt");Patharquivo2=Paths.get("arquivo2.txt");//arquivo que vamos gravarPatharquivo_final=Paths.get("arquivo_pronto.txt");//faço a leitura dos arquivo separadamenteList<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
Lucas_Luan
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
Jeanderson_Silva
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:
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