Código que cópia as informações de vários arquivos TXT para um so arquivo em java

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

package Ler;

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

public class Teste6 {

public Teste6() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
File diretorio = new File("C:\\Arq\\");
File arquivo = null;
File[] arquivos = null;
FileReader fr = null;
BufferedReader br = null;

String linha = "";
File arquivoDestino = new File("C:\\Arq\\new.txt");
FileOutputStream fos = null;
try {
// if (diretorio.isDirectory()) {
arquivos = diretorio.listFiles();
for (int i = 0; i < arquivos.length; i++) {
arquivo = arquivos[i];
}
fr = new FileReader(arquivo);
br = new BufferedReader(fr);
fos = new FileOutputStream(arquivoDestino);
while ((linha = br.readLine()) != null) {
fos.write(linha.getBytes());
}

// }

fos.write("\n".getBytes());
fos.close();
} catch (FileNotFoundException fnex) {
fnex.printStackTrace();
} catch (IOException ioex) {
ioex.printStackTrace();
}
}
}
1 curtida

Essa API tem varias ferramnetas para TXT: https://github.com/MatheusMarkies/Java-Utilities
Veja se encaixa em seu projeto.

       File File = null;
        File file = null;
        
        int index = TXTUtilities.TXTIA.GetTXTLineIndex.Get_TXT_File_LineIndex(File);//pegar numero de linhas do txt
        
        ArrayList<String> content = TXTUtilities.ReadTXT.Read_TXT_File(File, index);//File = txt que vc quer ler | index = numero de linhas
        
        String[] Content_Array = new String[content.size()];
        
        TXTUtilities.CreateTXT.CreateTXTFile(file);
        
        for(int i = 0;i<content.size();i++){
        Content_Array[i] = content.get(i);//Converter List para Array
        }
        
        TXTUtilities.WriteTXT.Write_Array_TXT_File(file, Content_Array);//file = SEU TXT | content = Array contendo seus textos.
1 curtida

Sou um leigo no assunto java, não entendi como ficaria essa implementação em meu código. Poderia me ajudar?

1 curtida

Exemplo:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

public class Teste6 {

