Apache Commons IO 示例

来源:互联网 发布:excel 宏 知乎 编辑:程序博客网 时间:2024/05/17 03:03

Apache Commons IO是由Apache Foundation维护的java库,它提供了多种类库使开发者能够很容易地完成一些常见的任务,简化那些被反复的样板化的代码。这个类库的重要性是巨大的,因为它非常成熟,并且由有经验的开发者维护,他们会考虑到各种情形,和修复他们遇到的不同种类的bug。

下面会展示org.apache.commons.io包的几个不同功能,下面的代码会分成以下几类,每一类都表示Apache Commons IO所覆盖的领域,这些领域包括:
- Utility classes
- Input
- Output
- Filters
- Comparators
- File Monitor

Utility classes

org.apache.commons.io中有不同的工具类,几种大多数跟文件操作和字符串比较相关,下面给出最重要的几个:
- FilenameUtils:这个类主要处理文件名, 在Unix和Windows上同样适用;
- FileUtils: 提供了文件操作的方法(移动、打开和读取、检查文件是否存在等);
- IOCase: 字符串的操作和比较;
- FileSystemUtils:它的方法主要返回指定驱动的空闲空间;

Utility代码示例:

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.txtExtension of exampleTxt: txtBase name of exampleTxt: exampleTxtContents of exampleTxt...    This is an example text file.    We will use it for experimenting with Apache Commons IO.Parent directory contains exampleTxt file: trueEnds with string (case sensitive): falseEnds with string (case insensitive): trueString equality: falseFree disk space (in KB): 32149292Free disk space (in MB): 31395

File Monitor

org.apache.commons.io.monitor包含了获取文件的特定信息,但是更重要的是它能够创建handlers,用于最终特定文件或文件夹的变化,示例如下:

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.txtFile name: exampleFileEntry.txtIs the file a directory?: falseDirectory created: newDirFile created: newFile.txtDirectory deleted: newDirFile deleted: newFile.txt

在这里我们使用org.apache.commons.io.monitor包创建了handlers用来监听特定的事件,为了实现该目标,主要有一下几步:
- 创建File对象,然后应用到想要监听的目录上;
- 创建FileAlterationObserver对象,它负责观察这些变化;
- 使用addListener()方法添加FileAlterationListenerAdaptor观察者;
- 创建FileAlterationMonitor并添加观察者;
- 使用start()方法启动monitor,必要的时候使用stop()方法终止它。

Filters

Filters主要用于不同文件的区分,得到满足特定条件的文件。而且也可以联合多个filters执行逻辑比较,获取更加精准的文件类型。
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: exampleFile found, named: exampleTxt.txtWildcard file found, named: exampleWildcard file found, named: exampleFileEntry.txtWildcard file found, named: exampleTxt.txtPrefix file found, named: examplePrefix file found, named: exampleFileEntry.txtPrefix file found, named: exampleTxt.txtSuffix file found, named: exampleFileEntry.txtSuffix file found, named: exampleTxt.txtOr file found, named: exampleOr file found, named: exampleFileEntry.txtOr file found, named: exampleTxt.txtAnd/Not file found, named: example

Comparators

org.apache.commons.io.comparator包用于简单比较和排序文件和目录。

Comparators示例:

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.txtSorted 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): 4436Sorted 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 2014File 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

Input

org.apache.commons.io.input包中有多种对InputStream的实现。下面给出一个最实用的TeeInputStream,利用InputStreamOutputStream的参数自动拷贝输入读取的字节到输出。而且使用第三个boolean参数,用来最终关闭TeeInputStream,InputStreamOutputStream

Input示例:

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-8Output stream: This should go to the output.

Output

org.apache.commons.io.input类似,org.apache.commons.io.output 实现了OutputStream,用于不同的场景。TeeOutputStream允许输出流进行分支,也就是把一个输入流发送到两个不同的输出流上。

Output示例:

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.

原文:Apache Commons IO Tutorial: A beginner’s guide

1 0