I tried to find a way to copy large files in fastest way possible...
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; public class FastFileCopy { public static void main(String[] args) { try { String from = "..."; String to = "..."; FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to); ArrayList<Transfer> transfers = new ArrayList<>(); long position = 0, estimate; int count = 1024 * 64; boolean lastChunk = false; while (true) { if (position + count < fis.getChannel().size()) { transfers.add(new Transfer(fis, fos, position, position + count)); position += count + 1; estimate = position + count; if (estimate >= fis.getChannel().size()) { lastChunk = true; } } else { lastChunk = true; } if (lastChunk) { transfers.add(new Transfer(fis, fos, position, fis.getChannel().size())); break; } } for (Transfer transfer : transfers) { transfer.start(); } } catch (IOException ex) { ex.printStackTrace(); } } } then create this class :
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; public class Transfer extends Thread { private FileChannel inChannel = null; private FileChannel outChannel = null; private long position, count; public Transfer(FileInputStream fis, FileOutputStream fos, long position, long count) { this.position = position; this.count = count; inChannel = fis.getChannel(); outChannel = fos.getChannel(); } @Override public void run() { try { inChannel.transferTo(position, count, outChannel); } catch (IOException e) { e.printStackTrace(); } } } I tested it and the result was very very impressive... but there is a big problem, the copied file is veryyyyy larger than the current file !!!
so, please check it and help me to find the problem, thank you :))
Files.copy(source, destination)not fast enough for you? Also if the file is on a single hard drive, using more than one thread will decrease performance.Files.copy()?