平时对一些文件进行操作,比如说写文件,读文件,复制一个文件等,使用原生File操作需要读取源文件,生成流对象,再写入一个新的文件中一系列过程,使用apache commons-io帮我们封装了这些实现,有些操作可以很容易的使用它的api来实现。
这里使用2.6版本,javadoc参照commons-io-2.6
1、pom依赖加入commons-io
1
2
3
4
5
|
< dependency >
< groupId >commons-io</ groupId >
< artifactId >commons-io</ artifactId >
< version >2.6</ version >
</ dependency >
|
2、常用API使用
2.1 获取文件
1
2
3
4
5
|
// 最终路径为入参拼接起来即testPath + "a.txt"
File fileAA = FileUtils.getFile(testPath, "a.txt" );
// 获取某个目录下的文件,后面参数是拼接而成的
File fileAAA = FileUtils.getFile( new File(testPath), "a.txt" );
|
2.2 获取临时目录和用户目录
1
2
3
4
5
6
7
8
9
|
// 获取临时目录路径
// 每种操作系统有所不同,Windows一般是C:\DOCUME~1\用户~1\LOCALS~1\Temp,Solaris一般是:/var/tmp/,Linux和Mac OS X一般是:/tmp
// Windows的java.io.tmpdir属性值可以看环境变量->用户变量中的TMP。
File tempDirectory = FileUtils.getTempDirectory();
String tempDirectoryPath = FileUtils.getTempDirectoryPath();
File userDirectory = FileUtils.getUserDirectory();
String userDirectoryPath = FileUtils.getUserDirectoryPath();
System.out.println(tempDirectoryPath + " - " + tempDirectory);
System.out.println(userDirectoryPath + " - " + userDirectory.getName());
|
2.3 创建文件
1
2
3
|
// 创建文件(实现与Unix上“ touch”实用程序相同的行为。它会创建一个大小为0的新文件,或者如果文件已经存在,则将其打开和关闭而不进行修改,而是更新文件的日期和时间。)
File fileD = new File(testPath + "d.txt" );
FileUtils.touch(fileD);
|
2.4 写内容到文件
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
27
28
29
|
// 写文件
File fileB = new File(testPath + "b.txt" );
if (!fileB.exists()) {
fileB.createNewFile();
}
// 通过字节写入文件
FileUtils.writeByteArrayToFile(fileB, "Hello, smile" .getBytes());
FileUtils.writeByteArrayToFile(fileB, "Hello, sunshine" .getBytes(), true );
// 通过行写入文件(覆盖)
FileUtils.writeLines(fileB, Lists.newArrayList( "春夏秋冬, 三餐四季,只愿有你" ));
// 通过行写入文件(追加)
FileUtils.writeLines(fileB, Lists.newArrayList( "春风很柔,夏风很烈,秋风清爽,东风凛冽,你就是春夏秋冬的风" ), true );
// 字符串写入,不换行追加
FileUtils.writeStringToFile(fileB, "唯美有你" , "UTF-8" , true );
FileUtils.writeStringToFile(fileB, "哪里有你" , Charset.defaultCharset(), true );
File fileC = new File(testPath + "c.txt" );
if (!fileC.exists()) {
fileC.createNewFile();
}
// 流操作
fileInputStream = FileUtils.openInputStream(fileB);
// fileOutputStream = FileUtils.openOutputStream(fileC);
fileOutputStream = FileUtils.openOutputStream(fileC, true );
// 字节数组
byte [] buffer = new byte [ 1024 ];
// 将文件内容写到文件中
while (fileInputStream.read(buffer) != - 1 ) {
fileOutputStream.write(buffer);
}
|
2.5 读取文件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 按行读取文件内容
List list = FileUtils.readLines(fileAAA, "UTF-8" );
System.out.println(list.size() > 0 ? list.get( 0 ) : "" + list.size());
List<String> lines = FileUtils.readLines(fileB, Charset.defaultCharset());
System.out.println(lines.size() > 0 ? lines.get( 0 ) : "" + lines.size());
// 读取文件内容为字节
byte [] bytes = FileUtils.readFileToByteArray(fileB);
System.out.println( new String(bytes));
// 读取文件为String
String fileToString = FileUtils.readFileToString(fileB, "UTF-8" );
System.out.println(fileToString);
String fileToString2 = FileUtils.readFileToString(fileB, Charset.defaultCharset());
System.out.println(fileToString2);
|
2.6 获取目录文件及目录
1
2
3
4
5
6
7
|
// recursive是否递归查询,这里查询.txt文件,也可以指定其他格式的,如果extensions为null则查询所有类型的文件
Collection<File> listFiles = FileUtils.listFiles( new File(testPath), null , true );
Collection<File> listFiles2 = FileUtils.listFiles( new File(testPath), new String[]{ "txt" }, true );
// 获取某个目录下的所有文件 TrueFileFilter.INSTANCE表示匹配所有的
Collection<File> files1 = FileUtils.listFiles( new File(testPath), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
// 获取某个目录下的所有文件和文件目录 TrueFileFilter.INSTANCE表示匹配所有的
Collection<File> files2 = FileUtils.listFilesAndDirs( new File(testPath), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
|
2.7 文件内容比较
1
2
3
|
// 文件内容比较
boolean aa = FileUtils.contentEquals(fileA, fileAA);
boolean ab = FileUtils.contentEquals(fileA, fileB);
|
2.8 文件或目录拷贝
1
2
3
4
5
6
7
8
9
10
|
// 文件复制,将文件A的内容复制给文件D
FileUtils.copyFile(fileA, fileD);
// 把文件复制到某个目录下
FileUtils.copyFileToDirectory(fileD, new File(testPath + "inner" ));
// 把某个目录拷贝到另外一个目录
FileUtils.copyDirectoryToDirectory( new File(testPath + "inner" ), new File(testPath + "other" ));
// 把文件或目录拷贝到指定目录
FileUtils.copyToDirectory(fileB, new File(testPath + "inner" ));
// 文件目录复制
FileUtils.copyDirectory( new File(testPath + "inner" ), new File(testPath + "first" ));
|
2.9 文件或目录删除
1
2
3
4
5
|
// 删除目录
FileUtils.deleteDirectory( new File(testPath + "first" ));
// 删除文件或目录
FileUtils.deleteQuietly(fileD);
FileUtils.deleteQuietly( new File(testPath + "first" ));
|
这就是FileUtils工具类的一些常用操作API使用。
apache commons-io的FileUtils.copyFile简单地复制文件
一般的方法,我们要复制一个文件,可能需要读取源文件,生成流对象,再写入一个新的文件中,使用apache commons-io很容就可以处理文件的复制。
下面的例子演示我们怎样使用FileUtils.copyFile方法在同一个文件夹复制文件和使用FileUtils.copyFileToDirectory方法复制到指定的文件夹中。其中System.getProperty("java.io.tmpdir")为通过JVM读取java.io.tmpdir属性取得临时文件夹,每种操作系统有所不同,Windows一般是C:\DOCUME~1\用户~1\LOCALS~1\Temp,Solaris一般是:/var/tmp/,Linux和Mac OS X一般是:/tmp,Windows的java.io.tmpdir属性值可以看环境变量->用户变量中的TMP。
当然我们一般使用的是绝对或相对路径,如要复制到F:\ajava目录中,我们只需将targetDir改成File targetDir = new File("F:\\ajava");运行后就可以看到结果。
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
27
28
29
30
31
32
33
|
package ajava.sample.apache;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
public class AjavaFileCopyExample {
public static void main(String[] args)
{
// 源File对象
File source = new File( "ajava.txt" );
// 备份的File对象
File target = new File( "ajava-backup.txt" );
//通过JVM读取java.io.tmpdir属性取得临时文件夹
File targetDir = new File(System.getProperty( "java.io.tmpdir" ));
try
{
//在同一个文件夹复制文件
System.out.println( "复制 " + source + " 文件到 " + target);
FileUtils.copyFile(source, target);
// 根据指定的文件夹复制
System.out.println( "复制 " + source + " 文件到" + targetDir + "目录" );
FileUtils.copyFileToDirectory(source, targetDir);
} catch (IOException e)
{
// Errors will be reported here if any error occures during copying
// the file
e.printStackTrace();
}
}
}
|
输出结果为:
复制 ajava.txt 文件到 ajava-backup.txt
复制 ajava.txt 文件到C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp目录
再查看对应的文件夹,就可以发现备份文件。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/kingsonfu/p/11799885.html