import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class FileCopyTest {
public static void main(String[] args) {
// 文件大小为4.5G
System.out.println(System.currentTimeMillis());
// 1595581151315 -- 1595581253196 = 101881ms = 101s
// copyFile(new File("D:\\xl\\big.mkv"), new File("D:\\big.mkv"));
// 1595582378585 -- 1595582548529 = 169944ms = 169s
// fileChannelCopy(new File("D:\\xl\\big.mkv"), new File("D:\\big2.mkv"));
// 1595582683903 -- 1595582805496 = 121593ms = 121s
// fileCopy(new File("D:\\xl\\big.mkv"), new File("D:\\big2.mkv"));
// 1595583767345 -- 1595583897985 = 130640ms = 130s
// filesCopy(new File("D:\\xl\\big.mkv"), new File("D:\\big2.mkv"));
//1595584222455 -- 1595584325169 = 102714ms = 102s
copyBigFile(new File("D:\\xl\\big.mkv"), new File("D:\\big.mkv"));
System.out.println(System.currentTimeMillis());
}
// 单文件复制
public static boolean copyFile(File fromFile, File toFile) {
try (FileInputStream in = new FileInputStream(fromFile); FileOutputStream os = new FileOutputStream(toFile);) {
byte[] b = new byte[1024];
int n = 0;
while ((n = in.read(b)) != -1) {
os.write(b, 0, n);
}
in.close();
os.close();
System.out.println("文件拷贝结束");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static boolean filesCopy(File s, File t) {
Path sourcePath = Paths.get(s.getAbsolutePath());
Path destinationPath = Paths.get(t.getAbsolutePath());
try {
Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
return true;
} catch (IOException e) {
// something else went wrong
e.printStackTrace();
}
return false;
}
public static boolean fileCopy(File s, File t) {
FileInputStream fi = null;
FileOutputStream fo = null;
FileChannel in = null;
FileChannel out = null;
try {
fi = new FileInputStream(s);
fo = new FileOutputStream(t);
in = fi.getChannel();// 得到对应的文件通道
out = fo.getChannel();// 得到对应的文件通道
long left_size = in.size();
System.out.println("源文件大小:" + left_size / 1024 / 1024);
long position = 0;
while (left_size > 0) {
long write_size = in.transferTo(position, left_size, out);
position += write_size;
left_size -= write_size;
}
// in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
System.out.println("FileChannel文件拷贝结束");
System.out.println("目标文件大小:" + out.size() / 1024 / 1024);
return true;
} catch (IOException e) {
System.out.print("文件出现拷贝异常:{}" + e.getMessage());
;
} finally {
try {
fi.close();
in.close();
fo.close();
out.close();
} catch (IOException e) {
System.out.print("文件出现拷贝异常:{}" + e.getMessage());
}
}
return false;
}
public static boolean fileChannelCopy(File s, File t) {
FileChannel in = null;
FileChannel out = null;
RandomAccessFile fi = null;
RandomAccessFile fo = null;
try {
if (!t.isFile()) {
if (!t.createNewFile()) {
return false;
}
}
fi = new RandomAccessFile(s, "r");
fo = new RandomAccessFile(t, "rw");
in = fi.getChannel();// 得到对应的文件通道
out = fo.getChannel();// 得到对应的文件通道
long left_size = in.size();
long position = 0;
while (left_size > 0) {
long write_size = in.transferTo(position, left_size, out);
position += write_size;
left_size -= write_size;
}
// in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
System.out.println("FileChannel文件拷贝结束");
return true;
} catch (IOException e) {
System.out.print("文件出现拷贝异常:{}" + e.getMessage());
;
} finally {
try {
fi.close();
in.close();
fo.close();
out.close();
} catch (IOException e) {
System.out.print("文件出现拷贝异常:{}" + e.getMessage());
}
}
return false;
}
public static boolean copyBigFile(File s, File t) {
FileInputStream fi = null;
FileOutputStream fo = null;
FileChannel in = null;
FileChannel out = null;
ByteBuffer buffer = ByteBuffer.allocate(10 * 1024);
try {
fi = new FileInputStream(s);
fo = new FileOutputStream(t);
in = fi.getChannel();// 得到对应的文件通道
out = fo.getChannel();// 得到对应的文件通道
while (true) {
int read = in.read(buffer);
if (read == -1)
break;
buffer.flip();
out.write(buffer);
buffer.clear();
}
System.out.println("ByteBuffer文件拷贝结束");
return true;
} catch (IOException e) {
System.err.print("文件出现拷贝异常:{}" + e.getMessage());
} finally {
try {
fi.close();
in.close();
fo.close();
out.close();
} catch (IOException e) {
System.err.print("文件出现拷贝异常:{}" + e.getMessage());
}
}
return false;
}
}