    public static void main(String[] args) {
        try {
            Teste6 programa = new Teste6();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private void executar() throws IOException {
        File diretorio = new File("C:\\Arq\\");
        File arquivoDestino = new File("C:\\Arq\\new.txt");
        OutputStream destino = new FileOutputStream(arquivoDestino);
        PrintWriter writer = new PrintWriter(arquivoDestino);
        for (File arquivo : diretorio.listFiles()) {
            FileInputStream origem = new FileInputStream(arquivo);
            copiar(origem, destino); // copiar conteúdo do arquivo de origem para o arquivo de destino
            writer.println(); // pular linha no arquiv de destino
            origem.close();
        }
        destino.flush();
        writer.flush();
        destino.close();
        writer.close();
    }

    private void copiar(InputStream origem, OutputStream destino) throws IOException {
        byte[] bytes = new byte[8192];
        for (int lidos = -1; (lidos = origem.read(bytes)) != -1; destino.write(bytes, 0, lidos)) { /* corpo vazio mesmo */ }
    }
}
1 curtida

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?

1 curtida

E porque não conseguiria?

Exemplo:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class Teste6 {

    public static void main(String[] args) {
        try {
            Teste6 programa = new Teste6();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private List<String> linhasCopiadas;

    private void executar() throws IOException {
        File diretorio = new File("C:\\Arq\\");
        File arquivoDestino = new File("C:\\Arq\\new.txt");
        PrintWriter destino = new PrintWriter(arquivoDestino);
        linhasCopiadas = new ArrayList<>();
        for (File arquivo : diretorio.listFiles()) {
            BufferedReader origem = new BufferedReader(new FileReader(arquivo));
            copiar(origem, destino);
            destino.println();
            origem.close();
        }
        destino.flush();
        destino.close();
    }

    private void copiar(BufferedReader origem, PrintWriter destino) throws IOException {
        String linha = null;
        while ((linha = origem.readLine()) != null) {
            if (!linhasCopiadas.contains(linha)) { // se a linha ainda não foi copiada pro arquivo de destino
                destino.println(linha); // copia a linha no arquivo de destino
                linhasCopiadas.add(linha); // joga a linha na lista de linhas copiadas
            }
        }
        destino.println(); // pular linha no arquivo de destino
    }
}
1 curtida

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?

1 curtida

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?

1 curtida

Dá uma lida na documentação dos construtores da classe FileOutputStream

1 curtida

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

package Unificar;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class Unificar {

    public static void main(String[] args) {
        try {
            Unificar programa = new Unificar();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private List<String> linhasCopiadas;

    private void executar() throws IOException {
        File diretorio = new File("C:\\Arq"); // Pasta de origem 
        File arquivoDestino = new File("C:\\Users\\Belmires\\Desktop\\Teste.txt"); // Pasta do novo arquivo criado
        PrintWriter destino = new PrintWriter(arquivoDestino);
        linhasCopiadas = new ArrayList<>();
        BufferedReader ler = new BufferedReader(new FileReader(arquivoDestino));
        ler(){
            
        
        }
        
        for (File arquivo : diretorio.listFiles()) {
            BufferedReader origem = new BufferedReader(new FileReader(arquivo));
            copiar(origem, destino);
            origem.close();
        }
        destino.flush();
        destino.close();
    }
//            Função que compara as linhas
    private void copiar(BufferedReader origem, PrintWriter destino) throws IOException {
        String linha = null;
        while ((linha = origem.readLine()) != null) {
            if (!linhasCopiadas.contains(linha)) { // Se a linha ainda não foi copiada pro arquivo de destino
                destino.println(linha); // Copia a linha no arquivo de destino
                linhasCopiadas.add(linha); // Joga a linha na lista de linhas copiadas
            }
        }
    }
    
    private void ler (BufferedReader destino){
        try {
            while (destino.ready()){
                linhasCopiadas.add(destino.readLine());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}
identar texto pré-formatado por 4 espaços
1 curtida

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:" ...); ?

Acho que você teria que criar mais variáveis com os outros diretórios

1 curtida

Não tem como criar uma variável geral para isso?

Tipo

String Diretorio = “://”; // C://, D://, F::// ... n diretorios

try {
Diretorio urlDiretorio  = new Diretorio (diretorio );
InputStreamReader stream = new InputStreamReader(urlDiretorio, File Diretorio  = new File("Diretorio "); );
}

?

Programa considere a String Diretorio = “://”; para vários diretórios e inclua sempre um novo arquivo também.

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.


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class Teste6 {

    public static void main(String[] args) {
        try {
            Teste6 programa = new Teste6();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private List<String> linhasCopiadas;

    private void executar() throws IOException {
String Diretorio = “://”; // C://, D://, F::// ... n diretorios

try {
Diretorio urlDiretorio  = new Diretorio (diretorio );
InputStreamReader stream = new InputStreamReader(urlDiretorio, File Diretorio  = new File("Diretorio "); ); // adicionar pasta com o nome Arq

}
        File arquivoDestino = new File("Diretorio", \\new.txt);
        PrintWriter destino = new PrintWriter(arquivoDestino);
        linhasCopiadas = new ArrayList<>();
        for (File arquivo : diretorio.listFiles()) {
            BufferedReader origem = new BufferedReader(new FileReader(arquivo));
            copiar(origem, destino);
            destino.println();
            origem.close();
        }
        destino.flush();
        destino.close();
    }

    private void copiar(BufferedReader origem, PrintWriter destino) throws IOException {
        String linha = null;
        while ((linha = origem.readLine()) != null) {
            if (!linhasCopiadas.contains(linha)) { // se a linha ainda não foi copiada pro arquivo de destino
                destino.println(linha); // copia a linha no arquivo de destino
                linhasCopiadas.add(linha); // joga a linha na lista de linhas copiadas
            }
        }
        destino.println(); // pular linha no arquivo de destino
    }
}

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á.

package Ler;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class Unificar {

    public static void main(String[] args) {
        try {
        	Unificar programa = new Unificar();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private List<String> linhasCopiadas;

    private void executar() throws IOException {
    	
    	// Pasta de origem 
        File diretorio = new File("C:\\Arq"); 
        
        // Pasta do novo arquivo a ser criado
        File arquivoDestino = new File("C:\\Users\\p808176\\Desktop\\Teste.txt"); 
        PrintWriter destino = new PrintWriter(arquivoDestino);
        linhasCopiadas = new ArrayList<>();
        
      BufferedReader ler = new BufferedReader(new FileReader(arquivoDestino));
      ler(BufferedReader origem){
          String linha = null;

          while ((linha = origem.readLine()) != null) {
          	chaveValor = linha.split("=");
          }
      }
        
        
        for (File arquivo : diretorio.listFiles()) {
            BufferedReader origem = new BufferedReader(new FileReader(arquivo));
            copiar(origem, destino);
            origem.close();
        }
        destino.flush();
        destino.close();
    }
//    		Função que compara as linhas para não se repetir
    private void copiar(BufferedReader origem, PrintWriter destino) throws IOException {
        String linha = 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 destino
                destino.println(linha); // Copia a linha no arquivo de destino
                linhasCopiadas.add(chaveValor[0]); // Joga a linha na lista de linhas copiadas
            }
        }
    }
 
  private void ler (BufferedReader destino){
	try {
		while (destino.ready()){
			linhasCopiadas.add(destino.readLine());
		}
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();

	}
  }
}
1 curtida

Seria possível implementar com esse código diretórios "dinâmicos"
A resposta obtida pode ser encontrada em: Como utilizar uma variável para vários diretórios?

  String[] diretorios = new String[] {"://", "C://", "D://", "F://");

    for(String dir : diretorios) {
// Código de processamento
 }

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class Teste6 {

    public static void main(String[] args) {
        try {
            Teste6 programa = new Teste6();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private List<String> linhasCopiadas;

    private void executar() throws IOException {
    
    String[] diretorios = new String[] {"://", "C://", "D://", "F://");

    for(String dir : diretorios) {
        File arquivoDestino = new File("Diretorio", \\new.txt);
        PrintWriter destino = new PrintWriter(arquivoDestino);
        linhasCopiadas = new ArrayList<>();
        for (File arquivo : diretorio.listFiles()) {
            BufferedReader origem = new BufferedReader(new FileReader(arquivo));
            copiar(origem, destino);
            destino.println();
            origem.close();
        }
        destino.flush();
        destino.close();
    }

    private void copiar(BufferedReader origem, PrintWriter destino) throws IOException {
        String linha = null;
        while ((linha = origem.readLine()) != null) {
            if (!linhasCopiadas.contains(linha)) { // se a linha ainda não foi copiada pro arquivo de destino
                destino.println(linha); // copia a linha no arquivo de destino
                linhasCopiadas.add(linha); // joga a linha na lista de linhas copiadas
            }
        }
        destino.println(); // pular linha no arquivo de destino
}

    }
}

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

package Ler;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Unificar {

public static void main(String[] args) throws IOException {
    ProcurarArquivos e = new ProcurarArquivos();
    // Aruivos a serem procurados
    List<String> extensions = Arrays.asList(new String[] { "ApplicationResources.properties" });
    Unificar prog = new Unificar();
    // Caminho onde vai ser procurar
    List<File> files = e.listFiles(new File("c:\\"), extensions);
    for (File f : files) {
        BufferedReader arquivoFile = new BufferedReader(new FileReader(f));
        prog.modifica(arquivoFile);
//            System.out.println(f.getAbsolutePath());

    }

    try {
        Unificar programa = new Unificar();
        programa.executar();
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

public List<File> listFiles(File directory) {
    List<File> files = new ArrayList<File>();
    listFiles(files, directory);
    return files;
}

private void listFiles(List<File> files, File directory) {
    File[] filesAndSubdirectories = directory.listFiles();
    if (filesAndSubdirectories != null) {
        for (File file : filesAndSubdirectories) {
            if (file.isDirectory()) {
                listFiles(files, file);
            } else {
                files.add(file);
            }
        }
    }
}

private List<String> linhasCopiadas;

private void executar() throws IOException {

}

// Função que compara as linhas para não se repetir
private void copiar(BufferedReader origem, PrintWriter destino)
        throws IOException {
    String linha = 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 destino
            destino.println(linha); // Copia a linha no arquivo de destino
            linhasCopiadas.add(chaveValor[0]); // Joga a linha na lista de linhas copiadas
        }
    }
}

private void ler(BufferedReader arquivoDestino) {
    try {
        while (arquivoDestino.ready()) {
            linhasCopiadas.add(arquivoDestino.readLine());
        }
    } catch (IOException e) {
        e.printStackTrace();

    }
}

private boolean endsWith(File filename, List<String> extensions) {
    String name = filename.getName();
    for (String ext : extensions) {
        if (name.toLowerCase().endsWith(ext.toLowerCase()))
            return true;
    }
    return false;
}

public List<File> listFiles(File directory, List<String> extensions) {
    List<File> files = new ArrayList<File>();
    listFiles(files, directory, extensions);
    return files;
}

private void listFiles(List<File> files, File directory,
        List<String> extensions) {
    File[] filesAndSubdirectories = directory.listFiles();
    if (filesAndSubdirectories != null) {
        for (File file : filesAndSubdirectories) {
            if (file.isDirectory()) {
                listFiles(files, file, extensions);
            } else {
                if (endsWith(file, extensions)) {
                    files.add(file);
                }
            }
        }
    }
}

public void modifica(BufferedReader origem) throws IOException {

    File arquivoDestino = new File("C:\\Users\\p808176\\Desktop\\Teste.txt");
    PrintWriter destino = new PrintWriter(arquivoDestino);
    // PrintWriter arquivo = new PrintWriter(diretorio);
    linhasCopiadas = new ArrayList<>();
    BufferedReader ler = new BufferedReader(new FileReader(arquivoDestino));
    // BufferedReader origem = new BufferedReader(new
    // FileReader(diretorio));

    // Lendo o arquivo de
    ler(ler);
    String linha = 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 destino
            destino.println(linha); // Copia a linha no arquivo de destino
            linhasCopiadas.add(chaveValor[0]); // Joga a linha na lista de linhas copiadas
        }
    }

    copiar(origem, destino);
    origem.close();

    destino.flush();
    destino.close();
}

}
1 curtida

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.

package Unificar;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author p808176
 *
 */
public class Unificar {

	public static void main(String[] args) throws IOException {
		ProcurarArquivos e = new ProcurarArquivos();
		// Nome dos arquivos a serem procurados
		List<String> extensions = Arrays.asList(new String[] { "ApplicationResources.properties" });
		Unificar prog = new Unificar();
		// Caminho onde vai ser procurar
		List<File> files = e.listFiles(new File("C:\\powerlogic\\workspaces\\workspace_producao"), extensions);
		for (File f : files) {
			if(!f.getAbsoluteFile().toString().contains("classes")){
				BufferedReader arquivoFile = new BufferedReader(new FileReader(f));
				prog.modifica(arquivoFile);
				
			// Ira printar os caminhos dos arquivos encontrados
				System.out.println(f.getAbsolutePath());
		}
		}
		System.out.println("Arquivo de unificação feito com sucesso");
		try {
			Unificar programa = new Unificar();
			programa.executar();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private List<String> linhasCopiadas;

	void executar() throws IOException {

	}

	private void ler(BufferedReader arquivoDestino) {
		try {
			String linha = "";
			while ((linha = arquivoDestino.readLine()) != null) {
				linhasCopiadas.add(linha);
			}
		} catch (IOException e) {
			e.printStackTrace();

		}
	}


	public void modifica(BufferedReader files) throws IOException {

		File arquivoDestino = new File("C:\\Users\\p808176\\Desktop\\Teste.txt");
		Writer destino = new BufferedWriter(new FileWriter(arquivoDestino, true));
		linhasCopiadas = new ArrayList<>();
		BufferedReader ler = new BufferedReader(new FileReader(arquivoDestino));


		// Lendo o arquivo de Destino e acrescentar apenas valores diferentes
		ler(ler);
		String linha = null;
		String[] chaveValor;
		String newLine = 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 destino
				destino.write(newLine+linha); // Copia a linha no arquivo de destino
				linhasCopiadas.add(chaveValor[0]); // Joga a linha na lista de linhas copiadas
			}

		}
		files.close();
		destino.flush();
		destino.close();
	}

}
          
package Unificar;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ProcurarArquivos {

    public List<File> listFiles(File directory) {
        List<File> files = new ArrayList<File>();
        listFiles(files, directory);
        return files;
    }

    private void listFiles(List<File> files, File directory) {
        File[] filesAndSubdirectories = directory.listFiles();
        if (filesAndSubdirectories != null) {
            for (File file : filesAndSubdirectories) {
                if (file.isDirectory()) {
                    listFiles(files, file);
                } else {
                    files.add(file);
                }
            }
        }
    }

    private boolean endsWith(File filename, List<String> extensions) {
        String name = filename.getName();
        for (String ext : extensions) {
            if (name.toLowerCase().endsWith(ext.toLowerCase()))
                return true;
        }
        return false;
    }

    public List<File> listFiles(File directory, List<String> extensions) {
        List<File> files = new ArrayList<File>();
        listFiles(files, directory, extensions);
        return files;
    }

    private void listFiles(List<File> files, File directory, List<String> extensions) {
        File[] filesAndSubdirectories = directory.listFiles();
        if (filesAndSubdirectories != null) {
            for (File file : filesAndSubdirectories) {
                if (file.isDirectory()) {
                    listFiles(files, file, extensions);
                } else {
                    if (endsWith(file, extensions)) {
                        files.add(file);
                    }
                }
            }
        }
    }

}
1 curtida

Já pensou em criar uma interface com uma barra de progresso para mostrar os arquivos que foram copiados de diretório em diretório?