Apache Commons IO入门教程(转)

Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍:

1) 工具类

2) 输入

3) 输出

4) filters过滤

5) Comparators

6) 文件监控

总的入口例子为:

public class ApacheCommonsExampleMain {

public static void main(String[] args) {

UtilityExample.runExample();

FileMonitorExample.runExample();

FiltersExample.runExample();

InputExample.runExample();

OutputExample.runExample();

ComparatorExample.runExample();

}

}

一 工具类包UtilityExample代码:

这个工具类包分如下几个主要工具类:

1) FilenameUtils:主要处理各种操作系统下对文件名的操作

2) FileUtils:处理文件的打开,移动,读取和判断文件是否存在

3) IOCASE:字符串的比较

4) FileSystemUtils:返回磁盘的空间大小

import java.io.File;

import java.io.IOException;

import org.apache.commons.io.FileSystemUtils;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.FilenameUtils;

import org.apache.commons.io.LineIterator;

import org.apache.commons.io.IOCase;

public final class UtilityExample {

// We are using the file exampleTxt.txt in the folder ExampleFolder,

// and we need to provide the full path to the Utility classes.

private static final String EXAMPLE_TXT_PATH =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\exampleTxt.txt";

private static final String PARENT_DIR =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample";

public static void runExample() throws IOException {

System.out.println("Utility Classes example...");

// FilenameUtils

System.out.println("Full path of exampleTxt: " +

FilenameUtils.getFullPath(EXAMPLE_TXT_PATH));

System.out.println("Full name of exampleTxt: " +

FilenameUtils.getName(EXAMPLE_TXT_PATH));

System.out.println("Extension of exampleTxt: " +

FilenameUtils.getExtension(EXAMPLE_TXT_PATH));

System.out.println("Base name of exampleTxt: " +

FilenameUtils.getBaseName(EXAMPLE_TXT_PATH));

// FileUtils

// We can create a new File object using FileUtils.getFile(String)

// and then use this object to get information from the file.

File exampleFile = FileUtils.getFile(EXAMPLE_TXT_PATH);

LineIterator iter = FileUtils.lineIterator(exampleFile);

System.out.println("Contents of exampleTxt...");

while (iter.hasNext()) {

System.out.println("\t" + iter.next());

}

iter.close();

// We can check if a file exists somewhere inside a certain directory.

File parent = FileUtils.getFile(PARENT_DIR);

System.out.println("Parent directory contains exampleTxt file: " +

FileUtils.directoryContains(parent, exampleFile));

// IOCase

String str1 = "This is a new String.";

String str2 = "This is another new String, yes!";

System.out.println("Ends with string (case sensitive): " +

IOCase.SENSITIVE.checkEndsWith(str1, "string."));

System.out.println("Ends with string (case insensitive): " +

IOCase.INSENSITIVE.checkEndsWith(str1, "string."));

System.out.println("String equality: " +

IOCase.SENSITIVE.checkEquals(str1, str2));

// FileSystemUtils

System.out.println("Free disk space (in KB): " + FileSystemUtils.freeSpaceKb("C:"));

System.out.println("Free disk space (in MB): " + FileSystemUtils.freeSpaceKb("C:") / 1024);

}

}

输出:

Utility Classes example...

Full path of exampleTxt: C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\

Full name of exampleTxt: exampleTxt.txt

Extension of exampleTxt: txt

Base name of exampleTxt: exampleTxt

Contents of exampleTxt...

This is an example text file.

We will use it for experimenting with Apache Commons IO.

Parent directory contains exampleTxt file: true

Ends with string (case sensitive): false

Ends with string (case insensitive): true

String equality: false

Free disk space (in KB): 32149292

Free disk space (in MB): 31395

二 FileMonitor工具类包

这个org.apache.commons.io.monitor 包中的工具类可以监视文件或者目录的变化,获得指定文件或者目录的相关信息,下面看例子:

import java.io.File;

import java.io.IOException;

import org.apache.commons.io.FileDeleteStrategy;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;

import org.apache.commons.io.monitor.FileAlterationMonitor;

import org.apache.commons.io.monitor.FileAlterationObserver;

import org.apache.commons.io.monitor.FileEntry;

