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

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?

Seria melhor criar uma interface com uma barra de progresso para mostrar os arquivos que foram copiados de diretório em diretório?

Seria uma boa mesmo mas como faria isso

Usa JavaFX, vou ver se implemento isso para você

Dica fera :smiley:

Algo + ou - assim


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;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class Unificar extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}