Copiar todos os arquivos de uma determinada extensão de uma pasta para outra

boa noite sou iniciante em java estou com essa duvida .

Como faria para copiar todos os arquivos de uma pasta pela extensão ?

Pesquisei no forum e achei o exemplo do vini que e muito bom e funcionou legal mas apenas para a copia de um arquivo.

  public static void copiar_arquivos(File origen, File destino) throws IOException {  
     if (destino.exists())  
         destino.delete();  
  
     FileChannel sourceChannel = null;  
     FileChannel destinationChannel = null;  
  
     try {  
         sourceChannel = new FileInputStream(origen).getChannel();  
         destinationChannel = new FileOutputStream(destino).getChannel();  
         sourceChannel.transferTo(0, sourceChannel.size(),  
                 destinationChannel);  
     } finally {  
         if (sourceChannel != null && sourceChannel.isOpen())  
             sourceChannel.close();  
         if (destinationChannel != null && destinationChannel.isOpen())  
             destinationChannel.close();  
    }  
} 

mas como faria para copiar todos os arquivos .bat que estão dentro de uma determinada pasta por exemplo ?

hoje estou usando um scrip.bat para isso que esta assim

copy O:*.BAK R:\

mas como faria isso usando este exemplo do vini ou outro ?

valeu desde ja agradeço.

Olá,

Fiz um exemplo aqui rapido, vê se te ajuda, qualquer coisa é só falar :slight_smile:

Abraços,
Daniel

[code]package com.io.sample2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Scanner;

/**

  • Como faria para copiar todos os arquivos de uma pasta pela extensão ?
    */

public final class FileCopy {

private File fromDirectory;
private File toDirectory;
private String fileExtension;

public static void main(String[] args) {
	FileCopy main = new FileCopy();
	main.enterInfo();
	main.checkDirAndExtension(main.fromDirectory, main.toDirectory, main.fileExtension);
}

private void enterInfo(){
	Scanner in = new Scanner(System.in);
	System.out.println("Entre com o nome do diretorio de origem : [ex : /Users/Desktop]"); 
	fromDirectory = new File(in.nextLine());
	
	System.out.println("Entre com o nome do diretorio de destino : [ex : /Users/Desktop/test]");  
	toDirectory = new File(in.nextLine());
	
	System.out.println("Enter with file extension : [ex: .pdf]");  
	fileExtension = in.nextLine();
}


private void checkDirAndExtension(File fromDirectory , File toDirectory, String extension){

	if(fromDirectory.isDirectory() && toDirectory.isDirectory()){
		for (File file : fromDirectory.listFiles()){
			if(file.getName().endsWith(extension)){
				passFileToCopy(file, toDirectory);
			}
		}
	}
}

private void passFileToCopy(File fileTocopy, File toDirectory){
	try {
		//create a mirror file at the destination folder
		File mirrorFile = new File(toDirectory.getPath() + "/" + fileTocopy.getName());
		
		//open channels
		FileChannel sourceChannel = new FileInputStream(fileTocopy).getChannel();
		FileChannel destinationChannel = new FileOutputStream(mirrorFile).getChannel();

		//transfer bytes
		long size = sourceChannel.size();
		sourceChannel.transferTo(0, size, destinationChannel);

		System.out.println("File : " + fileTocopy.getName() + " copiado para o diretorio : " + toDirectory);	
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}    
}

}
[/code]

valeu daniel o metodo funcionou .
mas so mais uma duvida em alguns arquivos da um exeception

java.io.IOException: Map failed
	at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748)
	at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:437)
	at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510)
	at total.backup.FileCopy.passFileToCopy(FileCopy.java:66)
	at total.backup.FileCopy.checkDirAndExtension(FileCopy.java:47)
	at total.backup.FileCopy.main(FileCopy.java:26)
Caused by: java.lang.OutOfMemoryError: Map failed
	at sun.nio.ch.FileChannelImpl.map0(Native Method)
	at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745)
	... 5 more

pesquisei sobre a classe map mas não encontrei um maneira de resolver isso
o windows copia normal os arquivos.
mais valeu pela resposta rapida.

O problema acontece porque os arquivos não estão sendo fechados e os buffers estão ficando na memória, uma forma mais simples de se implementar isso seria assim:

[code=java]package me.techbot.java;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.io.OutputStream;

public class FileCopy {

public static void main(String[] args) {
	
	File source = new File("source");
	File destination = new File("destination" );
	
	copyFiles( source, destination, "txt" );
	
}

public static void copyFiles( File source, File destination, final String ending ) {
	
	FilenameFilter filter = new FilenameFilter() {
		
		@Override
		public boolean accept(File dir, String name) {
			return  name.endsWith(ending) ;
		}
		
	};
	
	File[] files = source.listFiles(filter);
	
	for ( File file : files ) {

		InputStream input = null;
		OutputStream output = null;
		
		
		try {
			input = new BufferedInputStream( new FileInputStream(file) );
			output = new BufferedOutputStream( new FileOutputStream(new File( destination, file.getName() )) );
			
			int result = -1;
			
			while ( ( result = input.read() ) != -1 ) {
				output.write( result );
			}
			
			output.flush();
			
		} catch ( Exception e ) {
			throw new RuntimeException(e);
		} finally {
		    close( input, output );
		}
		
	}
	
}

public static void close( Closeable ... items ) {
	
	for ( Closeable c : items ) {
		if ( c != null ) {
			try {
				c.close();
			} catch ( Exception e) {
				throw new RuntimeException(e);
			}
		}
	}
	
}

}[/code]

1 curtida

desculpa a demora mais valeu mauricio linhares o metodo funcionou velu mesmo