CommonIO总结

作为J2SE中”三大核心”之一的IO操作,我们虽然在学习时可以忽略“重复造轮子”的禁忌;但在实际开发当中,还是应本着“业务第一,有轮子就用的”原则来指导我们的日常工作。

java代码的规模

当我们刚开始接触java时,无一例外的会从其基本语法入手。这时,我们也会跟着教程写几个简单demo,看看效果,并因此而小激动一会。

随着学习的深入,我们会逐渐了解到我们平时练手的这些小代码块,编译后无非是一些class文件,它们的运行需要java虚拟机的加载与相关环境的支持。后来我们会接触到一些有用的工具包,它们一般是以jar压缩包的形式提供给我们;jar包中一般会包含一到多个class文件,换句话说,jar包将一些有用的、经过开发者实践的代码整合到了一起。照上述类推,许多的jar又一道构成了功能更强大的component组件(常见的如:我们接下来要谈到的CommonIO);在此基础上又一次聚合,就得到了所谓的framework框架(如SpringCommons等)。

graph LR
    id1(class文件)-->|组成|id2(jar包);
    id2(jar包)-->|组成|id3(component组件);
    id3(component组件)-->|组成|id4(framework框架);

下载与配置

graph TB
    id1["进入Apache官网Commons页面(http://commons.apache.org/)"]==>id2["进入CommonIO项目页(http://commons.apache.org/proper/commons-io/)"];
    id2["进入CommonIO项目页(http://commons.apache.org/proper/commons-io/)"]==>id3["下载最新CommonsIO_jdk"];

下载完CommonsIO_jar包后,我们只需按照相应IDE的lib引入方法,完成对jar包的引入设置。这里以idea为例,我们只需先进入project structure 面板,然后点击左侧的Libraries选项,最后点击添加按钮并添加想要的jar包。

CommonsIO常用接口

文件及目录大小获取

获取文件大小

1
2
方法: public static long sizeOf(final File file);
调用形式: FileUtils.sizeOf(file);

获取目录大小

1
2
方法:public static long sizeOfDirectory(final File directory);
调用形式: FileUtils.sizeOfDirectory(dir);

遍历及筛选目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** * 遍历指定目录的第一层子目录,过滤条件为:内容非空 */
Collection<File> files = FileUtils.listFiles(new File("/home/rqsir/IdeaProjects/CommonIODemo"), EmptyFileFilter.NOT_EMPTY,null);
for (File file:files ) { System.out.println(file.getAbsolutePath());}
System.out.println("-------------------------------");

/** * 遍历指定目录的所有子目录,过滤条件为:内容非空 */
Collection<File> files1 = FileUtils.listFiles(new File("/home/rqsir/IdeaProjects/CommonIODemo"), EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE);
for (File file:files1) { System.out.println(file.getAbsolutePath());}
System.out.println("-------------------------------");

/** * 遍历指定目录的所有子目录,过滤条件为:后缀为:java */
Collection<File> files2 = FileUtils.listFiles(new File("/home/rqsir/IdeaProjects/CommonIODemo"), new SuffixFileFilter("java"), DirectoryFileFilter.INSTANCE);
for (File file:files2) { System.out.println(file.getAbsolutePath());}
System.out.println("-------------------------------");

/** * 遍历指定目录的所有子目录,过滤条件为:后缀为:java或者class */
Collection<File> files3 = FileUtils.listFiles(new File("/home/rqsir/IdeaProjects/CommonIODemo"), FileFilterUtils.or(new SuffixFileFilter("java"),new SuffixFileFilter("class")), DirectoryFileFilter.INSTANCE);
for (File file:files3) { System.out.println(file.getAbsolutePath());}
System.out.println("-------------------------------");

/** * 遍历指定目录的所有子目录,过滤条件为:后缀为:java且不为空 */
Collection<File> files4 = FileUtils.listFiles(new File("/home/rqsir/IdeaProjects/CommonIODemo"), FileFilterUtils.and(new SuffixFileFilter("java"),EmptyFileFilter.NOT_EMPTY), DirectoryFileFilter.INSTANCE);
for (File file:files4) { System.out.println(file.getAbsolutePath());}

读取文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//读取文件内容方式一:(一次性读取)
String content = FileUtils.readFileToString(new File("a.txt"),"utf8");
System.out.println(content);

System.out.println("------------------------------");

//读取文件内容方式二:(按行读取)
List<String> lines = FileUtils.readLines(new File("a.txt"),"utf8");
for (String line:lines
) {
System.out.println(line);
}

System.out.println("------------------------------");

//读取文件大小
byte[] bys = FileUtils.readFileToByteArray(new File("a.txt"));
System.out.println("fileSize:"+bys.length);

System.out.println("------------------------------");

//读取文件内容方式三:(通过迭代器读取)
LineIterator lineIterator = FileUtils.lineIterator(new File("a.txt"),"utf8");
while (lineIterator.hasNext()){
System.out.println(lineIterator.next());
}

写文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
//写字符串到文件
FileUtils.write(new File("b.txt"),"学习很伟大\n","utf8",true);
FileUtils.writeStringToFile(new File("b.txt"),"学习很辛苦\n","utf8",true);

//写字节数组到文件
FileUtils.writeByteArrayToFile(new File("b.txt"),"学习很幸福\n".getBytes("utf8"),true);

//写String类型的线性表到文件
List<String> lines = new ArrayList<String>();
lines.add("昨天");
lines.add("今天");
lines.add("明天");
FileUtils.writeLines(new File("b.txt"),"utf8",lines,"--->",true);//"--->"为每一行的分隔符

拷贝操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//copy file
FileUtils.copyFile(new File("avatar.jpg"),new File("avatar_copy.jpg"));
//copy file to directory
FileUtils.copyFileToDirectory(new File("avatar.jpg"),new File("out"));
//copy dir
FileUtils.copyDirectory(new File("out"),new File("out_copy"));
//copy dir to dir
FileUtils.copyDirectoryToDirectory(new File("out"),new File("outContainer"));
//copy URL to file
String url = "https://raw.githubusercontent.com/RQsir/blog_pic_bed/master/img/81a5cfb3ly1g279yehw2kj21hc0t8457.jpg?token=AKZRZC5LDP5TBBMWU5JBQ4K4YQIPI";
FileUtils.copyURLToFile(new URL(url),new File("JDK_debug.gif"));
//copy URL to String
String webPage = IOUtils.toString(new URL("http://www.baidu.com"),"utf8");
System.out.println(webPage);
String webPage2 = IOUtils.toString(new URL("http://www.163.com"),"gbk");
System.out.println(webPage2);