Apache-Commons-FileIOUtils工具类常用方法使用
一、导入依赖
1.1、Maven项目
mavne依赖
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
1.2、Java项目
1、下载依赖
-
访问Apache官网:https://www.apache.org/
-
翻到最下面,找到
Commons
,点进去 -
然后在下面表格里找到
IO
,并点击进入 -
这里下载最新版本,JDK版本必须为Java8
-
这里选择
.zip
结尾的,上面那个是Linux系统下载的 -
下载好后解压,就会有一个目录,只需要把圈出来的jar包导入到项目里即可
2、导入依赖
-
打开Idea,点击左上角的项目,然后点击
Project Structure...
,打开项目资源 -
然后点击左侧的
Libraries
,然后点击+
号,再选择Java
-
在文件夹里找到我们的jar包,然后选择则,点击OK
-
当项目里出现这个文件,就代表着导入成功了
二、API文档查看步骤
-
打开下载的文件的
docs
目录,里面存放着所有api的文档,然后打开index.html
页面 -
然后找到我们下载的包
io
-
进入IO后,我们找到本次学习的
FileUtils
类,点击进入 -
然后就会看到里面所有的方法等等
三、文件常用API使用
这里大概分了几种类型方便查找使用
这里为了方便观看,所有异常直接抛出
1、操作步骤目录和文件都包含的
(1)将一个文件拷贝到某个目录下
copyFileToDirectory:将一个文件拷贝到某个目录下(目标目录不存在就会创建)
准备
-
在test目录里创建
aaa.txt
文件
开始
将文件复制到不存在的
aaa
目录里
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
FileUtils.copyFileToDirectory(new File("d:/test/aaa.txt"),new File("d:/test/aaa"));
}
}
-
结果(创建了目录aaa,并粘贴了文件)
(2)列出指定目录下的所有文件(可过滤)
listFiles:列出指定目录下的所有文件(可过滤子目录)
准备
-
在test目录里创建两个目录,两个文件
-
在两个目录里分别创建两个文件
开始
遍历test目录及其子目录下所有文件
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
Collection<File> files = FileUtils.listFiles(new File("d:/test"), new IOFileFilter() {
/**
* 所有文件的过滤器
* @param file
* @return
*/
@Override
public boolean accept(File file) {
return true;
}
@Override
public boolean accept(File file, String s) {
return true;
}
}, new IOFileFilter() {
/**
* 子目录过滤器,可以过滤子目录
* @param file
* @return
*/
@Override
public boolean accept(File file) {
return true;
}
@Override
public boolean accept(File file, String s) {
return true;
}
});
for (File file : files) {
System.out.println(file.toString());
}
}
}
-
结果
遍历test目录下除了
ccc.html
文件的所有文件
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
Collection<File> files = FileUtils.listFiles(new File("d:/test"), new IOFileFilter() {
/**
* 所有文件的过滤器
* @param file
* @return
*/
@Override
public boolean accept(File file) {
// 如果文件名称是以html结尾的,则拦截
if(file.getName().endsWith("html")){
return false;
}
return true;
}
@Override
public boolean accept(File file, String s) {
return false;
}
}, new IOFileFilter() {
/**
* 子目录过滤器,可以过滤子目录
* @param file
* @return
*/
@Override
public boolean accept(File file) {
return true;
}
@Override
public boolean accept(File file, String s) {
return false;
}
});
for (File file : files) {
System.out.println(file.toString());
}
}
}
-
结果
遍历test目录下除了aaa目录下的所有文件
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
Collection<File> files = FileUtils.listFiles(new File("d:/test"), new IOFileFilter() {
/**
* 所有文件的过滤器
* @param file
* @return
*/
@Override
public boolean accept(File file) {
return true;
}
@Override
public boolean accept(File file, String s) {
return false;
}
}, new IOFileFilter() {
/**
* 子目录过滤器,可以过滤子目录
* @param file
* @return
*/
@Override
public boolean accept(File file) {
/**
* 如果文件名是aaa,那么就拦截不遍历其下所有文件
*/
if("aaa".equals(file.getName())){
return false;
}
return true;
}
@Override
public boolean accept(File file, String s) {
return false;
}
});
for (File file : files) {
System.out.println(file.toString());
}
}
}
-
结果
(3)返回文件/目录的大小
sizeOf:返回文件/目录的大小
准备
-
在test目录下,创建
aaa.txt
文件,里面输入测试数据,并且右键查看文件大小,记住文件字节大小 -
在test里再创建一个bbb目录,然后在里面新建
bbb.txt
文件,里面输入测试内容,并且查看字节大小
开始
获取
aaa.txt
文件以及bbb
目录的大小
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
import java.util.List;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
long l1 = FileUtils.sizeOf(new File("d:/test/aaa.txt"));
long l2 = FileUtils.sizeOf(new File("d:/test/bbb/bbb.txt"));
System.out.println("文件大小:" + l1); // 文件大小:5518
System.out.println("目录大小:" + l2); // 目录大小:11038
}
}
-
结果
2、操作目录的
(1)清空目录,但不删除目录
cleanDirectory:清空目录,但不删除目录
准备工作:
-
先在D盘下创建
test
目录,然后在里面新建一个目录,两个文件, 用来测试
开始使用
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
/**
* 清空目录,但不删除目录
*/
FileUtils.cleanDirectory(new File("d:/test"));
}
}
-
结果
(2)拷贝目录(可过滤)
copyDirectory:将一个目录内容拷贝到另一个目录,只拷贝内容,可以通过
FileFliter
过滤需要拷贝的文件
准备步骤
-
在test文件夹里创建一个
abc
目录,再创建一个aaa.txt
文件,一个bbb.html
文件
开始使用
只把不为
html
结尾的文件拷贝过去
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
/**
* 清空目录,但不删除目录
*/
FileUtils.copyDirectory(new File("d:/test"), new File("c:/"), new FileFilter() {
/**
* 每个操作的文件都会走这个accept方法
* 只有返回true,才能走完代码,为false则拦截
* @param pathname
* @return
*/
@Override
public boolean accept(File pathname) {
if(!pathname.toString().endsWith("html")){
return true;
}
return false;
}
});
}
}
-
结果
(3)删除目录
deleteDirectory:删除目录
准备
-
在test文件夹里创建aaa目录
开始
将刚创建的aaa目录删除
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
FileUtils.deleteDirectory(new File("d:/test/aaa"));
}
}
-
结果
3、操作文件的
(1)比较两个文件的内容是否相同
contentEquals:比较两个文件的内容是否相同
准备工作
-
在D盘下test目录里创建两个内容一样的文件,里面写入相同的内容
-
在test目录里创建两个内容不一样的文件,里面写入不相同的内容
开始使用
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
/**
* 清空目录,但不删除目录
*/
boolean f1 = FileUtils.contentEquals(new File("d:/test/a1.txt"), new File("d:/test/a2.txt"));
boolean f2 = FileUtils.contentEquals(new File("d:/test/b1.txt"), new File("d:/test/b2.txt"));
System.out.println(f1); // true;
System.out.println(f2); // false;
}
}
-
结果
(2)将文件拷贝到新地址
copyFile:将一个文件内容拷贝到一个新的地址
准备
-
在D盘下test目录里创建
aaa.txt
文件
开始
将指定的文件复制到D盘test目录里不存在的文件
bbb.txt
(会自动创建)
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
FileUtils.copyFile(new File("d:/test/aaa.txt"),new File("d:/test/bbb.txt"));
}
}
-
结果(创建了文件
bbb.txt
并把内容粘贴了进去)
(2)将文件拷贝到新地址
(3)将一个输入流的内容拷贝到某个文件
copyInputStreamToFile:将一个输入流的内容拷贝到某个文件(目录不存在就会创建)
准备
-
在
test
目录里创建aaa.txt
文件
开始
使用输入流读取文件,然后拷贝到不存在的目录aaa里
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
FileUtils.copyInputStreamToFile(new FileInputStream("d:/test/aaa.txt"),new File("d:/test/aaa/bbb.txt"));
}
}
-
结果
(4)删除文件
deleteQuietly:删除文件
准备
-
在test目录里创建文件
aaa.txt
开始
将创建的文件删除
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
FileUtils.deleteQuietly(new File("d:/test/aaa.txt"));
}
}
-
结果
(5)打开文件的输入流
openInputStream:打开指定文件的输入流
准备
-
在test目录下创建
aaa.txt
文件
使用
打开aaa文件的输入流
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
FileInputStream fis = FileUtils.openInputStream(new File("d:/test/aaa.txt"));
}
}
(6)将文件内容作为字符串返回
readFileToString:将文件内容作为字符串返回(自带换行)
准备
-
在test目录里创建
aaa.txt
文件,然后在里面编写一些测试内容
使用
读取aaa.txt文件内容
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String s = FileUtils.readFileToString(new File("d:/test/aaa.txt"), "utf-8");
System.out.println(s);
}
}
-
结果
(7)将文件内容按行返回到字符串数组中
readLines:将文件内容按行返回到字符串数组中
准备
-
在test目录下创建
aaa.txt
文件,然后在里面编写点测试内容
开始
按行读取
aaa.txt
文件里面的内容
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
import java.util.List;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
List<String> s = FileUtils.readLines(new File("d:/test/aaa.txt"),"utf-8");
for (String s1 : s) {
System.out.println(s1);
}
}
}
-
结果
(8)将字符串内容写到文件中
writeStringToFile:将字符串内容直接写到文件中(文件没有自动创建)
开始
将我是张三aaa换行输出到不存在的
aaa.txt
文件中
package com.tcc.test;
import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.*;
import java.util.Collection;
import java.util.List;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
// \t\n实现换行
FileUtils.writeStringToFile(new File("d:/test/aaa.txt"),"我是张三\t\naaa","utf-8");
}
}
-
结果
四、IO流常用API使用
1、操作两种流(IO)的
(1)、转为缓冲流
buffer():将传入的流转为缓冲流,并且可以通过参数指定缓冲大小
使用
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url = "d:/test/aaa.txt";
// 转为字节输入流包装流
BufferedInputStream bis1 = IOUtils.buffer(new FileInputStream(url));
BufferedInputStream bis2 = IOUtils.buffer(new FileInputStream(url),1024); // 指定缓冲大小
// 转为字节输出流包装流
BufferedOutputStream bos1 = IOUtils.buffer(new FileOutputStream(url));
BufferedOutputStream bos2 = IOUtils.buffer(new FileOutputStream(url),1024); // 指定缓冲大小
// 转为字符输入流包装流
BufferedReader br1 = IOUtils.buffer(new FileReader(url));
BufferedReader br2 = IOUtils.buffer(new FileReader(url),1024); // 指定缓冲大小
// 转为字符输出流包装流
BufferedWriter bw1 = IOUtils.buffer(new FileWriter(url));
BufferedWriter bw2 = IOUtils.buffer(new FileWriter(url),1024);
}
}
(2)、关闭流
closeQuietly():关闭打开的流
使用
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url = "d:/test/aaa.txt";
FileInputStream fis = new FileInputStream(url);
// 关闭流
IOUtils.closeQuietly(fis);
}
}
(3)、比较流中内容
contentEquals():比较流中内容是否相等,相等返回true,反之为false
准备
使用
比较两个文本中的内容是否相等
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/aaa.txt";
String url2 = "d:/test/bbb.txt";
// 比较字节流
FileInputStream fis1 = new FileInputStream(url1);
FileInputStream fis2 = new FileInputStream(url2);
boolean b = IOUtils.contentEquals(fis1, fis2);
System.out.println(b); // true;
// 比较字符流
FileReader fr1 = new FileReader(url1);
FileReader fr2 = new FileReader(url2);
boolean b2 = IOUtils.contentEquals(fis1, fis2);
System.out.println(b2); // true;
}
}
(4)拷贝
copy():将输入流中内容拷贝到输出流中,并可以指定字符编码
准备
开始
将
aaa.txt
,拷贝到当前目录,名字为bbb.txt
最好使用字节流当做参数,其他流使用有坑,字符流的粘贴不过来内容
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/aaa.txt";
String url2 = "d:/test/bbb.txt";
// 字节流输出到字节流,返回值为文本大小
int fileSize = IOUtils.copy(new FileInputStream(url1), new FileOutputStream(url2));
System.out.println(fileSize); // 17
}
}
(5)拷贝(大于2G)
copyLarge():拷贝内容,适合大于2G的内容,使用了缓冲流
准备
-
准备一个比较大的文本或者图片
开始
将上面文件拷贝一份,查看运行速度
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/testPic.png";
String url2 = "d:/test/testPic2.png";
// 拷贝字节流内容,返回文件大小 执行很快
long l = IOUtils.copyLarge(new FileInputStream(url1), new FileOutputStream(url2));
System.out.println(l); // 20673353
}
}
2、操作输入流的
(1)、返回迭代器
lineIterator():返回可以迭代每一行的迭代器
准备
开始
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/aaa.txt";
LineIterator lineIterator = IOUtils.lineIterator(new FileInputStream(url1), "utf-8");
// System.out.println(lineIterator.next()); // 我是张三
/**
* 我是张三
* aaa
*/
while (lineIterator.hasNext()){
System.out.println(lineIterator.next());
}
}
}
(2)、将输入流中的内容转为字符串
toString():将输入流中的内容转为字符串
准备
开始
读取文本里面内容
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/aaa.txt";
String s = IOUtils.toString(new FileInputStream(url1), "utf-8");
System.out.println(s); // 我是张三 aaa
}
}
(3)内容转为字节/字符数组
toByteArray():转为字节数组 toCharArray:转为字符数组
开始
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/aaa.txt";
/**
* -26
* -120
* -111
* -26
* -104
* -81
* -26
* -99
* -114
* -27
* -101
* -101
*/
byte[] bytes = IOUtils.toByteArray(new FileInputStream(url1));
for (byte aByte : bytes) {
System.out.println(aByte);
}
/**
* 我
* 是
* 李
* 四
*/
char[] chars = IOUtils.toCharArray(new FileInputStream(url1),"utf-8");
for (char aChar : chars) {
System.out.println(aChar);
}
}
}
结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46stNOFP-1665813842283)(img/1665813756045.png)]
3、操作输出流的
(1)、向流中写入内容
write():向流中写入内容,但会替换原来的内容
准备
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U5Gbe857-1665813842283)(img/1665797968219.png)]
开始
package com.tcc.test;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import java.io.*;
/**
* @author 宇辰
* @date 2022/8/31-8:53
**/
public class Test {
public static void main(String[] args) throws IOException {
String url1 = "d:/test/aaa.txt";
IOUtils.write("我是李四",new FileOutputStream(url1),"utf-8");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcds30Zr-1665813842284)(img/1665798923237.png)]