Java 学习笔记 - 复制文件

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - 复制文件相关的知识,希望对你有一定的参考价值。

Java 学习笔记 - 复制文件

二进制方式复制

org.apache.commons.io.FileUtils 工具类

复制单个文件

    /**
     * 复制文件
     * org.apache.commons.io.FileUtils 内部封装 FileChannel 实现。
     * 对参数做了相关检查,能自动创建上级目录。默认保持修改日期。
     * @param sourceFile    源文件
     * @param targetFile   目标文件
     */
    private static void copyByApacheUtils(File sourceFile, File targetFile) 
        try 
            FileUtils.copyFile(sourceFile, targetFile);
         catch (IOException e) 
            e.printStackTrace();
        
    

递归复制整个文件夹内容

    /**
     * 递归复制整个文件夹内容
     * org.apache.commons.io.FileUtils 内部封装 FileChannel 实现。
     * 对参数做了相关检查,能自动创建上级目录。默认保持修改日期。
     * @param sourceFile    源文件
     * @param targetFile   目标文件
     */
    private static void recursionCopyByApacheUtils(File sourceFile, File targetFile) 
        try 
            FileUtils.copyDirectory(sourceFile, targetFile);
         catch (IOException e) 
            e.printStackTrace();
        
    

FileInputStream、FileOutputStream 实现

	 /**
     * 复制文件
     * InputStream、OutputStream 实现。未做任何检测,参数不对或IO读写失败都会翻车。
     * @param sourceFile    源文件
     * @param targetFile    目标文件
     */
    private static void copyByFileStreams(File sourceFile, File targetFile)
        try (InputStream input  = new FileInputStream(sourceFile);
             OutputStream output = new FileOutputStream(targetFile)
        ) 
            byte[] buf = new byte[1024];
            int len;
            while ((len = input.read(buf)) != -1) 
                output.write(buf, 0, len);
            
         catch (IOException e) 
            e.printStackTrace();
        
    
    

BufferedInputStream、BufferedOutputStream 实现

    /**
     * 复制文件
     * BufferedInputStream、BufferedOutputStream 实现。未做任何检测,参数不对或IO读写失败都会翻车。
     * @param sourceFile    源文件
     * @param targetFile    目标文件
     */
    private static void copyByBufferediostream(File sourceFile, File targetFile)
        try (BufferedInputStream input  = new BufferedInputStream(new FileInputStream(sourceFile));
             BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(targetFile))
        ) 
            
            byte[] buf = new byte[1024];
            int len;
            while ((len = input.read(buf)) != -1) 
                output.write(buf, 0, len);
            
         catch (IOException e) 
            e.printStackTrace();
        
    
    

FileChannel 实现

    /**
     * 复制文件
     * FileChannel 实现。未做任何检测,参数不对或IO读写失败都会翻车。
     * @param sourceFile    源文件
     * @param targetFile   目标文件
     */
    private static void copyByFileChannel(File sourceFile, File targetFile) 
        try (FileChannel inputChannel = new FileInputStream(sourceFile).getChannel();
             FileChannel outputChannel = new FileOutputStream(targetFile).getChannel()
        ) 
            outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
         catch (IOException e) 
            e.printStackTrace();
        
    

Java7 的 Files.copy 实现

    /**
     * 复制文件
     * java7 的 Files.copy 实现。未对参数做任何检测,建议。
     * @param sourceFile    源文件
     * @param targetFile   目标文件
     */
    private static void copyByFilesCopy(File sourceFile, File targetFile) 
        try 
            Files.copy(sourceFile.toPath(), targetFile.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
         catch (IOException e) 
            e.printStackTrace();
        
    

Java7 的 Files.walkFileTree + FileVisitor 实现递归复制

    /**
     * 递归复制整个文件夹内容
     * java7 的 Files.walkFileTree + FileVisitor 实现。
     * @param sourcePath    源路径
     * @param targetPath    目标路径
     */
    private static void recursionCopyByFilesWalkFileTree(Path sourcePath, Path targetPath) 
        try 

            Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() 
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException 
                    System.out.println("处理文件夹: " + dir);
                    Path path = targetPath.resolve(sourcePath.relativize(dir));
                    if (!path.toFile().exists()) 
                        Files.createDirectory(path);
                    
                    return FileVisitResult.CONTINUE;
                

                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException 
                    System.out.println("复制文件: " + file);
                    Path path = targetPath.resolve(sourcePath.relativize(file));
                    Files.copy(file, path, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
                    return FileVisitResult.CONTINUE;
                
            );

         catch (IOException e) 
            e.printStackTrace();
        
    

递归复制整个文件夹内容

这里主要是参数判断和递归的逻辑,Files.copy负责拷贝单个文件,可以换别的方式实现。

    /**
     * 递归复制整个文件夹内容
     * java7 的 Files.copy 实现。
     * @param sourceFile    源路径
     * @param targetFile    目标路径
     */
    static void copyDirectory(File sourceFile, File targetFile) throws IOException 
        if (sourceFile.isDirectory() == false) 
            throw new IOException("不是有效路径: " + sourceFile.getAbsolutePath());
        
        if (targetFile.mkdirs() == false && targetFile.isDirectory() == false) 
            throw new IOException("路径创建失败: " + targetFile.getAbsolutePath());
        
        File[] files = sourceFile.listFiles();
        if (files != null)
            for (File file: files)
                File tempFile = new File(targetFile.getAbsoluteFile(), file.getName());
                if (file.isDirectory())
                    tempFile.mkdirs();
                    copyDirectory(file,tempFile); // 如果是文件夹递归调用
                else
                	// java7 的 Files.copy
                    Files.copy(file.toPath(), tempFile.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
                
            
        
    

字符文件复制

FileReader、FileWriter 实现

	/**
     * 复制文本文件
     * FileReader、FileWriter 实现。未做任何检测,参数不对或IO读写失败都会翻车。
     * @param sourceFile    源文件
     * @param targetFile    目标文件
     */
    private static void copyByFileReader(File sourceFile, File targetFile)
        try (FileReader input  = new FileReader(sourceFile);
             FileWriter output = new FileWriter(targetFile)
        ) 
            int data;
            while ((data = input.read()) != -1) 
                System.out.println(String.valueOf((char)data));
                output.write(data);
            
         catch (IOException e) 
            e.printStackTrace();
        
    

BufferedReader、BufferedWriter 实现

    /**
     * 复制文本文件
     * BufferedReader、BufferedWriter 实现。未做任何检测,参数不对或IO读写失败都会翻车。
     * @param sourceFile    源文件
     * @param targetFile    目标文件
     */
    private static void copyByBufferedFileReader(File sourceFile, File targetFile)
        try (BufferedReader input  = new BufferedReader(new FileReader(sourceFile));
             BufferedWriter output = new BufferedWriter(new FileWriter(targetFile))
        ) 
            char[] buf = new char[1024];
            int len = 0;
            while ((len = input.read(buf)) != -1) 
                System.out.println(String.valueOf(buf));
                System.out.println("----------------------------------------------");
                output.write(buf, 0, len);
            
         catch (IOException e) 
            e.printStackTrace();
        
    

BufferedReader、BufferedWriter 实现逐行复制

    /**
     * 【逐行】复制文本文件
     * BufferedReader、BufferedWriter 实现。未做任何检测,参数不对或IO读写失败都会翻车。
     * @param sourceFile    源文件
     * @param targetFile    目标文件
     */
    private static void copyByBufferedFileReaderByLine(File sourceFile, File targetFile)
        try (BufferedReader input  = new BufferedReader(new FileReader(sourceFile));
             BufferedWriter output = new BufferedWriter(new FileWriter(targetFile))
        ) 
            String strLine = null;
            int lineNumber = 0;
            while ((strLine = input.readLine()) != null) 
                System.out.println(++lineNumber + ".    " + strLine);
                output.write(strLine);
                output.newLine();
            
         catch (IOException e) 
            e.printStackTrace();
        
    

参考资料

Copying a File or Directory (The Java™ Tutorials)
org.apache.commons.io.FileUtils 工具类

Java实现文件复制常见方式

以上是关于Java 学习笔记 - 复制文件的主要内容,如果未能解决你的问题,请参考以下文章

java学习笔记之字符流文件复制

Java 学习笔记 System.arraycopy 复制数组

Java学习笔记 对象拷贝

Java学习笔记-数组

java学习笔记

Java框架spring Boot学习笔记(十四):log4j介绍