NUNCA use renameTo(). Método com erros

Pessoal,

O método File.renameTo() do pacote java.io tem sérios erros e opera de forma distinta de acordo com a plataforma utilizada.
Alguns exemplos:

Em Windows substitui-se o arquivo de destino se o mesmo existir.
Em Solaris as função retorna false, pois, não é permitido a substituição do arquivo.

O método NÂO copia um arquivo de uma partição para outra no LINUX.

Estes e outros problemas são relatados no link abaixo pela própria SUN (é preciso estar logado):

http://developer.java.sun.com/servlet/SessionServlet?url=/developer/bugParade/bugs/4167147.html

Resumidamente:

Bug ID: 4167147
Votes 27
Synopsis (spec) java.io.File.renameTo: Clarify spec wrt. system dependencies
Category java:classes_io
Reported Against 1.2 , 1.2fcs
Release Fixed tiger-beta
State Closed, fixed
Related Bugs 4017593
Submit Date 18-AUG-1998
Description .
Clarify the specification of the renameTo method to say that its operation is
inherently system-dependent and that, in particular, it may or may not be
atomic and it may or may not succeed if a file or directory already exists
under the target name. – xxxxx@xxxxx 8/18/1998

Sugiro dois métodos: copiar e mover. Segue abaixo os criados por mim:

/*
 * 
 * Copia Arquivo de um local para outro. Considerações:
 *   Se existir o arquivo de destino, este é sobreposto.
 *   Se não existir o diretório de destino, este é criado.
 * 
 */
public static int copiar(String original, String copia)
{
	File origem = null;
	File destino = null;

	FileInputStream fileInputStream = null;
	FileOutputStream fileOutputStream = null;

	try
	{
		origem = new File(original);
		destino = new File(copia);

		// cria  diretorio se nao existir
		if (!destino.getParentFile().exists())
			destino.getParentFile().mkdirs();

		if (destino.exists())
			destino.delete();

		fileOutputStream = new FileOutputStream(destino);
		fileInputStream = new FileInputStream(origem);

		byte[] buffer = new byte[8192];

		for (int bytes = fileInputStream.read(buffer);
			bytes >= 0;
			bytes = fileInputStream.read(buffer))
		{
			fileOutputStream.write(buffer, 0, bytes);
		}

		fileOutputStream.flush();

		return 1;
	}
	catch (Exception e)
	{
		System.out.println(
			"GerenciaArquivo:copiar:Exception" + e.getMessage());

		return 0;
	}
	finally
	{
		try
		{
			fileInputStream.close();
			fileInputStream = null;

			fileOutputStream.close();
			fileOutputStream = null;
		}
		catch (IOException e1)
		{
			System.out.println(
				"GerenciaArquivo:copiar:finally:Exception"
					+ e1.getMessage());
		}
	}
}



public static int mover(String arquivoAntigo, String arquivoNovo)
{
	File origem = null;

	try
	{
		if (copiar(arquivoAntigo, arquivoNovo) == 1)
		{
			origem = new File(arquivoAntigo);

			origem.delete();

			return 1;
		}
		else
		{
			return 0;
		}
	}
	catch (Exception e)
	{
		return 0;
	}
}

Ola

isto esta bem documentado no javadoc. o metodo faz o que o javadoc diz, entao esta tudo ok.

eu sempre uso uma classe propria pra copiar arquivos. crio buffered input/output stream e saio dando reads e writes.