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