public final class FileMonitorExample {

private static final String EXAMPLE_PATH =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\exampleFileEntry.txt";

private static final String PARENT_DIR =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder";

private static final String NEW_DIR =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\newDir";

private static final String NEW_FILE =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\newFile.txt";

public static void runExample() {

System.out.println("File Monitor example...");

// FileEntry

// We can monitor changes and get information about files

// using the methods of this class.

FileEntry entry = new FileEntry(FileUtils.getFile(EXAMPLE_PATH));

System.out.println("File monitored: " + entry.getFile());

System.out.println("File name: " + entry.getName());

System.out.println("Is the file a directory?: " + entry.isDirectory());

// File Monitoring

// Create a new observer for the folder and add a listener

// that will handle the events in a specific directory and take action.

File parentDir = FileUtils.getFile(PARENT_DIR);

FileAlterationObserver observer = new FileAlterationObserver(parentDir);

observer.addListener(new FileAlterationListenerAdaptor() {

@Override

public void onFileCreate(File file) {

System.out.println("File created: " + file.getName());

}

@Override

public void onFileDelete(File file) {

System.out.println("File deleted: " + file.getName());

}

@Override

public void onDirectoryCreate(File dir) {

System.out.println("Directory created: " + dir.getName());

}

@Override

public void onDirectoryDelete(File dir) {

System.out.println("Directory deleted: " + dir.getName());

}

});

// Add a monior that will check for events every x ms,

// and attach all the different observers that we want.

FileAlterationMonitor monitor = new FileAlterationMonitor(500, observer);

try {

monitor.start();

// After we attached the monitor, we can create some files and directories

// and see what happens!

File newDir = new File(NEW_DIR);

File newFile = new File(NEW_FILE);

newDir.mkdirs();

newFile.createNewFile();

Thread.sleep(1000);

FileDeleteStrategy.NORMAL.delete(newDir);

FileDeleteStrategy.NORMAL.delete(newFile);

Thread.sleep(1000);

monitor.stop();

} catch (IOException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

}

输出如下:

File Monitor example...

File monitored: C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleFileEntry.txt

File name: exampleFileEntry.txt

Is the file a directory?: false

Directory created: newDir

File created: newFile.txt

Directory deleted: newDir

File deleted: newFile.txt

上面的特性的确很赞!分析下,这个工具类包下的工具类,可以允许我们创建跟踪文件或目录变化的监听句柄,当文件目录等发生任何变化,都可以用“观察者”的身份进行观察,

其步骤如下:

1) 创建要监听的文件对象

2) 创建FileAlterationObserver 监听对象,在上面的例子中,

File parentDir = FileUtils.getFile(PARENT_DIR);

FileAlterationObserver observer = new FileAlterationObserver(parentDir);

创建的是监视parentDir目录的变化,

3) 为观察器创建FileAlterationListenerAdaptor的内部匿名类,增加对文件及目录的增加删除的监听

4) 创建FileAlterationMonitor监听类,每隔500ms监听目录下的变化,其中开启监视是用monitor的start方法即可。

三 过滤器 filters

先看例子:

import java.io.File;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.IOCase;

import org.apache.commons.io.filefilter.AndFileFilter;

import org.apache.commons.io.filefilter.NameFileFilter;

import org.apache.commons.io.filefilter.NotFileFilter;

import org.apache.commons.io.filefilter.OrFileFilter;

import org.apache.commons.io.filefilter.PrefixFileFilter;

import org.apache.commons.io.filefilter.SuffixFileFilter;

import org.apache.commons.io.filefilter.WildcardFileFilter;

