Estou com uma dúvida, quase em todos os lugares que pesquisei falou que a implementação da copia de arquivo com a API Java NIO, é mais performática, mas no meu caso está sendo bem mais lenta.
Segue abaixo, os códigos que usei como teste :
public static void moverArquivo(String fileOrigem, String fileDestino) {
try {
File origem = new File(fileOrigem);
File destino = new File(fileDestino);
if (!new File(destino.getParent()).exists()) {
destino.mkdirs();
}
destino.delete();
origem.renameTo(destino);
origem = null;
} catch (Exception e) {
System.out.println(e);
}
}
public static boolean copyFile(String inFile, String outFile) {
InputStream is = null;
OutputStream os = null;
byte[] buffer;
boolean success = true;
File fileEntrada = new File(inFile);
try {
is = new FileInputStream(fileEntrada);
os = new FileOutputStream(outFile);
buffer = new byte[is.available()];
is.read(buffer);
os.write(buffer);
} catch (IOException e) {
success = false;
} catch (OutOfMemoryError e) {
success = false;
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
}
}
if (success) {
fileEntrada.delete();
}
return success;
}
Com está implementação consegui copiar um arquivo de 3 KB em 2 milisegundo.
public static void copyFile2(String srcFileName, String dstFileName) {
try {
// Create channel on the source
FileChannel srcChannel = new FileInputStream(srcFileName)
.getChannel();
// Create channel on the destination
FileChannel dstChannel = new FileOutputStream(dstFileName)
.getChannel();
// Copy file contents from source to destination
dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
// Close the channels
srcChannel.close();
dstChannel.close();
} catch (IOException e) {
System.out.println("Falha na copia de arquivo 2 " + e);
}
}
Com está implementação consegui copiar um arquivo de 3 KB em 26 milisegundo.
Estou fazendo alguma coisa errada, que não estou utilizando correto a classe NIO.
O buffer de BufferedOutputStream é 8KB.