文件拷贝方法
package top.my.test.case1; 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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2015-07-24 爬虫获取邮箱,存入数据库,发送邮件java Mail