1. 程式人生 > 實用技巧 >檔案拷貝方法

檔案拷貝方法

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; } }