Most file copying in
Java uses either FileInputStream and FileOutputStream, or FileChannels. Etiher way, the methods you will use allow you to limit the mximum number of bytes to transfer at one time. Consider making this a configurable parameter, max.transfer.block.size or whatever, which can be read from a properties file. Another parameter might be transfer.block.delay.time, the time you're required to sleep between blocks. So depending on how you configure it, a transfer of 1000000 bytes might be done as 10 transfers of 100000-byte blocks, with 0.5 seconds of delay between blocks. Or it might be done as 100 transfers of 10000-byte blocks, with a different delay. Or 500 transfers of 2000 bytes. Whatever. Let the person running the program adjust the parameters until they find a combination that works well on their system.
Using this plan, it may be better to sleep for transfer.block.delay.time milliseconds
before each block, including the first one - not afterwards. Otherwise it would be possible for a large number of small copy jobs to swamp the system, keeping it very busy with no sleeping.
Also, I once solved a similar problem simply by inserting a call to Thread.yield() after each block, with no sleep(). In many cases this may have no effect, but on systems it may be exactly what you need. Give it a try, at least.