• 文件拷贝方法


    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;
        }
    
    }
  • 相关阅读:
    for 续1
    8 解决多线程对共享数据出错
    7 多线程 全局变量
    6 线程threading
    5 多进程copy文件
    4 进程间通信Queue [kjuː]
    3 进程池
    2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块
    1 多任务fork Unix/Linux/Mac
    16 pep8 编码规范
  • 原文地址:https://www.cnblogs.com/liangblog/p/13373349.html
Copyright © 2020-2023  润新知