[19/04/04-星期四] IO技术_CommonsIO(通用IO,别人造的轮子,FileUtils类 操作文件 & IOUtilsl类 操作里边的内容 )
一、概念
JDK中提供的文件操作相关的类,但是功能都非常基础,进行复杂操作时需要做大量编程工作。实际开发中,往往需要
你自己动手编写相关的代码,尤其在遍历目录文件时,经常用到递归,非常繁琐。
Apache-commons工具包中提供了IOUtils/FileUtils,可以让我们非常方便的对文件和目录进行操作。
Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。
在它所支持的Apache项目与子项目中,所发行的软件产品都遵循Apache许可证(Apache License)。 官方网址为:www.apache.org 。
很多著名的Java开源项目都来源于这个组织。比如:commons、kafka、lucene、maven、shiro、struts等技术,以及大数据技术中的
hadoop(大数据第一技术)、hbase、spark、storm、mahout等。
FieUtils类中常用方法的介绍
打开FileUtils的api文档,我们抽出一些工作中比较常用的方法,进行总结和讲解。总结如下:
cleanDirectory:清空目录,但不删除目录。
contentEquals:比较两个文件的内容是否相同。
copyDirectory:将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的 文件。
copyFile:将一个文件拷贝到一个新的地址。
copyFileToDirectory:将一个文件拷贝到某个目录下。
copyInputStreamToFile:将一个输入流中的内容拷贝到某个文件。
deleteDirectory:删除目录。
deleteQuietly:删除文件。
listFiles:列出指定目录下的所有文件。
openInputSteam:打开指定文件的输入流。
readFileToString:将文件内容作为字符串返回。
readLines:将文件内容按行返回到一个字符串数组中。
size:返回文件或目录的大小。
write:将字符串内容直接写到文件中。
writeByteArrayToFile:将字节数组内容写到文件中。
writeLines:将容器中的元素的toString方法返回的内容依次写入文件中。
writeStringToFile:将字符串内容写到文件中。
【代码示例】
1 /**练习自己导入包jar包 commons-io 即通用IO jar包,别人造的轮子 2 *FieUtils类 3 * 4 */ 5 package cn.sxt.test; 6 7 import java.io.File; 8 import java.nio.file.Files; 9 import java.util.Collection; 10 11 import org.apache.commons.io.FileUtils; 12 import org.apache.commons.io.filefilter.DirectoryFileFilter; 13 import org.apache.commons.io.filefilter.EmptyFileFilter; 14 import org.apache.commons.io.filefilter.FileFileFilter; 15 import org.apache.commons.io.filefilter.FileFilterUtils; 16 import org.apache.commons.io.filefilter.SuffixFileFilter; 17 18 19 public class Test_0404_CommonsIO_FieUtils { 20 public static void main(String[] args) { 21 //文件的大小,直接用 新jar包中的FileUtils类的sizeOf方法 22 long len=FileUtils.sizeOf(new File("src.txt")); 23 System.out.println(len); 24 25 //目录的大小 查看lib左边的lib目录 26 long len2=FileUtils.sizeOf(new File("lib")); 27 System.out.println(len2); 28 29 30 //3、列出子孙集 31 File file=new File("dest"); 32 //3-1 参数1:放个源文件夹 参数2:过滤器,保留哪一些东西 参数3:是否列出子孙集/null 表示只进行一层 把它们放在容器中去 33 //EmptyFileFilter.NOT_EMPTY:只要非空的 下边有个empty文件是空的0KB 34 Collection<File> files=FileUtils.listFiles(file, EmptyFileFilter.NOT_EMPTY, null); 35 for (File tempfile : files) {//遍历输出绝对路径, 只遍历dest下边的直系文件, 实际上里边的src文件夹还有东西 36 System.out.println(tempfile.getAbsolutePath()); 37 } 38 System.out.println("-----------"); 39 File file2=new File("dest");//DirectoryFileFilter 目录过滤 INSTANCE示例 操作子孙集的 40 Collection<File> files2=FileUtils.listFiles(file2, EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE); 41 //3-2、只输出文件后缀为.html的文件。 Suffix后缀。词尾 42 Collection<File> files3=FileUtils.listFiles(file2, new SuffixFileFilter("html"), 43 DirectoryFileFilter.INSTANCE); 44 //3-3、or的用法 既要.html的文件又要.jpg的文件 45 Collection<File> files4=FileUtils.listFiles(file2, FileFilterUtils.or( 46 new SuffixFileFilter("html"),new SuffixFileFilter("jpg") ), 47 DirectoryFileFilter.INSTANCE); 48 //3-4、我全都要 and的用法 既是txt文件又是空文件的 49 Collection<File> files5=FileUtils.listFiles(file2, FileFilterUtils.and( 50 new SuffixFileFilter("txt"),EmptyFileFilter.EMPTY ), 51 DirectoryFileFilter.INSTANCE); 52 53 for (File tempfile : files5) {//遍历输出绝对路径, 遍历dest目录下的的所有东西 54 System.out.println(tempfile.getAbsolutePath()); 55 } 56 57 58 } 59 60 }
IOUtils类中常用方法的介绍
1. buffer方法:将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小。
2. closeQueitly方法:关闭流。
3. contentEquals方法:比较两个流中的内容是否一致。
4. copy方法:将输入流中的内容拷贝到输出流中,并可以指定字符编码。
5. copyLarge方法:将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝。
6. lineIterator方法:返回可以迭代每一行内容的迭代器。
7. read方法:将输入流中的部分内容读入到字节数组中。
8. readFully方法:将输入流中的所有内容读入到字节数组中。
9. readLine方法:读入输入流内容中的一行。
10. toBufferedInputStream,toBufferedReader:将输入转为带缓存的输入流。
11. toByteArray,toCharArray:将输入流的内容转为字节数组、字符数组。
12. toString:将输入流或数组中的内容转化为字符串。
13. write方法:向流里面写入内容。
14. writeLine方法:向流里面写入一行内容。
【代码示例】
1 /** 2 *IOUtils 操作里边的内容 3 * 4 */ 5 package cn.sxt.test; 6 7 import java.io.File; 8 import java.io.IOException; 9 import java.net.URL; 10 import java.util.ArrayList; 11 import java.util.List; 12 13 import org.apache.commons.io.FileUtils; 14 import org.apache.commons.io.IOUtils; 15 16 public class Test_0404_CommondIO_IOUtils { 17 public static void main(String[] args) throws IOException { 18 File file=new File("poem.txt"); 19 //1、读取文件 20 String msg=FileUtils.readFileToString(file,"GBK"); 21 System.out.println(msg); 22 23 //2、看文件的大小 24 byte[] datas=FileUtils.readFileToByteArray(file); 25 System.out.println(datas.length); 26 27 //3、逐行读取 放在容器中 28 List<String> mList=FileUtils.readLines(file,"GBK"); 29 for (String tempString : mList) { 30 System.out.println(tempString); 31 } 32 33 //4、写入 3种写法效果一样 34 File file2=new File("print.txt"); 35 FileUtils.write(file2, "锦瑟无端五十弦,一弦一柱思华年。\r\n", "GBK",true);//使用GBK字符集,在文件后面追加 36 FileUtils.writeStringToFile(file2, "庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n","GBK",true); 37 FileUtils.writeByteArrayToFile(file2, "沧海月明珠有泪,蓝田日暖玉生烟。\r\n".getBytes("GBK"),true); 38 39 List<String> dataList=new ArrayList<String>(); 40 dataList.add("大江东去,浪淘尽,千古风流人物。"); 41 dataList.add("故垒西边,人道是,三国周郎赤壁。"); 42 dataList.add("乱石穿空,惊涛拍岸,卷起千堆雪。"); 43 44 FileUtils.writeLines(file2, dataList,"---",true);//第3个参数是以上3个字符串的连接符,自定义 45 46 //5、单纯的复制文件 47 FileUtils.copyFile(new File("SongYi.jpg"),new File("Song2.jpg")); 48 //5-2、复制文件到指定目录 49 FileUtils.copyFileToDirectory(new File("SongYi.jpg"), new File("dest")); 50 //5-3、文件夹(包括所有子文件)的复制与 把a文件复制到b文件夹下 51 FileUtils.copyDirectory(new File("dest"), new File("dest_copy"));//复制一个dest文件夹,2个平级 52 FileUtils.copyDirectoryToDirectory(new File("dest"), new File("dest2"));//把dest文件夹复制到dest2目录下,当儿子去 53 54 //5-4、拷贝网络地址上一张图片 55 String url="https://www.baidu.com/img/dong_24ac35d79990cac4c1816710e2802ca0.gif"; 56 FileUtils.copyURLToFile(new URL(url), new File("QingMing.gif")); 57 58 //5-5、复制网站的源码 59 String data2=IOUtils.toString(new URL("http://www.baidu.com"),"UTF-8"); 60 System.out.println(data2); 61 } 62 63 64 }