Sempre me incomodou que a única maneira de copiar um arquivo em Java envolvesse a abertura de fluxos, a declaração de um buffer, a leitura em um arquivo, o looping e a gravação no outro vapor. A web está repleta de implementações semelhantes, ainda que ligeiramente diferentes, desse tipo de solução.
Existe uma maneira melhor de permanecer dentro dos limites da linguagem Java (o significado não envolve a execução de comandos específicos do SO)? Talvez em algum pacote de utilitários de código aberto confiável, isso oculte pelo menos essa implementação subjacente e forneça uma solução de uma linha?
Respostas:
Como o kit de ferramentas menciona acima, o Apache Commons IO é o caminho a seguir, especificamente o FileUtils . copyFile () ; ele lida com todo o trabalho pesado para você.
E como um postscript, observe que as versões recentes do FileUtils (como a versão 2.0.1) adicionaram o uso do NIO para copiar arquivos; O NIO pode aumentar significativamente o desempenho da cópia de arquivos , em grande parte porque as rotinas do NIO adiam a cópia diretamente para o sistema operacional / sistema de arquivos, em vez de lidar com isso, lendo e gravando bytes na camada Java. Portanto, se você está procurando desempenho, pode valer a pena verificar se está usando uma versão recente do FileUtils.
fonte
Eu evitaria o uso de uma mega api como apache commons. Essa é uma operação simplista e incorporada ao JDK no novo pacote NIO. Ele já estava vinculado em uma resposta anterior, mas o método principal na API do NIO são as novas funções "transferTo" e "transferFrom".
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)
Um dos artigos vinculados mostra uma ótima maneira de integrar essa função ao seu código, usando o transferFrom:
Aprender NIO pode ser um pouco complicado, então você pode confiar apenas nesse mecânico antes de sair e tentar aprender NIO da noite para o dia. Pela experiência pessoal, pode ser uma coisa muito difícil de aprender se você não tiver a experiência e foi apresentado ao IO através dos fluxos java.io.
fonte
Agora, com o Java 7, você pode usar a seguinte sintaxe de tentativa com recurso:
Ou, melhor ainda, isso também pode ser realizado usando a nova classe Files introduzida no Java 7:
Bem esquisito, não é?
fonte
A classe de utilidade
Copiando um diretório ou arquivo
Movendo um diretório ou arquivo
Copiando um diretório ou arquivo recursivamente
fonte
No Java 7 é fácil ...
fonte
Para copiar um arquivo e salvá-lo no caminho de destino, você pode usar o método abaixo.
fonte
Observe que todos esses mecanismos copiam apenas o conteúdo do arquivo, não os metadados, como permissões. Portanto, se você copiar ou mover um arquivo .sh executável no linux, o novo arquivo não será executável.
Para realmente copiar ou mover um arquivo, ou seja, obter o mesmo resultado que copiar de uma linha de comando, você realmente precisa usar uma ferramenta nativa. Um script de shell ou JNI.
Aparentemente, isso pode ser corrigido no java 7 - http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html . Dedos cruzados!
fonte
A biblioteca Guava do Google também possui um método de cópia :
Aviso: se
to
representa um arquivo existente, esse arquivo será substituído pelo conteúdo defrom
. Seto
e sefrom
referir ao mesmo arquivo, o conteúdo desse arquivo será excluído.Parâmetros:
from
- o arquivo de origemto
- o arquivo de destinoLança:
IOException
- se ocorrer um erro de E / SIllegalArgumentException
- sefrom.equals(to)
fonte
Disponível como padrão no Java 7, path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ tutorial / essencial / io / copy.html
Não acredito que demoraram tanto tempo para padronizar algo tão comum e simples como a cópia de arquivos :(
fonte
Três possíveis problemas com o código acima:
É por
org.apache.tools.ant.util.ResourceUtils.copyResource
isso que é tão complicado. Observe também que, enquanto transferFrom está OK, o transferTo interrompe no JDK 1.4 no Linux (consulte a ID do bug: 5056395 ) - Jesse Glick Janfonte
Se você estiver em um aplicativo Web que já use o Spring e se não desejar incluir o Apache Commons IO para cópia simples de arquivos, poderá usar o FileCopyUtils da estrutura do Spring.
fonte
Aqui estão três maneiras de copiar facilmente arquivos com uma única linha de código!
Java7 :
java.nio.file.Files # copy
Appache Commons IO :
FileUtils # copyFile
Goiaba :
Arquivos # copy
fonte
Files.copy
utilizando apenas dois parâmetros é paraPath
aStream
. Basta adicionar o parâmetroStandardCopyOption.COPY_ATTRIBUTES
ouStandardCopyOption.REPLACE_EXISTING
paraPath
aPath
fonte
A cópia NIO com um buffer é a mais rápida de acordo com o meu teste. Veja o código de funcionamento abaixo de um projeto de teste meu em https://github.com/mhisoft/fastcopy
}
fonte
Rápido e trabalhe com todas as versões do Java e também do Android:
fonte
Um pouco atrasado para a festa, mas aqui está uma comparação do tempo necessário para copiar um arquivo usando vários métodos de cópia de arquivo. Eu segui os métodos por 10 vezes e fiz uma média. A transferência de arquivos usando fluxos de E / S parece ser o pior candidato:
Aqui estão os métodos:
A única desvantagem que vejo ao usar a classe de canal NIO é que ainda não consigo encontrar uma maneira de mostrar o progresso intermediário da cópia de arquivo.
fonte