注册 X
提交 注:点击提交后系统会发送邮件到邮箱验证!(仅支持中国大陆邮箱)
我已阅读并同意 服务条款
首页 > IT技术笔记 > 查看笔记

Apache commons io FileUtils工具类,文件、文件夹复制、遍历等

Apache commons io FileUtils工具类,文件、文件夹复制、遍历等

引入依赖:

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->

<dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>2.6</version>

</dependency>


		        
package com.tool;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.filechooser.FileSystemView;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.SizeFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;

/**
 * FileUtils 通用文件操作工具类
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2020/11/21 15:30
 */

public class FileUtilsTest {
	
	public void getFile() {
		//获取指定文件
		File file = FileUtils.getFile("D://test/test1/123.txt");
		
		//获取临时目录 File对象
		File tempDirectory = FileUtils.getTempDirectory();
		
		//获取临时目录路径字符串
		System.out.println(FileUtils.getTempDirectoryPath());
		
		//获取用户主目录 File对象
		File userDirectory = FileUtils.getUserDirectory();
		
		//获取用户主目录路径字符串
		System.out.println(FileUtils.getUserDirectoryPath());
	}
	
    /**
     * write(final File file, final CharSequence data, final Charset encoding)
     * 1、file:写入的文件对象,路径不存在时,自动新建
     * 2、data:写入文件的内容
     * 3、encoding:文件内容编码
     *
     * @throws IOException
     */
    
    public void write1() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write1.txt");
        String context = "{\"name\":\"BeJson帅\",\"url\":\"http://www.wouuz.com\"page\":88,\"isNonProfit\":true}";
        FileUtils.write(file, context, Charset.forName("UTF-8"));
        System.out.println("写入文件:" + file.getAbsoluteFile());
    }

    /**
     * write(final File file, final CharSequence data, final Charset encoding, final boolean append)
     * 1、file:写入的文件对象,路径不存在时,自动新建
     * 2、data:写入文件的内容
     * 3、encoding:文件内容编码
     * 4、append:内容是否追加
     *
     * @throws IOException
     */
    
    public void write2() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write2.txt");
        String context = "{\"name\":\"BeJson帅\",\"url\":\"http://www.wouuz.com\"page\":88,\"isNonProfit\":true}
";
        FileUtils.write(file, context, Charset.forName("UTF-8"), true);
        System.out.println("写入文件:" + file.getAbsoluteFile());
    }

    /**
     * 将字节数组写入到指定文件,路径不存在时,自动新建
     * writeByteArrayToFile(final File file, final byte[] data)
     * writeByteArrayToFile(final File file, final byte[] data, final boolean append)
     * writeByteArrayToFile(final File file, final byte[] data, final int off, final int len)
     * writeByteArrayToFile(final File file, final byte[] data, final int off, final int len,final boolean append)
     *
     * @throws IOException
     */
    
    public void write3() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write3.txt");
        String context = "{\"name\":\"汪茂雄\",\"url\":\"http://www.wouuz.com\"page\":88,\"isNonProfit\":true}