public final class FiltersExample {

private static final String PARENT_DIR =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder";

public static void runExample() {

System.out.println("File Filter example...");

// NameFileFilter

// Right now, in the parent directory we have 3 files:

// directory example

// file exampleEntry.txt

// file exampleTxt.txt

// Get all the files in the specified directory

// that are named "example".

File dir = FileUtils.getFile(PARENT_DIR);

String[] acceptedNames = {"example", "exampleTxt.txt"};

for (String file: dir.list(new NameFileFilter(acceptedNames, IOCase.INSENSITIVE))) {

System.out.println("File found, named: " + file);

}

//WildcardFileFilter

// We can use wildcards in order to get less specific results

// ? used for 1 missing char

// * used for multiple missing chars

for (String file: dir.list(new WildcardFileFilter("*ample*"))) {

System.out.println("Wildcard file found, named: " + file);

}

// PrefixFileFilter

// We can also use the equivalent of startsWith

// for filtering files.

for (String file: dir.list(new PrefixFileFilter("example"))) {

System.out.println("Prefix file found, named: " + file);

}

// SuffixFileFilter

// We can also use the equivalent of endsWith

// for filtering files.

for (String file: dir.list(new SuffixFileFilter(".txt"))) {

System.out.println("Suffix file found, named: " + file);

}

// OrFileFilter

// We can use some filters of filters.

// in this case, we use a filter to apply a logical

// or between our filters.

for (String file: dir.list(new OrFileFilter(

new WildcardFileFilter("*ample*"), new SuffixFileFilter(".txt")))) {

System.out.println("Or file found, named: " + file);

}

// And this can become very detailed.

// Eg, get all the files that have "ample" in their name

// but they are not text files (so they have no ".txt" extension.

for (String file: dir.list(new AndFileFilter( // we will match 2 filters...

new WildcardFileFilter("*ample*"), // ...the 1st is a wildcard...

new NotFileFilter(new SuffixFileFilter(".txt"))))) { // ...and the 2nd is NOT .txt.

System.out.println("And/Not file found, named: " + file);

}

}

}

可以看清晰看到,使用过滤器,可以分别在指定的目录下,寻找符合条件

的文件,比如以什么开头的文件名,支持通配符,甚至支持多个过滤器进行或的操作!

输出如下:

File Filter example...

File found, named: example

File found, named: exampleTxt.txt

Wildcard file found, named: example

Wildcard file found, named: exampleFileEntry.txt

Wildcard file found, named: exampleTxt.txt

Prefix file found, named: example

Prefix file found, named: exampleFileEntry.txt

Prefix file found, named: exampleTxt.txt

Suffix file found, named: exampleFileEntry.txt

Suffix file found, named: exampleTxt.txt

Or file found, named: example

Or file found, named: exampleFileEntry.txt

Or file found, named: exampleTxt.txt

And/Not file found, named: example

四 Comparators比较器

org.apache.commons.io.comparator包下的工具类,可以方便进行文件的比较:

import java.io.File;

import java.util.Date;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.IOCase;

import org.apache.commons.io.comparator.LastModifiedFileComparator;

import org.apache.commons.io.comparator.NameFileComparator;

import org.apache.commons.io.comparator.SizeFileComparator;

public final class ComparatorExample {

private static final String PARENT_DIR =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder";

private static final String FILE_1 =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\example";

private static final String FILE_2 =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\ExampleFolder\\exampleTxt.txt";

public static void runExample() {

System.out.println("Comparator example...");

//NameFileComparator

// Let's get a directory as a File object

// and sort all its files.

File parentDir = FileUtils.getFile(PARENT_DIR);

NameFileComparator comparator = new NameFileComparator(IOCase.SENSITIVE);

File[] sortedFiles = comparator.sort(parentDir.listFiles());

System.out.println("Sorted by name files in parent directory: ");

for (File file: sortedFiles) {

System.out.println("\t"+ file.getAbsolutePath());

}

// SizeFileComparator

// We can compare files based on their size.

// The boolean in the constructor is about the directories.

// true: directory's contents count to the size.

// false: directory is considered zero size.

SizeFileComparator sizeComparator = new SizeFileComparator(true);

File[] sizeFiles = sizeComparator.sort(parentDir.listFiles());

System.out.println("Sorted by size files in parent directory: ");

for (File file: sizeFiles) {

System.out.println("\t"+ file.getName() + " with size (kb): " + file.length());

}

// LastModifiedFileComparator

// We can use this class to find which file was more recently modified.

LastModifiedFileComparator lastModified = new LastModifiedFileComparator();

File[] lastModifiedFiles = lastModified.sort(parentDir.listFiles());

System.out.println("Sorted by last modified files in parent directory: ");

for (File file: lastModifiedFiles) {

Date modified = new Date(file.lastModified());

System.out.println("\t"+ file.getName() + " last modified on: " + modified);

}

// Or, we can also compare 2 specific files and find which one was last modified.

// returns > 0 if the first file was last modified.

// returns 0)

System.out.println("File " + file1.getName() + " was modified last because...");

else

System.out.println("File " + file2.getName() + "was modified last because...");

System.out.println("\t"+ file1.getName() + " last modified on: " +

new Date(file1.lastModified()));

System.out.println("\t"+ file2.getName() + " last modified on: " +

new Date(file2.lastModified()));

}

}

