Ler de 2 arquivos txt e gravar em outro com New IO

Tenho dois TXT: um com 6 mil linhas e outro com 2 mil(e 100 colunas cada).O maior contem todos os dados do menor.Tenho que gerar um outro arquivo sem os dados que pertencem aos dois.Tem uma coluna(ID) que é uma string que eu irei comparar no arquivo menor e se não existir no arquivo maior eu gravo a linha no terceiro arquivo.Me disseram para usar NewIO devido a velocidade(os arquivos tem 12 e 4MB), mas não entendi direito:Eu abro os dois canais de cada arquivo e leio?Alguém tem um pequeno exemplo?

Tenho um exemplo simples de como copiar o arquivo: public void copyTo(File destination) throws IOException{ boolean newFile = false; FileChannel sourceChannel = null; FileChannel destinationChannel = null; try{ if (!destination.exists()){ newFile = destination.createNewFile(); } sourceChannel = new FileInputStream(file).getChannel(); destinationChannel = new FileOutputStream(destination).getChannel(); destinationChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); } catch (IOException e){ if (newFile){ destination.delete(); } throw e; } finally{ close(sourceChannel, destinationChannel); } }

[quote=PaulH]Tenho dois TXT: um com 6 mil linhas e outro com 2 mil(e 100 colunas cada).O maior contem todos os dados do menor.Tenho que gerar um outro arquivo sem os dados que pertencem aos dois.Tem uma coluna(ID) que é uma string que eu irei comparar no arquivo menor e se não existir no arquivo maior eu gravo a linha no terceiro arquivo.Me disseram para usar NewIO devido a velocidade(os arquivos tem 12 e 4MB), mas não entendi direito:Eu abro os dois canais de cada arquivo e leio?Alguém tem um pequeno exemplo?
[/quote]

No seu caso é besteira usar NIO. Realmente besteira, já que os arquivos são suficientemente pequenos para caberem no buffer de um BufferedReader.

No seu caso, como os arquivos são realmente pequenos, você pode ler o arquivo menor na memória em um Map<String, String> onde a chave é o ID e o valor é a linha lida, e então ir lendo o arquivo maior. Se o ID não existir nesse Map, então você pode gravar a linha no terceiro arquivo.

A dica é você usar o construtor de BufferedReader e BufferedWriter passando o tamanho do buffer para ser maior que o default de 8KB. Usando 100K já é suficiente para ler bem rapidinho.

Uh?Acho que nem precisa disso, algo do tipo:

[code]
public class CopyFilesToThird {
public static void main (String[] args) throws IOException {
File arquivoMaior = new File (“maior.txt”);
File arquivoMenor = new File (“menor.txt”);
File arquivoSaida = new File (“saida.txt”);
List<String> colunasArqMenor=new ArrayList<String>();
// Carregando o arquivo Menor
BufferedReader menor = new BufferedReader(new FileReader(arquivoMenor),64*1024);
for (String linha = menor.readLine(); linha != null; linha = menor.readLine()){
String[] colunas=linha.split(";");
String codigo = colunas[0];//Coluna com ID-presumo ser a primeira
colunasArqMenor.add(codigo);
}
System.out.println(“Linhas gravadas com as colunas do arquivo menor:”+colunasArqMenor.size());
menor.close();//fecha o arquivo menor

    // Lendo o arquivo MAIOR, correlacionando com o arquivo MENOR, e escrevendo no arquivo de saída  
    BufferedReader maior = new BufferedReader(new FileReader(arquivoMaior),128*1024);  
    PrintWriter saida = new PrintWriter(new BufferedWriter(new FileWriter(arquivoSaida)));  
    int contLinha=0;	
    for (String linhaMaior = maior.readLine(); linhaMaior != null; linhaMaior = maior.readLine()) {
    	String colunas[]=linhaMaior.split(";");
    	int validador=0;           
            String codigo =colunas[0];//Coluna com ID               
            if (colunasArqMenor != null) {  
                for (String obj: colunasArqMenor) {
                	if(codigo.equals(obj)){
                		validador=1;
                	}                         
                }
                if(validador==0){
                	 saida.println(linhaMaior); // grava a linha se o codigo não bater
                	 contLinha++; 
                } 	    
            }               
    }
    System.out.println("Linhas gravadas na saída:"+contLinha);  
    saida.close();  
    maior.close();            
}    	

}[/code]
Deve resolver.

Muito Obrigado Ironlynx!Funcionou perfeitamente e foi rápido!