";
        FileUtils.writeByteArrayToFile(file, context.getBytes(), true);
        System.out.println("写入文件:" + file.getAbsoluteFile());
    }

    /**
     * writeLines(final File file, final String encoding, final Collection<?> lines,final boolean append)
     * file:待写入的文件,路径不存在时,自动新建;
     * lines:要写入的行,null 表示插入空行
     * append:内容是否追加
     * lineEnding:要使用的行分隔符,null 表示使用系统默认值
     * encoding:要使用的编码,{@code null}表示平台默认值
     *
     * @throws IOException
     */
    
    public void write4() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write4.txt");
        List<String> lines = new ArrayList<>();
        lines.add(null);
        for (int i = 0; i < 10; i++) {
            lines.add("{\"id\":" + i + ",\"name\":\"汪茂雄\",\"url\":\"http://www.wouuz.com\"page\":88,\"isNonProfit\":true}");
        }
        FileUtils.writeLines(file, "UTF-8", lines, true);
        System.out.println("写入文件:" + file.getAbsoluteFile());
    }
    
    /**
     * 将字符串写入文件,[目标文件] [写入的字符串] [字符集] [是否追加]
     * @throws IOException 
     */
    public void writeStringToFile() throws IOException {
    	FileUtils.writeStringToFile(new File("D://test/test1"), "string", "utf-8", true);
    }
    
    /**
     * long sizeOf(final File file)
     * long sizeOfDirectory(final File directory)
     * sizeOf 可以统计文件大小,也可以统计目录大小,单位为 字节,如果文件或者目录不存在,则报错
     * sizeOfDirectory 级联计算目录文件下的所有文件大小,只统计目录的大小,单位为 字节,如果是文件则报错
     * <p>
     * String byteCountToDisplaySize(final long size)
     * String byteCountToDisplaySize(final BigInteger size)
     * 将文件字节大小转为可视化的 KB、MB、GB 等形式的字符串,一共有:bytes、KB、MB、GB、TB、PB、EB.
     *
     * @throws IOException
     */
    
    public void sizeOf() {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write4.txt");

        Long sizeFile = FileUtils.sizeOf(file);
        Long sizeDirectory = FileUtils.sizeOf(file.getParentFile());
        Long sizeOfDirectory = FileUtils.sizeOfDirectory(file.getParentFile());

        //2582,2661,2661
        System.out.println(sizeFile + "," + sizeDirectory + "," + sizeOfDirectory);

        String size1Show = FileUtils.byteCountToDisplaySize(sizeFile);
        String size2Show = FileUtils.byteCountToDisplaySize(sizeDirectory);
        String size3Show = FileUtils.byteCountToDisplaySize(sizeOfDirectory);

        //2 KB,2 KB,2 KB
        System.out.println(size1Show + "," + size2Show + "," + size3Show);
    }

    /**
     * LineIterator lineIterator(final File file)
     * LineIterator lineIterator(final File file, final String encoding)
     * 为文件打开一个 InputStream 的行迭代器,完成迭代器之后,应该关闭流以释放内部资源。
     * LineIterator implements Iterator:可以很方便的一行一行读取文件内容
     *
     * @throws IOException
     */
    
    public void lineIterator() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write4.txt");
        LineIterator lineIterator = FileUtils.lineIterator(file, "UTF-8");
        int i = 1;
        while (lineIterator.hasNext()) {
            String next = lineIterator.next();
            System.out.println((i++) + ":" + next);
        }
        //关闭底层{@code Reader}。如果只想处理较大文件的前几行,则此方法非常有用。
        // 如果不关闭迭代器,则{@code Reader}仍然存在打开。这个方法可以安全地调用多次。
        lineIterator.close();
    }

    /**
     * String readFileToString(final File file, final String encoding)
     * String readFileToString(final File file, final Charset encoding)
     * String readFileToString(final File file)
     * <p>
     * 将文件的内容读入字符串。文件始终处于关闭状态。
     * file:要读取的文件,不能是 null
     * encoding:要使用的编码,null表示使用平台默认值
     *
     * @throws IOException
     */
    
    public void readFileToString() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/write4.txt");
        String fileToString = FileUtils.readFileToString(file, Charset.forName("UTF-8"));
        System.out.println(fileToString);
    }

    /**
     * Collection<File> listFiles(final File directory, final String[] extensions, final boolean recursive)
     * 查找给定目录(及其子目录)中与扩展名数组匹配的文件。
     * directory 要搜索的目录
     * extensions:要过滤的扩展数组,例如{“java”、“xml”},为 null,返回所有文件。
     * ecursive:true 表示搜索所有子目录
     */
    
    public void listFiles1() {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx");
        Collection<File> fileCollection = FileUtils.listFiles(file, null, true);
        for (File file1 : fileCollection) {
            System.out.println(file1.getAbsoluteFile());
        }
    }

    /**
     * 遍历目录下的所有文件
     */
    
    public void listFiles2() {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File targetDir = new File(homeDirectory, "wmx");
        /**
         * listFiles(final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)
         * directory:不要为 null、不要是文件、不要不存在
         * fileFilter:文件过滤 参数如果为 FalseFileFilter.FALSE ,则不会查询任何文件
         * dirFilter:目录过滤 参数如果为 FalseFileFilter.FALSE , 则只获取目标文件夹下的一级文件,而不会迭代获取子文件夹下的文件
         */
        Collection<File> fileCollection = FileUtils.listFiles(targetDir,
                TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
        for (File file : fileCollection) {
            System.out.println(">>> " + file.getPath());
        }
    }

    /**
     * 遍历目录下所有以指定字符开头的文件
     */
    
    public void listFiles3() {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File targetDir = new File(homeDirectory, "wmx");
        String[] prefixArr = {"write", "2020"};//查询以这些字符开头的文件
        PrefixFileFilter prefixFileFilter = prefixArr != null ? new PrefixFileFilter(prefixArr) : new PrefixFileFilter("");
        /**
         * listFiles(final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)
         * directory:不要为 null、不要是文件、不要不存在
         * fileFilter:文件过滤
         *      1)PrefixFileFilter:为文件名前缀过滤器
         *      2)PrefixFileFilter 构造器参数可以是 String、List<String>、String[] 等
         *      3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
         *
         * dirFilter:目录过滤
         *      TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
         *      FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
         */
        Collection<File> fileCollection = FileUtils.listFiles(targetDir, prefixFileFilter, TrueFileFilter.INSTANCE);
        for (File file : fileCollection) {
            System.out.println(">>> " + file.getPath());
        }
    }

    /**
     * 遍历目录下所有以指定字符结尾的文件
     */
    
    public void listFiles4() {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File targetDir = new File(homeDirectory, "wmx");
        String[] suffixArr = {".txt", ".jpg"};//查询以这些字符结尾的文件

        /**
         * SuffixFileFilter 指定的后缀可以是任意字符,如文件 overview-tree.html,后缀过滤器字符 html、.html、tree.html 等都能匹配
         * */
        SuffixFileFilter suffixFileFilter = suffixArr != null ? new SuffixFileFilter(suffixArr) : new SuffixFileFilter("");
        Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixFileFilter, TrueFileFilter.INSTANCE);
        for (File file : fileCollection) {
            System.out.println(">>> " + file.getPath());
        }
    }

    /**
     * 遍历目录下所有大于或者小于指定大小的文件
     */
    
    public void listFiles5() {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File targetDir = new File(homeDirectory, "wmx");
        Long fileSize = FileUtils.ONE_MB;//文件判断大小,单位 字节
        boolean acceptLarger = false;//为 true,则表示获取大于等于 fileSize 的文件,false 相反

        /**
         * SizeFileFilter(final long size, final boolean acceptLarger)
         * 1)文件大小过滤器
         * 2)size,表示判断的依据点
         * 3)acceptLarger:为 true,则表示获取  大于等于 size 的文件为 false ,则表示获取 小于 size 的文件
         * 4)单位是字节
         */
        SizeFileFilter sizeFileFilter = new SizeFileFilter(fileSize, acceptLarger);
        Collection<File> fileCollection = FileUtils.listFiles(targetDir, sizeFileFilter, TrueFileFilter.INSTANCE);
        for (File file : fileCollection) {
            System.out.println(">>> " + file.getPath() + "	" + file.length() +
                    "	" + FileUtils.byteCountToDisplaySize(file.length()));
        }
    }
    /**
     * copyDirectory(final File srcDir, final File destDir)
     * copyDirectory(final File srcDir, final File destDir,final boolean preserveFileDate)
     * copyDirectory(final File srcDir, final File destDir,final FileFilter filter)
     * copyDirectory(final File srcDir, final File destDir,final FileFilter filter, final boolean preserveFileDate)
     * 将指定目录下所有子孙目录和文件复制到指定的目标目录下,如果目标目录不存在,则创建该目录。如果目标目录确实存在,则此方法将源目录与目标目录合并,源目录优先。注意只能是目录,如果是文件则异常。
     *
     * @throws IOException
     */
    
    public void copyDirectory() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File srdDir = new File(homeDirectory, "wmx");
        File destDir = new File(homeDirectory, "wmx_copy");
        FileUtils.copyDirectory(srdDir, destDir);
        System.out.println("复制目录:" + destDir.getAbsoluteFile());
    }

    /**
     * copyToDirectory(final File src, final File destDir)
     * copyToDirectory(final Iterable<File> srcs, final File destDir)
     * 将源文件或目录及其所有内容复制到指定目标目录中同名的目录中。如果目标目录不存在,则创建该目录。如果目标目录确实存在,则此方法将源目录与目标目录合并,源目录优先。
     *
     * @throws IOException
     */
    
    public void copyToDirectory() throws IOException {
        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File srdDir = new File(homeDirectory, "wmx");
        File destDir = new File(homeDirectory, "wmx_copy");
        FileUtils.copyToDirectory(srdDir, destDir);
        System.out.println("复制目录:" + destDir.getAbsoluteFile());
    }
    
    /**
     *  此方法将目录1所有的文件夹及文件复制到目录2下,如果有同名文件夹则合并,如果有同名文件则替换
     */
    public void copyDirectoryToDirectory () {
    	try {
    	    //复制文件夹
    		File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
            File srcDir = new File(homeDirectory, "wmx");
            File destDir = new File(homeDirectory, "wmx_copy");
    	    FileUtils.copyDirectoryToDirectory(srcDir, destDir);
    	} catch (IOException e) {
    	    e.printStackTrace();
    	}
    }
    
    /**
     * copyURLToFile(final URL source, final File destination)
     * copyURLToFile(final URL source, final File destination,final int connectionTimeout, final int readTimeout)
     * 将 URL 网络资源复制到目标文件中,可以用于下载,未设置超时时间时,可能出现永久阻塞
     * connectionTimeout:连接超时时间,单位毫秒
     * readTimeout:读取超时时间,单位毫秒
     *
     * @throws IOException
     */
    
    public void copyURLToFile() throws IOException {
        URL url = new URL("https://avatar.csdnimg.cn/6/D/4/2_wangmx1993328.jpg");

        File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
        File file = new File(homeDirectory, "wmx/1.jpg");

        FileUtils.copyURLToFile(url, file, 60 * 1000, 60 * 1000);
        System.out.println("复制目录:" + file.getAbsoluteFile());
    }
    /**
     * 拷贝文件到文件:copyFile(File srcFile, File destFile)
     */
    public void copyFile() {
    	File file = new File("C:\Users\jspanjsp\Desktop\新建 Microsoft Word 文档.docx");
		String destFilePath = "C:\Users\jspanjsp\Desktop\wmx";
		String destFileName = "abc雪02.docx";
		try {
			//文件拷贝到新的位置并保存文件的日期。
			FileUtils.copyFile(file, new File(destFilePath,destFileName));
			System.out.println("文件拷贝成功");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
    }
    /**
     * 拷贝文件到文件的目录保存文件的日期:copyFileToDirectory(File srcFile, File destDir)
	 * 拷贝的文件名无法自定义,和原文件名一样
     * @throws IOException
     */
    public void copyFileToDirectory() throws IOException {
    	File file = new File("C:\Users\jspanjsp\Desktop\新建 Microsoft Word 文档.docx");
    	String destFilePath = "C:\Users\jspanjsp\Desktop\wmx";
    	//拷贝文件到文件的目录保持文件的日期。
    	FileUtils.copyFileToDirectory(file, new File(destFilePath));
    }
    
    /**
     * 删除指定文件,从不引发异常:deleteQuietly(File file)
     * @param args
     * @throws IOException
     */
    public void deleteQuietly() {
		File file = new File("E:\java\file04\abc雪.jpg");
		//删除指定文件,从不引发异常。
		FileUtils.deleteQuietly(file);
    }
    /**
     * 删除指定文件,不存在报异常:forceDelete(File file)
     * @param args
     * @throws IOException
     */
    public void forceDelete() {
    	File file = new File("E:\java\file04\abc雪.jpg");
		try {
			FileUtils.forceDelete(file);
			System.out.println("操作成功");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
    }
    /**
     * 递归删除目录:deleteDirectory(File directory)
     * 删除其包含文件及子目录文件
     * @param args
     * @throws IOException
     */
    public void deleteDirectory() {
		File file = new File("E:\java\file04\");
		//递归删除目录。
		try {
			FileUtils.deleteDirectory(file);
			System.out.println("操作成功");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
    }
    
    /**
     * FileUtils.byteCountToDisplaySize  => 以可读的方式,返回文件的大小EB, PB, TB, GB, MB, KB or bytes
     * @throws IOException
     */
    public void byteCountToDisplaySize() {
    	System.out.println(FileUtils.byteCountToDisplaySize(10000000)); // 9 MB
		System.out.println(FileUtils.byteCountToDisplaySize(1)); // 1 bytes
    }
    /**
             * 文件内容的对比
     * @throws IOException
     */
    public void contentEquals() throws IOException {
    	FileUtils.contentEquals(new File("D://test/test1"), new File("D://test/test2"));
    	FileUtils.contentEqualsIgnoreEOL(new File("D://test/test1"), new File("D://test/test2"), null);//忽略换行符,第三个参数是字符集
    }
    
    /**
             *   判断是否包含文件或文件夹
     * @param args
     * @throws IOException
     */
    public void directoryContains () throws IOException {
    	//判断是否包含文件或者文件夹  
    	boolean b=FileUtils.directoryContains(new File("D:/cxyapi"), new File("D:/cxyapi/cxyapi.txt"));  
    	System.out.println(b);
    }
    
    /**
             * 清除目录中的内容,不会删除该目录, 遍历目录中的文件,如果是目录则递归删除;如果是文件则强制删除,删除失败(文件不存在或无法删除)都会抛出异常
     * @throws IOException
     */
    public void cleanDirectory() {
    	try {
			FileUtils.cleanDirectory(new File("D://test/test1"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    /**
     * 读取目标文件每一行数据,返回list 
     * @param args
     * @throws IOException
     */
    public void readLines() throws IOException {
    	List<String> strs = FileUtils.readLines(new File("D://test/test1"), "utf-8");
    }
    
    /**
     * 强制创建文件目录,如果文件存在,会抛出异常
     * @throws IOException 
     */
    public void forceMkdir() throws IOException {
    	//强制创建文件目录,如果文件存在,会抛出异常
    	FileUtils.forceMkdir(new File("D://test/test1"));
    	
    	//强制创建父级目录
    	FileUtils.forceMkdirParent(new File("D://test/test1"));
    }
    
    /**
     * 移动目录,移动的目录位置如果存在同名目录会报错
     * @throws IOException 
     */
    public void moveDirectory() throws IOException {
    	FileUtils.moveDirectory(new File("D://test/test1"), new File("D://test/test1"));
    }
    
    /**
     * 移动目录到指定目录下,第3个参数为,目录不存在是否创建
     * @throws IOException 
     */
    public void moveDirectoryToDirectory() throws IOException {
    	FileUtils.moveDirectoryToDirectory(new File("D://test/test1"), new File("D://test/test1"), true);
    }
    
	public static void main(String[] args) throws IOException {
		new FileUtilsTest().byteCountToDisplaySize();
	}
    
}
		      

 打赏        分享



评论

邮箱: 昵称: