Problemas com cópia de arquivos com FileChannel

Pessoal,

Estou tentando usar o FileChannel para mover arquivos de um diretório para outro em um mesmo drive, de uma mesma máquina. Segue um pedaço do código que estou utilizando:

FileChannel dstChannel;
FileChannel srcChannel;
    srcChannel = new FileInputStream(file).getChannel();
dstChannel = new FileOutputStream(dirBackup.getPath() + "\\" + nomeArquivo).getChannel();
dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
srcChannel.close();
dstChannel.close();

Este código roda dentro de um laço “FOR”. Os arquivos começam a serem movidos,
mas aleatoriamente o código está dando o seguinte erro:

java.io.IOException: Espaço insuficiente de armazenamento para processar este comando
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(Unknown Source)
at sun.nio.ch.FileChannelImpl.transferFromFileChannel(Unknown Source)
at sun.nio.ch.FileChannelImpl.transferFrom(Unknown Source)
at telas.FrmGerar.processaArquivos(FrmGerar.java:280)
at telas.FrmGerar.access$2(FrmGerar.java:196)
at telas.FrmGerar$3.actionPerformed(FrmGerar.java:645)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Pode parecer muito lógico que o problema seria de espaço em disco. Porém o disco onde os arquivos
estão localizados possui 200GB livre. Como disse, o erro ocorre aleatoriamente, por isso quando rodo o mesmo
código após dar o erro, funciona normalmente até que apresente o erro novamente. Os arquivos que estou
tentando mover possuem em média 1GB.

Se alguém puder ajudar.

obrigado.

Experimente ver o que ocorre se o arquivo tiver 2GB ou mais.
Dá a impressão que usar transferFrom com o terceiro parâmetro maior que 2GB deve dar esse problema. Se for isso, veja se é possível usar transferFrom com tamanhos menores, e fazer a cópia por partes. (Nunca experimentei fazer isso :stuck_out_tongue: )

Pelo que li, isto é um problema do Windows com arquivos grandes e o tipo de path utilizado, estou postando uma referencia com possiveis soluções:

http://forum.java.sun.com/thread.jspa?threadID=439695&messageID=2917510

Caros,

Dei uma olhada no forum da SUN através do link passado pelo “aleck”. Realmente estava lá a resposta que eu precisava. O problema é do Windows, que não consegue mover arquivos grandes com o FileChannel. A solução está em mover o arquivo por partes de 64MB. Utilizei o código abaixo, que realmente funciona, para realizar esse particionamento e movê-lo para onde eu queria.

                    int maxCount = (64 * 1024 * 1024) - (32 * 1024);
	        long size = srcChannel.size();
	        long position = 0;
	        while (position < size) {
	            position += srcChannel.transferTo(position, maxCount, dstChannel);
	        }

Obrigado a todos!