Performance Copia de Arquivo

4 respostas
H

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);
		}
	}
Com está implementação consegui copiar um arquivo de 3 KB em 1 milisegundo.
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.

4 Respostas

T

NIO para cópia de arquivos é mais eficiente para arquivos maiores (alguns MB já fazem diferença). 3KB não dão nem um cluster do disco :stuck_out_tongue: O buffer de BufferedOutputStream é 8KB.

pintofree

Amigo, acho que nao da pra ter um ideia real do potencial de cada um com apenas um teste, tente usar arquivos de formatos variados, e tamanhos variados, tipo em megas para ver a longo prazo qual se sai melhor. vou efetuar uns testes aqui tambem a hora que desocupar. ok falows

H

Entendi, o porque do meu teste os meus arquivos são em formato binário, e nunca ultrapassam o tamanho de 100 KB, mas o que acontece, é que a quantidade de arquivos podem chegar na casa dos milhões.

Por isso estava procurando um método mais eficiente para copiar arquivos, no menor tempo possível, o comando rename da classe java.io.File é o que tem tido mais performance.

Obrigado pela ajuda

P

hugov:
Entendi, o porque do meu teste os meus arquivos são em formato binário, e nunca ultrapassam o tamanho de 100 KB, mas o que acontece, é que a quantidade de arquivos podem chegar na casa dos milhões.

Por isso estava procurando um método mais eficiente para copiar arquivos, no menor tempo possível, o comando rename da classe java.io.File é o que tem tido mais performance.

Obrigado pela ajuda

Note que no rename vc NÃO copia o arquivo !!!

Isto significa que o tempo da operação de cópia não depende do tamanho do arquivo, uma vez que é uma operação que envolve apenas a manipulação de diretórios.

Enquanto origem e destino estiverem no mesmo volume, tudo bem. Quando não estiverem, o comportamento depende da plataforma e, provavelmente, do tipo de filesystem (veja a documentação do método no Javadoc).

Criado 23 de junho de 2008
Ultima resposta 23 de jun. de 2008
Respostas 4
Participantes 4