commons-io 是Apache封装好的库,包含使用程序类、流实现、文件过滤、文件比较器、endian转换类等。
代码中经常用到io流,自己写代码比较繁琐, 推荐使用commons-io工具类。
commons-io官网:Commons IO – Commons IO Overview
commons-io可以去官网下载也可以用Maven引入依赖
最新写法:
commons-io
commons-io
2.4
原来写法:
org.apache.commons
commons-io
1.3.2
使用举例
1.文件内容拷贝
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
publicclass FileCopyExample {
publicstaticvoid main(String[] args) {
try {
File src = new File( "test.dat" );
File dest = new File( "test.dat.bak" );
FileUtils.copyFile( src, dest );
} catch( IOException ioe ) {
System.out.println( "Problem copying file." );
}
try {
File src = new File( "test.dat" );
File dir = new File( "./temp" );
FileUtils.copyFileToDirectory( src, dir );
} catch( IOException ioe ) {
System.out.println( "Problem copying file to dir.");
}
try {
String string = "Blah blah blah";
File dest = new File( "test.tmp" );
FileUtils.writeStringToFile( dest, string, "ISO-8859-1" );
} catch( IOException ioe ) {
System.out.println( "Error writing out a String." );
}
try {
Writer writer = new FileWriter( "test.dat" );
InputStream inputStream =FileCopyExample.class.
getClass().getResourceAsStream("/io/web.xml");
IOUtils.copy( inputStream, writer );
writer.close();
inputStream.close();
} catch (IOException e) {
System.out.println( "Error copying data" );
}
try {
File src = new File( "test.txt" );
OutputStream output = new FileOutputStream(src);
InputStream inputStream =FileCopyExample.class.
getClass().getResourceAsStream("/io/web.xml");
IOUtils.copy( inputStream, output );
//writer.close();
inputStream.close();
output.close();
} catch (IOException e) {
System.out.println( "Error copying data" );
}
}
}
2.文件删除
File file = new File( ("io/project.properties") );
String display = FileUtils.byteCountToDisplaySize( file.length() );
System.out.println( "project.xml is " + display );
FileUtils.forceDelete(file)
3.读取取文本中的每一行
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileSystemUtils;
import org.apache.commons.io.FileUtils;
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File((Test.class.getClass().getResource("/io/web.xml")).getFile());
List lines = FileUtils.readLines(file, "UTF-8");
for(int i=0;i
copy方法有多个重载方法,满足不同的输入输出流
IOUtils.copy(InputStream input, OutputStream output)
IOUtils.copy(InputStream input, OutputStream output, int bufferSize)//可指定缓冲区大小
IOUtils.copy(InputStream input, Writer output, String inputEncoding)//可指定输入流的编码表
IOUtils.copy(Reader input, Writer output)
IOUtils.copy(Reader input, OutputStream output, String outputEncoding)//可指定输出流的编码表
拷贝大文件的方法:
// 这个方法适合拷贝较大的数据流,比如2G以上IOUtils.copyLarge(Reader input, Writer output) // 默认会用1024*4的buffer来读取
IOUtils.copyLarge(Reader input, Writer output, char[] buffer)//可指定缓冲区大小
IOUtils.lineIterator(Reader reader)
IOUtils.lineIterator(InputStream input, Charset encoding)
IOUtils.lineIterator(InputStream input, String encoding)
IOUtils.buffer(InputStream inputStream)
IOUtils.buffer(OutputStream outputStream)
IOUtils.buffer(Reader reader)
IOUtils.buffer(Writer writer)
IOUtils.close(URLConnection conn)
IOUtils.toString(Reader input)
IOUtils.toString(byte[] input, String encoding)
IOUtils.toString(InputStream input, Charset encoding)
IOUtils.toString(InputStream input, String encoding)
IOUtils.toString(URI uri, String encoding)
IOUtils.toString(URL url, String encoding)
IOUtils.toByteArray(InputStream input)
IOUtils.toByteArray(InputStream input, int size)
IOUtils.toByteArray(URI uri)
IOUtils.toByteArray(URL url)
IOUtils.toByteArray(URLConnection urlConn)
IOUtils.toByteArray(Reader input, String encoding)
IOUtils.readLines(Reader input)
IOUtils.readLines(InputStream input, Charset encoding)
IOUtils.readLines(InputStream input, String encoding)
IOUtils.writeLines(Collection> lines, String lineEnding, Writer writer)
IOUtils.writeLines(Collection> lines, String lineEnding, OutputStream output, Charset encoding)
IOUtils.writeLines(Collection> lines, String lineEnding, OutputStream output, String encoding)
从一个流中读取内容
IOUtils.read(InputStream input, byte[] buffer)IOUtils.read(InputStream input, byte[] buffer, int offset, int length) IOUtils.read(Reader input, char[] buffer)
IOUtils.read(Reader input, char[] buffer, int offset, int length)
IOUtils.write(byte[] data, OutputStream output)
IOUtils.write(byte[] data, Writer output, Charset encoding)
IOUtils.write(byte[] data, Writer output, String encoding)
IOUtils.write(char[] data, Writer output)
IOUtils.write(char[] data, OutputStream output, Charset encoding) IOUtils.write(char[] data, OutputStream output, String encoding)
IOUtils.write(String data, Writer output)
IOUtils.write(CharSequence data, Writer output)
IOUtils.readFully(InputStream input, int length)
IOUtils.readFully(InputStream input, byte[] buffer)
IOUtils.readFully(InputStream input, byte[] buffer, int offset, int length) IOUtils.readFully(Reader input, char[] buffer)
IOUtils.readFully(Reader input, char[] buffer, int offset, int length)
IOUtils.contentEquals(InputStream input1, InputStream input2) // 比较两个流是否相等
IOUtils.contentEquals(Reader input1, Reader input2)
IOUtils.contentEqualsIgnoreEOL(Reader input1, Reader input2) // 比较两个流,忽略换行符
IOUtils.skip(InputStream input, long toSkip) // 跳过指定长度的流
IOUtils.skip(Reader input, long toSkip)
IOUtils.skipFully(InputStream input, long toSkip) // 如果忽略的长度大于现有的长度,就会抛出异常
IOUtils.skipFully(Reader input, long toSkip)
FileUtils.copyDirectory(File srcDir, File destDir) // 复制文件夹(文件夹里面的文件内容也会复制)
FileUtils.copyDirectory(File srcDir, File destDir, FileFilter filter) // 复制文件夹,带有文件过滤功能
FileUtils.copyDirectoryToDirectory(File srcDir, File destDir) // 以子目录的形式将文件夹复制到到另一个文件夹下
FileUtils.copyFile(File srcFile, File destFile) // 复制文件
FileUtils.copyFile(File input, OutputStream output) // 复制文件到输出流
FileUtils.copyFileToDirectory(File srcFile, File destDir) // 复制文件到一个指定的目录
FileUtils.copyInputStreamToFile(InputStream source, File destination) // 把输入流里面的内容复制到指定文件
FileUtils.copyURLToFile(URL source, File destination) // 把URL 里面内容复制到文件(可以下载文件)
FileUtils.copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout)
FileUtils.writeStringToFile(File file, String data, String encoding)
FileUtils.writeStringToFile(File file, String data, String encoding, boolean append)
FileUtils.writeByteArrayToFile(File file, byte[] data)
FileUtils.writeByteArrayToFile(File file, byte[] data, boolean append) FileUtils.writeByteArrayToFile(File file, byte[] data, int off, int len) FileUtils.writeByteArrayToFile(File file, byte[] data, int off, int len, boolean append)
// encoding:文件编码,lineEnding:每行以什么结尾
FileUtils.writeLines(File file, Collection> lines)
FileUtils.writeLines(File file, Collection> lines, boolean append)
FileUtils.writeLines(File file, Collection> lines, String lineEnding)
FileUtils.writeLines(File file, Collection> lines, String lineEnding, boolean append)
FileUtils.writeLines(File file, String encoding, Collection> lines)
FileUtils.writeLines(File file, String encoding, Collection> lines, boolean append)
FileUtils.writeLines(File file, String encoding, Collection> lines, String lineEnding)
FileUtils.writeLines(File file, String encoding, Collection> lines, String lineEnding, boolean append)
FileUtils.write(File file, CharSequence data, Charset encoding)
FileUtils.write(File file, CharSequence data, Charset encoding, boolean append)
FileUtils.write(File file, CharSequence data, String encoding)
FileUtils.write(File file, CharSequence data, String encoding, boolean append)
FileUtils.moveDirectory(File srcDir, File destDir) // 文件夹在内的所有文件都将移动FileUtils.moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) // 以子文件夹的形式移动到另外一个文件下
FileUtils.moveFile(File srcFile, File destFile) // 移动文件
FileUtils.moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) // 以子文件的形式移动到另外一个文件夹下
FileUtils.moveToDirectory(File src, File destDir, boolean createDestDir) // 移动文件或者目录到指定的文件夹内
FileUtils.deleteDirectory(File directory) // 删除文件夹,包括文件夹和文件夹里面所有的文件
FileUtils.cleanDirectory(File directory) // 清空文件夹里面的所有的内容
FileUtils.forceDelete(File file) // 删除,会抛出异常
FileUtils.deleteQuietly(File file) // 删除,不会抛出异常
FileUtils.forceMkdir(File directory) // 创建文件夹(可创建多级)
FileUtils.forceMkdirParent(File file) // 创建文件的父级目录
FileUtils.openInputStream(File file)
FileUtils.openOutputStream(File file)
FileUtils.readFileToByteArray(File file) // 把文件读取到字节数组
FileUtils.readFileToString(File file, Charset encoding) // 把文件读取成字符串
FileUtils.readFileToString(File file, String encoding)
FileUtils.readLines(File file, Charset encoding) // 把文件读取成字符串集合
FileUtils.readLines(File file, String encoding)
FileUtils.isFileNewer(File file, Date date)
FileUtils.isFileNewer(File file, File reference)
FileUtils.isFileNewer(File file, long timeMillis)
FileUtils.isFileOlder(File file, Date date)
FileUtils.isFileOlder(File file, File reference)
FileUtils.isFileOlder(File file, long timeMillis)
FileUtils.iterateFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)
FileUtils.iterateFiles(File directory, String[] extensions, boolean recursive)
FileUtils.iterateFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)
FileUtils.lineIterator(File file)
FileUtils.lineIterator(File file, String encoding)
FileUtils.listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)
FileUtils.listFiles(File directory, String[] extensions, boolean recursive)
FileUtils.listFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)
FileUtils.isSymlink(File file) // 判断是否是符号链接
FileUtils.directoryContains(File directory, File child) // 判断文件夹内是否包含某个文件或者文件夹
FileUtils.sizeOf(File file) // 获取文件或者文件夹的大小
FileUtils.getTempDirectory()// 获取临时目录文件
FileUtils.getTempDirectoryPath()// 获取临时目录路径
FileUtils.getUserDirectory()// 获取用户目录文件
FileUtils.getUserDirectoryPath()// 获取用户目录路径
FileUtils.touch(File file) // 创建文件
FileUtils.contentEquals(File file1, File file2) // 比较两个文件内容是否相同
FilenameUtils
FilenameUtils.concat(String basePath, String fullFilenameToAdd) // 合并目录和文件名为文件全路径FilenameUtils.getBaseName(String filename) // 去除目录和后缀后的文件名
FilenameUtils.getExtension(String filename) // 获取文件的后缀
FilenameUtils.getFullPath(String filename) // 获取文件的目录
FilenameUtils.getName(String filename) // 获取文件名
FilenameUtils.getPath(String filename) // 去除盘符后的路径
FilenameUtils.getPrefix(String filename) // 盘符
FilenameUtils.indexOfExtension(String filename) // 获取最后一个.的位置
FilenameUtils.indexOfLastSeparator(String filename) // 获取最后一个/的位置
FilenameUtils.normalize(String filename) // 获取当前系统格式化路径
FilenameUtils.removeExtension(String filename) // 移除文件的扩展名
FilenameUtils.separatorsToSystem(String path) // 转换分隔符为当前系统分隔符
FilenameUtils.separatorsToUnix(String path) // 转换分隔符为linux系统分隔符
FilenameUtils.separatorsToWindows(String path) // 转换分隔符为windows系统分隔符
FilenameUtils.equals(String filename1, String filename2) // 判断文件路径是否相同,非格式化
FilenameUtils.equalsNormalized(String filename1, String filename2) // 判断文件路径是否相同,格式化
FilenameUtils.directoryContains(String canonicalParent, String canonicalChild) // 判断目录下是否包含指定文件或目录
FilenameUtils.isExtension(String filename, String extension) // 判断文件扩展名是否包含在指定集合(数组、字符串)中
FilenameUtils.wildcardMatch(String filename, String wildcardMatcher) // 判断文件扩展名是否和指定规则匹配
FilenameUtils.concat(String basePath, String fullFilenameToAdd) // 合并目录和文件名为文件全路径
FilenameUtils.getBaseName(String filename) // 去除目录和后缀后的文件名
FilenameUtils.getExtension(String filename) // 获取文件的后缀
FilenameUtils.getFullPath(String filename) // 获取文件的目录
FilenameUtils.getName(String filename) // 获取文件名
FilenameUtils.getPath(String filename) // 去除盘符后的路径
FilenameUtils.getPrefix(String filename) // 盘符
FilenameUtils.indexOfExtension(String filename) // 获取最后一个.的位置
FilenameUtils.indexOfLastSeparator(String filename) // 获取最后一个/的位置
FilenameUtils.normalize(String filename) // 获取当前系统格式化路径
FilenameUtils.removeExtension(String filename) // 移除文件的扩展名
FilenameUtils.separatorsToSystem(String path) // 转换分隔符为当前系统分隔符
FilenameUtils.separatorsToUnix(String path) // 转换分隔符为linux系统分隔符
FilenameUtils.separatorsToWindows(String path) // 转换分隔符为windows系统分隔符
FilenameUtils.equals(String filename1, String filename2) // 判断文件路径是否相同,非格式化
FilenameUtils.equalsNormalized(String filename1, String filename2) // 判断文件路径是否相同,格式化
FilenameUtils.directoryContains(String canonicalParent, String canonicalChild) // 判断目录下是否包含指定文件或目录
FilenameUtils.isExtension(String filename, String extension) // 判断文件扩展名是否包含在指定集合(数组、字符串)中
FilenameUtils.wildcardMatch(String filename, String wildcardMatcher) // 判断文件扩展名是否和指定规则匹配
FileSystemUtils的使用:
// 仅有这一个方法,及其重载方法FileSystemUtils.freeSpaceKb() throws IOException
//推荐使用
java.nio.file.FileStore.getUsableSpace()
在org.apache.commons.io.input包下有许多InputStrem类的实现,我们来测试一个最实用的类,TeeInputStream,将InputStream以及OutputStream作为参数传入其中,自动实现将输入流的数据读取到输出流中。
@Test
public void test() throws IOException {
// XmlStreamReader
File xml = new File("E:\\test\\data\\io\\test.xml");
XmlStreamReader xmlReader = new XmlStreamReader(xml);
System.out.println("XML encoding: " + xmlReader.getEncoding());
String INPUT = "This should go to the output.";
// TeeInputStream
ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
TeeInputStream tee = new TeeInputStream(in, out, true);
tee.read(new byte[INPUT.length()]);
System.out.println("Output stream: " + out.toString());
}
同样,在 org.apache.commons.io.output包中同样有OutputStream类的实现,这里介绍TeeOutputStream,它可以将输出流进行分流,换句话说我们可以用一个输入流将数据分别读入到两个不同的输出流。
@Test
public void test8() throws IOException {
String INPUT = "This should go to the output.";
// TeeOutputStream
ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));
ByteArrayOutputStream out1 = new ByteArrayOutputStream();
ByteArrayOutputStream out2 = new ByteArrayOutputStream();
TeeOutputStream teeOut = new TeeOutputStream(out1, out2);
TeeInputStream teeIn = new TeeInputStream(in, teeOut, true);
teeIn.read(new byte[INPUT.length()]);
System.out.println("Output stream 1: " + out1.toString());
System.out.println("Output stream 2: " + out2.toString());
}
类型:
FileFileFilter 仅接受文件
DirectoryFilter 仅接受目录
名称:
PrefixFileFilter 基于前缀(不带路径的文件名)
SuffixFileFilter 基于后缀(不带路径的文件名)
NameFileFilter 基于文件名称(不带路径的文件名)
WildcardFileFilter 基于通配符(不带路径的文件名)
RegexFileFilter 基于正则表达式
时间:
AgeFileFilter 基于最后修改时间
MagicNumberFileFileter 基于Magic Number
大小:
EmptyFileFilter 基于文件或目录是否为空
SizeFileFilter 基于文件尺寸
隐藏属性:
HiddenFileFilter 基于文件或目录是否隐藏
读写属性:
CanReadFileFilter 基于是否可读
CanWriteFileFilter 基于是否可写入
DelegateFileFilter 将普通的FileFilter和FilenameFilter包装成IOFileFilter
AndFileFilter 基于AND逻辑运算
OrFileFilter 基于OR逻辑运算
NotFileFilter 基于NOT逻辑运算
TrueFileFilter 不进行过滤
FalseFileFilter 过滤所有文件及目录
提供一些工厂方法用于生成各类文件过滤器
提供一些静态方法用于对指定的File集合进行过滤
FileFilterUtils.ageFileFilter(Date cutoffDate)
FileFilterUtils.and(IOFileFilter... filters)
FileFilterUtils.asFileFilter(FileFilter filter)
FileFilterUtils.directoryFileFilter()
FileFilterUtils.falseFileFilter()
FileFilterUtils.fileFileFilter()
FileFilterUtils.filter(IOFileFilter filter, File... files)
FileFilterUtils.filterList(IOFileFilter filter, File... files)
FileFilterUtils.filterSet(IOFileFilter filter, File... files)
FileFilterUtils.nameFileFilter(String name)
FileFilterUtils.notFileFilter(IOFileFilter filter)
FileFilterUtils.or(IOFileFilter... filters)
FileFilterUtils.prefixFileFilter(String prefix)
FileFilterUtils.sizeFileFilter(long threshold)
FileFilterUtils.suffixFileFilter(String suffix)
FileFilterUtils.trueFileFilter()
@Test
public void test() throws IOException {
String PARENT_DIR = "E:\\test\\data\\io\\filter";
File dir = new File(PARENT_DIR);
String[] acceptedNames = { "test", "testTxt.txt" };
// 匹配文件名
for (String file : dir.list(new NameFileFilter(acceptedNames, IOCase.INSENSITIVE))) {
System.out.println("File found, named: " + file);
}
System.out.println("=========================================");
// 根据通配符匹配
for (String file : dir.list(new WildcardFileFilter("*est*"))) {
System.out.println("Wildcard file found, named: " + file);
}
System.out.println("=========================================");
// 匹配前缀
for (String file : dir.list(new PrefixFileFilter("test"))) {
System.out.println("Prefix file found, named: " + file);
}
System.out.println("=========================================");
// 匹配后缀
for (String file : dir.list(new SuffixFileFilter(".txt"))) {
System.out.println("Suffix file found, named: " + file);
}
System.out.println("=========================================");
// 逻辑或
for (String file : dir
.list(new OrFileFilter(new WildcardFileFilter("*est*"), new SuffixFileFilter(".txt")))) {
System.out.println("Or file found, named: " + file);
}
System.out.println("=========================================");
// 逻辑与
for (String file : dir.list(new AndFileFilter(new WildcardFileFilter("*est*"),
new NotFileFilter(new SuffixFileFilter(".txt"))))) {
System.out.println("And/Not file found, named: " + file);
}
}
org.apache.commons.io.comparator包下只有这四个类:
CompositeFileComparator
DefaultFileComparator
DirectoryFileComparator
ExtensionFileComparator
LastModifiedFileComparator
NameFileComparator
PathFileComparator
SizeFileComparator
都有着四个方法:
compare(File file1, File file2)
sort(File... files)
sort(List
files) toString()
@Test
public void test() {
String dir = "E:\\test\\data\\io\\comparator";
// NameFileComparator 按名称
File dirFile = new File(dir);
NameFileComparator comparator = new NameFileComparator(IOCase.SENSITIVE);
File[] files = comparator.sort(dirFile.listFiles());
System.out.println("\nSorted by name files in parent directory: ");
for (File f : files) {
System.out.println("t" + f.getAbsolutePath());
}
// SizeFileComparator 按大小
SizeFileComparator sizeComparator = new SizeFileComparator(true);
File[] sizeFiles = sizeComparator.sort(dirFile.listFiles());
System.out.println("\nSorted by size files in parent directory: ");
for (File f : sizeFiles) {
System.out.println(f.getName() + " with size (kb): " + f.length());
}
// LastModifiedFileComparator 按修改时间
LastModifiedFileComparator lastModified = new LastModifiedFileComparator();
File[] lastModifiedFiles = lastModified.sort(dirFile.listFiles());
System.out.println("\nSorted by last modified files in parent directory: ");
for (File f : lastModifiedFiles) {
Date modified = new Date(f.lastModified());
System.out.println(f.getName() + " last modified on: " + modified);
}
}