Fileoutputstream, arquivo copiado fica com 0 bytes (resolvido)

boa tarde pessoal, primeiro agradeço a todos que verem meu problema com a intenção de ajudar e principalmente a akeles que ajudarem efetivamente.

eu tenho uma classe aqui chamada pela tela, que lista os arquivos de determinada pasta, copia os de determinadas extensões usando FileOutputStream usando buffer (para cada passagem de buffer eu poder atualiza a JProgressBar), depois vai nas subpastas e faz o mesmo (recursivamente). Aparentemente isso ja funciona.

o problema é que todos os arquivos exceto um deles, fica com 0 de espaço ocupado em disco… não sei pq… to dando flush e close no final… não sei pq q não funciona…

se alguem ai puder me ajudar…eu agradeceria mto… seguem os dois metodos, o que recebe os parametros e gerencia o que efetivamente é chamado a cada copia de arquivos… por favor peço que vejam e me mostrem aonde que eu to errando…

public void executa(final String[] extensoes, boolean copSubpastas, String endereco, String saida){
        File diretorio = new File(endereco);
        
        //tamanho=getFolderSize(endereco);eu devo usa essa linha na thread da janela Window
        
        //criando a pasta para onde vão os dados, caso ela não exista
        File output = new File(saida);
        
        if (!output.exists()){
            output.mkdirs();
        }
        
        FileFilter extencoes;
        File[] arquivos=null;
        for (int j=0;j<extensoes.length;j++){
        
           final int k=j; 
           extencoes = new FileFilter() { 
                public boolean accept(File f){ 
                    return f.getName().endsWith(extensoes[k]); 
                } 
            };
            arquivos = diretorio.listFiles(extencoes);
            
            for (int i=0;i<arquivos.length;i++){
                copia(arquivos[i], saida);
            }   
        }    
        

        
        // aki começa a parte de refazer o mesmo nas subpastas
        FileFilter pastas = new FileFilter() { 
            public boolean accept(File f){ 
                return f.isDirectory(); 
            } 
        };
        
        File[] subpastas = diretorio.listFiles(pastas);
        
        for (int i=0;i<subpastas.length;i++){
            //System.out.println(subpastas[i].toString());
            if (copSubpastas&&!output.getName().equals(subpastas[i].getName())){
                executa(extensoes, copSubpastas, subpastas[i].toString(), saida+"\\"+subpastas[i].getName());    
//            System.out.println("comparando:\n\n"+subpastas[i].getName());
//            System.out.println(output.getName()+"\n\n");
            }
        }
        //arquivos = diretorio.listFiles(ff).toString();     
        
    }
public void copia(File arquivo, String saida){

        FileInputStream origem = null;
        FileOutputStream destino = null;
        
        try{
                origem = new FileInputStream(arquivo);
                destino = new FileOutputStream(saida+"\\"+arquivo.getName());
                int buf = Window.bufer;//bufer é um static int da classe window, a janela, ele é iniciado com 1024

                byte[] buffer=new byte[buf];
                
                tamanho = origem.available();
                
                destino.flush();

                while(status><=tamanho){
                     origem.read(buffer);
                     destino.write(buffer);
                     
                     status+=buf;
                     System.out.println(status);
                     
                     destino.flush();
                 }
                //destino.flush();  // <--- testei aki pra ver se funcionava
                destino.close();
                
        } catch (IOException e) {
                JOptionPane.showMessageDialog(null, "erro de I/O");
        } catch (OutOfMemoryError e) {
                JOptionPane.showMessageDialog(null, "faltou memoria para efetuar a operação");
        } 
        
    }

entõ…olha os resultados, eu criei esse main só pra testa chamando o primeiro metodo:

    public static void main(String args[]){
        Transfere t=new Transfere();
        
        
        String[] aaa= new String[3];
        aaa[0]=".pdf";
        aaa[1]=".doc";
        aaa[2]=".class";

        
        t.executa(aaa, true, "C:\\Documents and Settings\\flavio\\Meus documentos\\aaa", "C:\\Documents and Settings\\flavio\\Meus documentos\\bbb");
    }

e olhem o resultado no dos, o tamanho dos arquivos:

C:\Documents and Settings\flavio\Meus documentos\aaa>dir
 O volume na unidade C não tem nome.
 O número de série do volume é C065-1D57

 Pasta de C:\Documents and Settings\flavio\Meus documentos\aaa

19/02/2008  14:09    <DIR>          .
19/02/2008  14:09    <DIR>          ..
17/10/2007  10:05            17.464 1.class
14/01/2008  12:06           181.248 1.doc
22/08/2007  17:20         1.502.800 1.pdf
17/10/2007  10:05             9.795 2.class
29/01/2008  11:35            20.992 2.doc
14/09/2007  08:51            35.783 2.pdf
15/02/2008  11:57             3.367 build.xml
09/01/2008  12:54        10.595.718 estruturas de dados.rar
08/11/2007  12:02         3.490.570 Introdução à Programação I.rar
03/01/2008  09:02            15.360 modens.xls
20/02/2008  14:33    <DIR>          novapasta
19/02/2008  14:09    <DIR>          pasta 2
19/02/2008  14:09    <DIR>          pasta3
14/02/2008  13:30            13.824 pc 2.xls
              11 arquivo(s)     15.886.921 bytes
               5 pasta(s)  7.130.439.680 bytes disponíveis

