Copie e mova arquivos em Java, explicação e comparação de diferentes abordagens

Eu implementei uma funcionalidade de manipulação de arquivos e prestei atenção que o Java fornece várias técnicas para copiar e mover arquivos. Abaixo, você encontra trechos de código, descrevendo brevemente essas abordagens:

Abordagem # 1:

File from = new File(src.getPath());
File to = new File(dst.getPath());

from.renameTo(to);

Abordagem # 2:

FileChannel inChannel = new FileInputStream(src).getChannel();
FileChannel outChannel = new FileOutputStream(dst).getChannel();

inChannel.transferTo(0, inChannel.size(), outChannel);

Abordagem # 3:

InputStream in = getContentResolver().openInputStream(selectedImageUri);
OutputStream out = new FileOutputStream("/sdcard/wallpapers/" + wall);

byte[] buffer = new byte[1024];
int read;

while ((read = in.read(buffer)) != -1) {
    out.write(buffer, 0, read);
}

Abordagem # 4:

import static java.nio.file.StandardCopyOption.*;

Files.copy(source, target, REPLACE_EXISTING);

Todas essas abordagens funcionam, mas não consigo entender quando devo usar cada uma delas? Quais são os prós e os contras de cada um desses métodos, especialmente do ponto de vista de desempenho e confiabilidade? Existe algum cenário específico quando eu tenho que preferir uma técnica a outra?