输出如下:

Comparator example...

Sorted by name files in parent directory:

C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\comparator1.txt

C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\comperator2.txt

C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\example

C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleFileEntry.txt

C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleTxt.txt

Sorted by size files in parent directory:

example with size (kb): 0

exampleTxt.txt with size (kb): 87

exampleFileEntry.txt with size (kb): 503

comperator2.txt with size (kb): 1458

comparator1.txt with size (kb): 4436

Sorted by last modified files in parent directory:

exampleTxt.txt last modified on: Sun Oct 26 14:02:22 EET 2014

example last modified on: Sun Oct 26 23:42:55 EET 2014

comparator1.txt last modified on: Tue Oct 28 14:48:28 EET 2014

comperator2.txt last modified on: Tue Oct 28 14:48:52 EET 2014

exampleFileEntry.txt last modified on: Tue Oct 28 14:53:50 EET 2014

File example was modified last because...

example last modified on: Sun Oct 26 23:42:55 EET 2014

exampleTxt.txt last modified on: Sun Oct 26 14:02:22 EET 2014

可以看到,在上面的代码中

NameFileComparator: 文件名的比较器,可以进行文件名称排序;

SizeFileComparator: 按照文件大小比较

LastModifiedFileComparator: 根据最新修改日期比较

五 input包

在 common io的org.apache.commons.io.input 包中,有各种对InputStream的实现类:

我们看下其中的TeeInputStream, ,它接受InputStream和Outputstream参数,例子如下:

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.IOException;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.input.TeeInputStream;

import org.apache.commons.io.input.XmlStreamReader;

public final class InputExample {

private static final String XML_PATH =

"C:\\Users\\Lilykos\\workspace\\ApacheCommonsExample\\InputOutputExampleFolder\\web.xml";

private static final String INPUT = "This should go to the output.";

public static void runExample() {

System.out.println("Input example...");

XmlStreamReader xmlReader = null;

TeeInputStream tee = null;

try {

// XmlStreamReader

// We can read an xml file and get its encoding.

File xml = FileUtils.getFile(XML_PATH);

xmlReader = new XmlStreamReader(xml);

System.out.println("XML encoding: " + xmlReader.getEncoding());

// TeeInputStream

// This very useful class copies an input stream to an output stream

// and closes both using only one close() method (by defining the 3rd

// constructor parameter as true).

ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));

ByteArrayOutputStream out = new ByteArrayOutputStream();

tee = new TeeInputStream(in, out, true);

tee.read(new byte[INPUT.length()]);

System.out.println("Output stream: " + out.toString());

} catch (IOException e) {

e.printStackTrace();

} finally {

try { xmlReader.close(); }

catch (IOException e) { e.printStackTrace(); }

try { tee.close(); }

catch (IOException e) { e.printStackTrace(); }

}

}

}

输出:

Input example...

XML encoding: UTF-8

Output stream: This should go to the output.

tee = new TeeInputStream(in, out, true);

中,分别三个参数,将输入流的内容输出到输出流,true参数为最后关闭流

六 output工具类包

其中的org.apache.commons.io.output 是实现了outputstream,其中好特别的是

TeeOutputStream能将一个输入流分别输出到两个输出流

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import org.apache.commons.io.input.TeeInputStream;

import org.apache.commons.io.output.TeeOutputStream;

public final class OutputExample {

private static final String INPUT = "This should go to the output.";

public static void runExample() {

System.out.println("Output example...");

TeeInputStream teeIn = null;

TeeOutputStream teeOut = null;

try {

// TeeOutputStream

ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));

ByteArrayOutputStream out1 = new ByteArrayOutputStream();

ByteArrayOutputStream out2 = new ByteArrayOutputStream();

teeOut = new TeeOutputStream(out1, out2);

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());

} catch (IOException e) {

e.printStackTrace();

} finally {

// No need to close teeOut. When teeIn closes, it will also close its

// Output stream (which is teeOut), which will in turn close the 2

// branches (out1, out2).

try { teeIn.close(); }

catch (IOException e) { e.printStackTrace(); }

}

}

}

输出:

登录后复制

Output example...

Output stream 1: This should go to the output.

Output stream 2: This should go to the output.

---------------------------

原文链接https://blog.51cto.com/u_14230175/5910739