C:\Documents and Settings\flavio\Meus documentos\aaa>cd C:\Documents and Settings\flavio\Meus documentos\bbb

C:\Documents and Settings\flavio\Meus documentos\bbb>dir
 O volume na unidade C não tem nome.
 O número de série do volume é C065-1D57

 Pasta de C:\Documents and Settings\flavio\Meus documentos\bbb

21/02/2008  14:00    <DIR>          .
21/02/2008  14:00    <DIR>          ..
21/02/2008  14:00                 0 1.class
21/02/2008  14:00                 0 1.doc
21/02/2008  14:00         1.503.232 1.pdf
21/02/2008  14:00                 0 2.class
21/02/2008  14:00                 0 2.doc
21/02/2008  14:00                 0 2.pdf
21/02/2008  14:00    <DIR>          novapasta
21/02/2008  14:00    <DIR>          pasta 2
21/02/2008  14:00    <DIR>          pasta3
               6 arquivo(s)      1.503.232 bytes
               5 pasta(s)  7.130.439.680 bytes disponíveis

C:\Documents and Settings\flavio\Meus documentos\bbb>

sera q alguem ai poderia me ajudar… não sei se falta fecha o arquivo…ou o q q é…

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

class CopyFile {

	public void copyFile (File fIn, File fOut) throws IOException {
        FileInputStream fis = new FileInputStream (fIn);
        FileOutputStream fos = new FileOutputStream (fOut);
        FileChannel fcIn = fis.getChannel();
        FileChannel fcOut = fos.getChannel();
		//  Para arquivos muito grandes há problemas se usarmos transferFrom com o parâmetro "count" > 2GB.
		// Portanto, iremos fazer a transferência "em pedaços".
		long totalLength = fIn.length();
		int chunkSize = 8 * 1024 * 1024; // 8 MB de cada vez deve ser suficiente...
		long position = 0;
		long remainder = totalLength % chunkSize;
		long bytesLeft = totalLength;
		long totalWritten = 0;
		// Observe o caso do último bloco a ser escrito...
		final double mbytes_second = 1 / 1024.0 / 1024.0 * 1000.0;
		for (position = 0; position < totalLength; position += chunkSize) {
		    long bytesToWrite = Math.min (bytesLeft, chunkSize);
			fcOut.transferFrom (fcIn, position, bytesToWrite);
			totalWritten = position + bytesToWrite;
			bytesLeft -= chunkSize;
		}
        fos.close();
        fis.close();
	}

    public static void main(String[] args) throws Exception {
		(new CopyFile()).copyFile (new File (args[0]), new File (args[1]));
    }
}

ow…obrigadão tingol… funciono… eu peguei o metodo q vc me mando, editei coisa minima nele pra poder receber a string, ja que eu tava enviando a string, pra poder edita o endereço do arquivo de saida (eu recebia o nome da pasta e depois concatenava \ + o nome do arquivo dentro dessa pasta, por isso continuei trabalhando com String enão com File)…

obrigadão mesmo…

tingol, eu olhando seus comentarios em relação a transferfrom, vc tava falando que da pau ao usar o FileOutputStream no esquema de buffer igual eu tava fazendo, em arquivos muito grandes??? não intendi direito…

obrigadão mesmo pela ajuda, funciono certinhu, eu tava desde demanha tentando resolver isso e não conseguia…

se alguem precisar e buscar ta ai as alterações…

public void copia (File fIn, String fOut) throws IOException {
            
            
        FileInputStream fis = new FileInputStream (fIn);   
        FileOutputStream fos = new FileOutputStream (fOut+"\\"+fIn.getName());   
        FileChannel fcIn = fis.getChannel();   
        FileChannel fcOut = fos.getChannel();   
        //  Para arquivos muito grandes há problemas se usarmos transferFrom com o parâmetro "count" > 2GB.   
        // Portanto, iremos fazer a transferência "em pedaços".   
        long totalLength = fIn.length();   
        int chunkSize = 8 * 1024 * 1024; // 8 MB de cada vez deve ser suficiente...   
        long position = 0;   
        long remainder = totalLength % chunkSize;   
        long bytesLeft = totalLength;   
        long totalWritten = 0;   
        // Observe o caso do último bloco a ser escrito...   
        final double mbytes_second = 1 / 1024.0 / 1024.0 * 1000.0;   
        for (position = 0; position < totalLength; position += chunkSize) {   
            long bytesToWrite = Math.min (bytesLeft, chunkSize);   
            fcOut.transferFrom (fcIn, position, bytesToWrite);   
            totalWritten = position + bytesToWrite;   
            bytesLeft -= chunkSize;   
        }   
        fos.close();   
        fis.close();   
    }

na hora de chamar o metodo obviamente tb tratei a exceção… caso alguem precise…

A rotina que mandei usa java.nio, para copiar o arquivo o mais rápido possível; só que java.nio tem esse probleminha de você ter de tomar cuidado se os arquivos a serem copiados excederem 2 GB (ou seja, se o tamanho não couber em um int). O método que mandei já leva em conta esse cuidado que deve ser tomado.

intendi…

puxa, obrigado mesmo… eu vo v se do uma estudada em nio, uam vez q deve ser melhor do q io…

obrigadão de novo… =)