Copie y mueva archivos en Java, explicación y comparación de diferentes enfoques.

Implementé una funcionalidad de manipulación de archivos y presté atención a que Java proporciona múltiples técnicas para copiar y mover archivos. A continuación puede encontrar fragmentos de código, que describen brevemente estos enfoques:

Enfoque n. ° 1:

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

from.renameTo(to);

Enfoque # 2:

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

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

Enfoque n. ° 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);
}

Enfoque # 4:

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

Files.copy(source, target, REPLACE_EXISTING);

Todos estos enfoques funcionan, pero no puedo entender cuándo debo usar cada uno de ellos. ¿Cuáles son los pros y los contras de cada uno de estos métodos, especialmente desde el punto de vista del rendimiento y la fiabilidad? ¿Hay algún escenario específico cuando tengo que preferir una técnica sobre otra?

Respuestas a la pregunta(2)

Su respuesta a la pregunta