Código que cópia as informações de vários arquivos TXT para um so arquivo em java
24 respostas
java
B
Bemires
Boa tarde, sou novo na programação e estou tendo dificuldade em criar um código pra ler vários arquivos TXT e cópiar as informações para um arquivo so, saltando linha
Desenvolvi esse código até agora, mas não está lendo mais de um arquivo e não está saltando linha
packageLer;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.FileReader;importjava.io.IOException;publicclassTeste6{publicTeste6(){// TODO Auto-generated constructor stub}publicstaticvoidmain(String[]args){Filediretorio=newFile("C:\\Arq\\");Filearquivo=null;File[]arquivos=null;FileReaderfr=null;BufferedReaderbr=null;Stringlinha="";FilearquivoDestino=newFile("C:\\Arq\\new.txt");FileOutputStreamfos=null;try{// if (diretorio.isDirectory()) {arquivos=diretorio.listFiles();for(inti=0;i<arquivos.length;i++){arquivo=arquivos[i];}fr=newFileReader(arquivo);br=newBufferedReader(fr);fos=newFileOutputStream(arquivoDestino);while((linha=br.readLine())!=null){fos.write(linha.getBytes());}// }fos.write("\n".getBytes());fos.close();}catch(FileNotFoundExceptionfnex){fnex.printStackTrace();}catch(IOExceptionioex){ioex.printStackTrace();}}}
Sou um leigo no assunto java, não entendi como ficaria essa implementação em meu código. Poderia me ajudar?
staroski1 like
Exemplo:
importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.PrintWriter;publicclassTeste6{publicstaticvoidmain(String[]args){try{Teste6programa=newTeste6();programa.executar();}catch(Throwablet){t.printStackTrace();}}privatevoidexecutar()throwsIOException{Filediretorio=newFile("C:\\Arq\\");FilearquivoDestino=newFile("C:\\Arq\\new.txt");OutputStreamdestino=newFileOutputStream(arquivoDestino);PrintWriterwriter=newPrintWriter(arquivoDestino);for(Filearquivo:diretorio.listFiles()){FileInputStreamorigem=newFileInputStream(arquivo);copiar(origem,destino);// copiar conteúdo do arquivo de origem para o arquivo de destinowriter.println();// pular linha no arquiv de destinoorigem.close();}destino.flush();writer.flush();destino.close();writer.close();}privatevoidcopiar(InputStreamorigem,OutputStreamdestino)throwsIOException{byte[]bytes=newbyte[8192];for(intlidos=-1;(lidos=origem.read(bytes))!=-1;destino.write(bytes,0,lidos)){/* corpo vazio mesmo */}}}
B
Bemires1 like
Muito Obrigado desde já, eu consigo fazer uma condição para que se tiver uma linha igual a uma que já estiver copiada ele não copie?
staroski1 like
E porque não conseguiria?
Exemplo:
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjava.util.List;publicclassTeste6{publicstaticvoidmain(String[]args){try{Teste6programa=newTeste6();programa.executar();}catch(Throwablet){t.printStackTrace();}}privateList<String>linhasCopiadas;privatevoidexecutar()throwsIOException{Filediretorio=newFile("C:\\Arq\\");FilearquivoDestino=newFile("C:\\Arq\\new.txt");PrintWriterdestino=newPrintWriter(arquivoDestino);linhasCopiadas=newArrayList<>();for(Filearquivo:diretorio.listFiles()){BufferedReaderorigem=newBufferedReader(newFileReader(arquivo));copiar(origem,destino);destino.println();origem.close();}destino.flush();destino.close();}privatevoidcopiar(BufferedReaderorigem,PrintWriterdestino)throwsIOException{Stringlinha=null;while((linha=origem.readLine())!=null){if(!linhasCopiadas.contains(linha)){// se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// copia a linha no arquivo de destinolinhasCopiadas.add(linha);// joga a linha na lista de linhas copiadas}}destino.println();// pular linha no arquivo de destino}}
B
Bemires1 like
Esta funcionado perfeitamente. Entre um arquivo e outro esta ficando muito espaço, pode me explicar como retiro esse espaço sem deixar uma informação copiada ficar na frente da outra?
B
Bemires1 like
Já consegui obrigado, teria como definir o formatos do arquivo a ser copiado ? por exemplo quero jogar as informações para um arquivo que já tem alguma informações e não quero que ela apaguem. Como faço?
staroski1 like
Dá uma lida na documentação dos construtores da classe FileOutputStream
B
Bemires1 like
estou fazendo uma função para ler o arquivo primeiro e comparar as linhas já contidas no arquivo antes de inserir, mas agarrei aqui e estou com duvida. Poderia me ajudar a proceder
packageUnificar;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjava.util.List;publicclassUnificar{publicstaticvoidmain(String[]args){try{Unificarprograma=newUnificar();programa.executar();}catch(Throwablet){t.printStackTrace();}}privateList<String>linhasCopiadas;privatevoidexecutar()throwsIOException{Filediretorio=newFile("C:\\Arq");// Pasta de origem FilearquivoDestino=newFile("C:\\Users\\Belmires\\Desktop\\Teste.txt");// Pasta do novo arquivo criadoPrintWriterdestino=newPrintWriter(arquivoDestino);linhasCopiadas=newArrayList<>();BufferedReaderler=newBufferedReader(newFileReader(arquivoDestino));ler(){}for(Filearquivo:diretorio.listFiles()){BufferedReaderorigem=newBufferedReader(newFileReader(arquivo));copiar(origem,destino);origem.close();}destino.flush();destino.close();}// Função que compara as linhasprivatevoidcopiar(BufferedReaderorigem,PrintWriterdestino)throwsIOException{Stringlinha=null;while((linha=origem.readLine())!=null){if(!linhasCopiadas.contains(linha)){// Se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// Copia a linha no arquivo de destinolinhasCopiadas.add(linha);// Joga a linha na lista de linhas copiadas}}}privatevoidler(BufferedReaderdestino){try{while(destino.ready()){linhasCopiadas.add(destino.readLine());}}catch(IOExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}identartextopré-formatadopor4espaços
1
111aaa
Será que é possível incluir vários diretórios? Por exemplo, se eu utilizar um pendrive com esse programa, provavelmente o diretório muda. Seria possível utilizar mais que um diretório padrão? Como posso fazer para esse caso específico: File diretorio = new File("C:", "D:", "N:" ...); ?
B
Bemires1 like
Acho que você teria que criar mais variáveis com os outros diretórios
1
111aaa
Não tem como criar uma variável geral para isso?
Tipo
StringDiretorio=“://”; // C://, D://, F::// ... n diretoriostry{DiretoriourlDiretorio=newDiretorio(diretorio);InputStreamReaderstream=newInputStreamReader(urlDiretorio,FileDiretorio=newFile("Diretorio "););}
?
Programa considere a String Diretorio = “://”; para vários diretórios e inclua sempre um novo arquivo também.
1
111aaa
Não tem como criar uma variável geral para isso?
Programa considere a String Diretorio = “://”; para vários diretórios e inclua sempre um novo arquivo também.
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.io.IOException;importjava.net.URL;importjava.util.ArrayList;importjava.util.List;publicclassTeste6{publicstaticvoidmain(String[]args){try{Teste6programa=newTeste6();programa.executar();}catch(Throwablet){t.printStackTrace();}}privateList<String>linhasCopiadas;privatevoidexecutar()throwsIOException{StringDiretorio=“://”; // C://, D://, F::// ... n diretoriostry{DiretoriourlDiretorio=newDiretorio(diretorio);InputStreamReaderstream=newInputStreamReader(urlDiretorio,FileDiretorio=newFile("Diretorio "););// adicionar pasta com o nome Arq}FilearquivoDestino=newFile("Diretorio",\\new.txt);PrintWriterdestino=newPrintWriter(arquivoDestino);linhasCopiadas=newArrayList<>();for(Filearquivo:diretorio.listFiles()){BufferedReaderorigem=newBufferedReader(newFileReader(arquivo));copiar(origem,destino);destino.println();origem.close();}destino.flush();destino.close();}privatevoidcopiar(BufferedReaderorigem,PrintWriterdestino)throwsIOException{Stringlinha=null;while((linha=origem.readLine())!=null){if(!linhasCopiadas.contains(linha)){// se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// copia a linha no arquivo de destinolinhasCopiadas.add(linha);// joga a linha na lista de linhas copiadas}}destino.println();// pular linha no arquivo de destino}}
B
Bemires1 like
Estou querendo fazer a comparação antes “=” usando o split, para inserir a linha toda caso o valor da chave não seja igual, e fazer uma varredura no arquivo destino para comparar as linhas já contidas no arquivo e inserir apenas linhas novas. Estou pedindo demais, mas que sou nova na programação, agradeço desde já.
packageLer;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjava.util.List;publicclassUnificar{publicstaticvoidmain(String[]args){try{Unificarprograma=newUnificar();programa.executar();}catch(Throwablet){t.printStackTrace();}}privateList<String>linhasCopiadas;privatevoidexecutar()throwsIOException{// Pasta de origem Filediretorio=newFile("C:\\Arq");// Pasta do novo arquivo a ser criadoFilearquivoDestino=newFile("C:\\Users\\p808176\\Desktop\\Teste.txt");PrintWriterdestino=newPrintWriter(arquivoDestino);linhasCopiadas=newArrayList<>();BufferedReaderler=newBufferedReader(newFileReader(arquivoDestino));ler(BufferedReaderorigem){Stringlinha=null;while((linha=origem.readLine())!=null){chaveValor=linha.split("=");}}for(Filearquivo:diretorio.listFiles()){BufferedReaderorigem=newBufferedReader(newFileReader(arquivo));copiar(origem,destino);origem.close();}destino.flush();destino.close();}// Função que compara as linhas para não se repetirprivatevoidcopiar(BufferedReaderorigem,PrintWriterdestino)throwsIOException{Stringlinha=null;String[]chaveValor;while((linha=origem.readLine())!=null){chaveValor=linha.split("=");// System.out.println(chaveValor[0]);// System.out.println(chaveValor[1]);if(!linhasCopiadas.contains(chaveValor[0])){// Se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// Copia a linha no arquivo de destinolinhasCopiadas.add(chaveValor[0]);// Joga a linha na lista de linhas copiadas}}}privatevoidler(BufferedReaderdestino){try{while(destino.ready()){linhasCopiadas.add(destino.readLine());}}catch(IOExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.io.IOException;importjava.net.URL;importjava.util.ArrayList;importjava.util.List;publicclassTeste6{publicstaticvoidmain(String[]args){try{Teste6programa=newTeste6();programa.executar();}catch(Throwablet){t.printStackTrace();}}privateList<String>linhasCopiadas;privatevoidexecutar()throwsIOException{String[]diretorios=newString[]{"://","C://","D://","F://");for(Stringdir:diretorios){FilearquivoDestino=newFile("Diretorio",\\new.txt);PrintWriterdestino=newPrintWriter(arquivoDestino);linhasCopiadas=newArrayList<>();for(Filearquivo:diretorio.listFiles()){BufferedReaderorigem=newBufferedReader(newFileReader(arquivo));copiar(origem,destino);destino.println();origem.close();}destino.flush();destino.close();}privatevoidcopiar(BufferedReaderorigem,PrintWriterdestino)throwsIOException{Stringlinha=null;while((linha=origem.readLine())!=null){if(!linhasCopiadas.contains(linha)){// se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// copia a linha no arquivo de destinolinhasCopiadas.add(linha);// joga a linha na lista de linhas copiadas}}destino.println();// pular linha no arquivo de destino}}}
B
Bemires1 like
Bom dia, como ficaria esse código com uma busca por aquivos com o mesmo nome, e a comparação dentro desses arquivos sendo feita apenas com a chave das linhas contidas nesses arquivos, como nesse exemplo que eu respondi por ultimo.
Exemplo de informações que estão no arquivo
chave = valor
desenvolvi esse código, mas não esta lendo as informações que já estão no aquivo de destino e esta apagando e parece que esta esta copiando para o arquivo de destino apenas as linha que são diferentes entre todos arquivos
packageLer;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassUnificar{publicstaticvoidmain(String[]args)throwsIOException{ProcurarArquivose=newProcurarArquivos();// Aruivos a serem procuradosList<String>extensions=Arrays.asList(newString[]{"ApplicationResources.properties"});Unificarprog=newUnificar();// Caminho onde vai ser procurarList<File>files=e.listFiles(newFile("c:\\"),extensions);for(Filef:files){BufferedReaderarquivoFile=newBufferedReader(newFileReader(f));prog.modifica(arquivoFile);// System.out.println(f.getAbsolutePath());}try{Unificarprograma=newUnificar();programa.executar();}catch(Throwablet){t.printStackTrace();}}publicList<File>listFiles(Filedirectory){List<File>files=newArrayList<File>();listFiles(files,directory);returnfiles;}privatevoidlistFiles(List<File>files,Filedirectory){File[]filesAndSubdirectories=directory.listFiles();if(filesAndSubdirectories!=null){for(Filefile:filesAndSubdirectories){if(file.isDirectory()){listFiles(files,file);}else{files.add(file);}}}}privateList<String>linhasCopiadas;privatevoidexecutar()throwsIOException{}// Função que compara as linhas para não se repetirprivatevoidcopiar(BufferedReaderorigem,PrintWriterdestino)throwsIOException{Stringlinha=null;String[]chaveValor;while((linha=origem.readLine())!=null){chaveValor=linha.split("=");// System.out.println(chaveValor[0]);// System.out.println(chaveValor[1]);if(!linhasCopiadas.contains(chaveValor[0])){// Se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// Copia a linha no arquivo de destinolinhasCopiadas.add(chaveValor[0]);// Joga a linha na lista de linhas copiadas}}}privatevoidler(BufferedReaderarquivoDestino){try{while(arquivoDestino.ready()){linhasCopiadas.add(arquivoDestino.readLine());}}catch(IOExceptione){e.printStackTrace();}}privatebooleanendsWith(Filefilename,List<String>extensions){Stringname=filename.getName();for(Stringext:extensions){if(name.toLowerCase().endsWith(ext.toLowerCase()))returntrue;}returnfalse;}publicList<File>listFiles(Filedirectory,List<String>extensions){List<File>files=newArrayList<File>();listFiles(files,directory,extensions);returnfiles;}privatevoidlistFiles(List<File>files,Filedirectory,List<String>extensions){File[]filesAndSubdirectories=directory.listFiles();if(filesAndSubdirectories!=null){for(Filefile:filesAndSubdirectories){if(file.isDirectory()){listFiles(files,file,extensions);}else{if(endsWith(file,extensions)){files.add(file);}}}}}publicvoidmodifica(BufferedReaderorigem)throwsIOException{FilearquivoDestino=newFile("C:\\Users\\p808176\\Desktop\\Teste.txt");PrintWriterdestino=newPrintWriter(arquivoDestino);// PrintWriter arquivo = new PrintWriter(diretorio);linhasCopiadas=newArrayList<>();BufferedReaderler=newBufferedReader(newFileReader(arquivoDestino));// BufferedReader origem = new BufferedReader(new// FileReader(diretorio));// Lendo o arquivo deler(ler);Stringlinha=null;String[]chaveValor;while((linha=ler.readLine())!=null){chaveValor=linha.split("=");if(!linhasCopiadas.contains(chaveValor[0])){// Se a linha ainda não foi copiada pro arquivo de destinodestino.println(linha);// Copia a linha no arquivo de destinolinhasCopiadas.add(chaveValor[0]);// Joga a linha na lista de linhas copiadas}}copiar(origem,destino);origem.close();destino.flush();destino.close();}}
B
Bemires1 like
Desenvolvi um pouco mais o código mas agora ele esta copiando linhas iguais. e tenho que compara primeiro o valor antes do “=” e se for diferente acrescenta ao arquivo se for igual faz a comparação com o valor depois do “=” se for igual não acrescenta se for diferente acrescenta no arquivo adicionado mais um comentário na linha para identificação depois do arquivo pronto.
packageUnificar;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.io.Writer;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/** * @author p808176 * */publicclassUnificar{publicstaticvoidmain(String[]args)throwsIOException{ProcurarArquivose=newProcurarArquivos();// Nome dos arquivos a serem procuradosList<String>extensions=Arrays.asList(newString[]{"ApplicationResources.properties"});Unificarprog=newUnificar();// Caminho onde vai ser procurarList<File>files=e.listFiles(newFile("C:\\powerlogic\\workspaces\\workspace_producao"),extensions);for(Filef:files){if(!f.getAbsoluteFile().toString().contains("classes")){BufferedReaderarquivoFile=newBufferedReader(newFileReader(f));prog.modifica(arquivoFile);// Ira printar os caminhos dos arquivos encontradosSystem.out.println(f.getAbsolutePath());}}System.out.println("Arquivo de unificação feito com sucesso");try{Unificarprograma=newUnificar();programa.executar();}catch(Throwablet){t.printStackTrace();}}privateList<String>linhasCopiadas;voidexecutar()throwsIOException{}privatevoidler(BufferedReaderarquivoDestino){try{Stringlinha="";while((linha=arquivoDestino.readLine())!=null){linhasCopiadas.add(linha);}}catch(IOExceptione){e.printStackTrace();}}publicvoidmodifica(BufferedReaderfiles)throwsIOException{FilearquivoDestino=newFile("C:\\Users\\p808176\\Desktop\\Teste.txt");Writerdestino=newBufferedWriter(newFileWriter(arquivoDestino,true));linhasCopiadas=newArrayList<>();BufferedReaderler=newBufferedReader(newFileReader(arquivoDestino));// Lendo o arquivo de Destino e acrescentar apenas valores diferentesler(ler);Stringlinha=null;String[]chaveValor;StringnewLine=System.getProperty("line.separator");while((linha=files.readLine())!=null){chaveValor=linha.split("=");if(linhasCopiadas.contains(chaveValor[0])){// Se a linha ainda não foi copiada pro arquivo de destinodestino.write(newLine+linha);// Copia a linha no arquivo de destinolinhasCopiadas.add(chaveValor[0]);// Joga a linha na lista de linhas copiadas}}files.close();destino.flush();destino.close();}}packageUnificar;importjava.io.File;importjava.util.ArrayList;importjava.util.List;publicclassProcurarArquivos{publicList<File>listFiles(Filedirectory){List<File>files=newArrayList<File>();listFiles(files,directory);returnfiles;}privatevoidlistFiles(List<File>files,Filedirectory){File[]filesAndSubdirectories=directory.listFiles();if(filesAndSubdirectories!=null){for(Filefile:filesAndSubdirectories){if(file.isDirectory()){listFiles(files,file);}else{files.add(file);}}}}privatebooleanendsWith(Filefilename,List<String>extensions){Stringname=filename.getName();for(Stringext:extensions){if(name.toLowerCase().endsWith(ext.toLowerCase()))returntrue;}returnfalse;}publicList<File>listFiles(Filedirectory,List<String>extensions){List<File>files=newArrayList<File>();listFiles(files,directory,extensions);returnfiles;}privatevoidlistFiles(List<File>files,Filedirectory,List<String>extensions){File[]filesAndSubdirectories=directory.listFiles();if(filesAndSubdirectories!=null){for(Filefile:filesAndSubdirectories){if(file.isDirectory()){listFiles(files,file,extensions);}else{if(endsWith(file,extensions)){files.add(file);}}}}}}
1
111aaa
Já pensou em criar uma interface com uma barra de progresso para mostrar os arquivos que foram copiados de diretório em diretório?
1
111aaa
Seria melhor criar uma interface com uma barra de progresso para mostrar os arquivos que foram copiados de diretório em diretório?