Commons Io 简明教程

Apache Commons IO - Quick Guide

Apache Commons IO - Overview

Apache Commons IO 库为文件的常见操作提供了各种实用类,涵盖了广泛的用例。它有助于避免编写样板代码。Apache Commons IO 库提供了以下类别的类:

  1. Utility classes − org.apache.commons.io 包下的这些类提供文件和字符串比较。以下是一些示例。 IOUtils − 提供用于读取、写入和复制文件的实用方法。这些方法与 InputStream、OutputStream、Reader 和 Writer 协同工作。 FilenameUtils − 提供无需使用文件对象即可处理文件名的方法。它以相同的方式适用于不同的操作系统。 FileUtils − 提供用于操作文件的方法,例如移动、打开、检查是否存在、读取文件等。这些方法使用 File 对象。 IOCase − 提供字符串操作和比较的方法。 FileSystemUtils − 提供获取磁盘驱动器上可用空间的方法。 LineIterator − 提供处理基于行的文件的一种灵活方法。

  2. Filter classes − org.apache.commons.io.filefilter 包下的 Filter 类提供基于逻辑条件(而非基于字符串的繁琐比较)过滤文件的方法。以下是一些示例。 NameFileFilter − 按名称过滤文件名。 WildcardFileFilter − 使用提供的通配符过滤文件。 SuffixFileFilter − 按后缀过滤文件。这用于检索特定类型的所有文件。 PrefixFileFilter − 按前缀过滤文件。 OrFileFilter − 在一组文件过滤器上提供条件 OR 逻辑。如果列表中的任何过滤器返回 true,则返回 true。否则,它返回 false。 AndFileFilter − 在一组文件过滤器上提供条件 And 逻辑。如果列表中的任何过滤器返回 false,则返回 false。否则,它返回 true。

  3. File Monitor classes − org.apache.commons.io.monitor 包下的文件监视器类提供对特定文件或文件夹中的更改进行跟踪的控件,并允许相应地对更改执行操作。以下是一些示例。

  4. Comparator classes − org.apache.commons.io.comparator 包下的文件监视器类允许轻松地比较和排序文件和目录。 NameFileComparator − 比较两个文件的名称。 SizeFileComparator − 比较两个文件的 size。 LastModifiedFileComparator − 比较两个文件的上次修改日期。

  5. Stream classes − 存在多个 org.apache.commons.io.input 包下的 InputStream 实现和 org.apache.commons.io.output 包下的 OutputStream 实现,用于在流上执行有用的任务。以下是一些示例。 NullOutputStream − 吸收发送的所有错误数据。 TeeOutputStream − 将输出发送到两个流。 ByteArrayOutputStream − JDK 类的更快速版本。 CountingOutputStream − 统计通过流传递的字节数。 CountingOutputStream − 统计通过流传递的字节数。 ProxyOutputStream − 更改对代理流的调用。 LockableFileWriter − 创建锁定文件并允许进行简单的跨线程文件锁定处理的 FileWriter。

Apache Commons IO - Environment Setup

在本章中,我们将了解 Apache Commons IO 的本地环境设置以及如何设置 Windows 2000/XP、Windows 95/98/ME 等的 Commons IO 路径。我们还将了解一些流行的 Java 编辑器以及如何下载 Commons IO 存档。

Local Environment Setup

System Requirements

JDK

Java SE 2 JDK 1.8 或更高版本

Memory

1 GB RAM (recommended)

Disk Space

No minimum requirement

Operating System Version

Windows XP 或更高版本、Linux

Verify your Java Installation

首先,你的系统中需要安装 Java 软件开发工具包 (SDK)。要验证这一点,请根据所使用的平台执行以下两个命令。

如果 Java 安装已正确完成,则它将显示 Java 安装的当前版本和规范。以下表中给出了一个示例输出。

Platform

Command

Sample Output

Windows

打开命令控制台并键入 >java -version

java version "11.0.11" 2021-04-20 LTSJava™ SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)Java HotSpot™ 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)

Linux

打开命令终端并键入 $java -version

java version "11.0.11" 2021-04-20 LTSOpen JDK Runtime Environment 18.9 (build 11.0.11+9-LTS-194)Open JDK 64-Bit Server VM (build 11.0.11+9-LTS-194, mixed mode)

  1. 我们假设本教程的读者已在他们的系统中安装了 Java SDK 版本 11.0.11。

  2. 如果您没有 Java SDK,请从 www.oracle.com/technetwork/java/javase/downloads/index.html 下载其当前版本并将其安装。

Set your Java Environment

设置环境变量 JAVA_HOME 以指向计算机上安装 Java 的基本目录位置。例如,

Sr.No.

Platform & Description

1

Windows Set JAVA_HOME to C:\ProgramFiles\java\jdk11.0.11

2

Linux Export JAVA_HOME = /usr/local/java-current

将 Java 编译器位置的完整路径附加到系统路径。

Sr.No.

Platform & Description

1

Windows 将字符串“C:\Program Files\Java\jdk11.0.11\bin”附加到系统变量 PATH 的末尾。

2

Linux Export PATH = $PATH:$JAVA_HOME/bin/

如上所述,从命令提示符执行命令 java -version

要编写 Java 程序,您需要一个文本编辑器。市场上有许多复杂的集成开发环境 (IDE)。但是现在,您可以考虑以下项之一:

  1. Notepad − 在 Windows 计算机上,您可以使用任何简单的文本编辑器,例如记事本(推荐用于本教程)、TextPad。

  2. Netbeans − 它是一个开源免费的 Java IDE,可以从 www.netbeans.org/index.html 下载。

  3. Eclipse − 它也是一个由 eclipse 开源社区开发的 Java 集成开发环境,可以从 www.eclipse.org 下载。

Download Common IO Archive

commons-io-2.11.0-bin.zip 下载 Apache Common IO jar 文件的最新版本。在编写本教程时,我们已经下载了 commons-io-2.11.0-bin.zip 并将其复制到 C:\>Apache 文件夹中。

OS

Archive name

Windows

commons-io-2.11.0-bin.zip

Linux

commons-io-2.11.0-bin.tar.gz

Mac

commons-io-2.11.0-bin.tar.gz

Set Apache Common IO Environment

设置 APACHE_HOME 环境变量以指向机器上存储 Apache jar 的基本目录位置。假设我们在各种操作系统中将 commons-io-2.11.0-bin.zip 提取到 Apache 文件夹中,如下所示。

OS

Output

Windows

将环境变量 APACHE_HOME 设置为 C:\Apache

Linux

export APACHE_HOME=/usr/local/Apache

Mac

export APACHE_HOME=/Library/Apache

Set CLASSPATH Variable

设置 CLASSPATH 环境变量以指向 Common IO jar 位置。假设您已将 commons-io-2.11.0-bin.zip 存储在各种操作系统的 Apache 文件夹中,如下所示。

OS

Output

Windows

设置环境变量 CLASSPATH 为 %CLASSPATH%;%APACHE_HOME%\commons-io-2.11.0.jar;。

Linux

export CLASSPATH=$CLASSPATH:$APACHE_HOME/commons-io-2.11.0.jar:.

Mac

export CLASSPATH=$CLASSPATH:$APACHE_HOME/commons-io-2.11.0.jar:.

Apache Commons IO - IOUtils Class

提供用于读取、写入和复制文件的实用方法。这些方法与 InputStream、OutputStream、Reader 和 Writer 协同工作。

Class Declaration

以下是 org.apache.commons.io.IOUtils 类的声明 -

public class IOUtils
   extends Object

Features

  1. 提供用于输入/输出操作的静态实用程序方法。

  2. toXXX() - 从流读取数据。

  3. write() - 将数据写入流。

  4. copy() - 将所有数据从一个流复制到另一个流。

  5. contentEquals - 比较两个流的内容。

Example of IOUtils Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.commons.io.IOUtils;

public class IOTester {
   public static void main(String[] args) {
      try{
         //Using BufferedReader
         readUsingTraditionalWay();

         //Using IOUtils
         readUsingIOUtils();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   //reading a file using buffered reader line by line
   public static void readUsingTraditionalWay() throws IOException{
      try (BufferedReader bufferReader
         = new BufferedReader(
            new InputStreamReader(
               new FileInputStream("input.txt") ) )) {
         String line;
         while ( ( line = bufferReader.readLine() ) != null ) {
            System.out.println( line );
         }
      }
   }

   //reading a file using IOUtils in one go
   public static void readUsingIOUtils() throws IOException {
      try(InputStream in = new FileInputStream("input.txt")){
         System.out.println( IOUtils.toString( in , "UTF-8") );
      }
   }
}

Output

它将打印以下结果。

Welcome to TutorialsPoint. Simply Easy Learning.
Welcome to TutorialsPoint. Simply Easy Learning.

Apache Commons IO - FileUtils Class

提供操作文件的方法,例如移动、打开、检查是否存在、读取文件等。这些方法使用 File Object。

Class Declaration

以下是 org.apache.commons.io.FileUtils 类的声明 -

public class FileUtils
   extends Object

Features

  1. 写入文件的方法。

  2. 从文件读取的方法。

  3. 生成目录(包括父目录)的方法。

  4. 复制文件和目录的方法。

  5. 删除文件和目录的方法。

  6. 转换为 URL 和从 URL 转换的方法。

  7. 按过滤器和扩展名列出文件和目录的方法。

  8. 比较文件内容的方法。

  9. 获取文件上次更改日期的方法。

  10. 计算校验和的方法。

Example of FileUtils Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.commons.io.FileUtils;

public class IOTester {
   public static void main(String[] args) {
      try{
         //Using FileUtils
         usingFileUtils();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingFileUtils() throws IOException {
      //get the file object
      File file = FileUtils.getFile("input.txt");

      //get the temp directory
      File tmpDir = FileUtils.getTempDirectory();

      System.out.println(tmpDir.getName());

      //copy file to temp directory
      FileUtils.copyFileToDirectory(file, tmpDir);

      //create a new file
      File newTempFile = FileUtils.getFile(tmpDir, file.getName());

      //get the content
      String data = FileUtils.readFileToString(newTempFile, Charset.defaultCharset());

      //print the content
      System.out.println(data);
   }
}

Output

它将打印以下结果。

Temp
Welcome to TutorialsPoint. Simply Easy Learning.

Apache Commons IO - FilenameUtils Class

提供一种方法来使用文件名而不使用 File Object 来工作。它以类似的方式在不同的操作系统上工作。此类解决从基于 Windows 的开发机器移至基于 Unix 的生产机器时的问题。

Class Declaration

以下是 org.apache.commons.io.FilenameUtils 类的声明 -

public class FilenameUtils
   extends Object

Features

此类在文件名中定义了六个组件。考虑一个示例位置 C:\dev\project\file.txt 。然后组件是:

  1. Prefix - C:\

  2. Relative Path - dev\project\

  3. Absolute path - C:\dev\project\

  4. Name - file.txt

  5. Base name - file

  6. Extension - txt

要识别目录,请向文件名添加分隔符。

Example of FilenameUtils Class

IOTester.java

import java.io.IOException;
import org.apache.commons.io.FilenameUtils;

public class IOTester {
   public static void main(String[] args) {
      try{
         //Using FilenameUtils
         usingFilenameUtils();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingFilenameUtils() throws IOException {
      String path = "C:\\dev\\project\\file.txt";
      System.out.println("Full Path: " +FilenameUtils.getFullPath(path));
      System.out.println("Relative Path: " +FilenameUtils.getPath(path));
      System.out.println("Prefix: " +FilenameUtils.getPrefix(path));
      System.out.println("Extension: " + FilenameUtils.getExtension(path));
      System.out.println("Base: " + FilenameUtils.getBaseName(path));
      System.out.println("Name: " + FilenameUtils.getName(path));

      String filename = "C:/commons/io/../lang/project.xml";
      System.out.println("Normalized Path: " + FilenameUtils.normalize(filename));
   }
}

Output

它将打印以下结果。

Full Path: C:\dev\project\
Relative Path: dev\project\
Prefix: C:\
Extension: txt
Base: file
Name: file.txt
Normalized Path: C:\commons\lang\project.xml

Apache Commons IO - FileSystemUtils Class

提供方法以获取磁盘驱动器上的可用空间。

Class Declaration

以下是 org.apache.commons.io.FileSystemUtils 类的声明 -

public class FileSystemUtils
   extends Object

Example of FileSystemUtils Class

IOTester.java

import java.io.IOException;

import org.apache.commons.io.FileSystemUtils;

public class IOTester {
   public static void main(String[] args) {
      try{
         System.out.println("Free Space " + FileSystemUtils.freeSpaceKb("C:/") + " Bytes");
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }
}

Output

它将打印以下结果。

Free Space 61355640 kb

Apache Commons IO - IOCase Enum

IO 大小写敏感性枚举。不同的操作系统对文件名的区分大小写有不同的规则。例如,Windows 对文件命名不区分大小写,而 Unix 则区分大小写。IOCase 捕捉到这种差异,提供了可控制如何执行文件名比较的枚举。它还提供使用枚举执行比较的方法。

Enum Declaration

以下是 org.apache.commons.io.IOCase 枚举的声明 -

public enum IOCase
   extends Enum<IOCase>
      implements Serializable

Example of IOCase Enum

IOTester.java

import java.io.IOException;
import org.apache.commons.io.IOCase;

public class IOTester {
   public static void main(String[] args) {
      try{
         usingIOCase();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingIOCase() throws IOException {
      String text = "Welcome to TutorialsPoint. Simply Easy Learning.";
      String text1 = "WELCOME TO TUTORIALSPOINT. SIMPLY EASY LEARNING.";

      System.out.println("Ends with Learning (case sensitive): " +
      IOCase.SENSITIVE.checkEndsWith(text1, "Learning."));

      System.out.println("Ends with Learning (case insensitive): " +
      IOCase.INSENSITIVE.checkEndsWith(text1, "Learning."));

      System.out.println("Equality Check  (case sensitive): " +
      IOCase.SENSITIVE.checkEquals(text, text1));

      System.out.println("Equality Check  (case insensitive): " +
      IOCase.INSENSITIVE.checkEquals(text, text1));
   }
}

Output

它将打印以下结果。

Ends with Learning (case sensitive): false
Ends with Learning (case insensitive): true
Equality Check  (case sensitive): false
Equality Check  (case insensitive): true

Apache Commons IO - LineIterator Class

提供了一种使用基于行的文件的方法。

Class Declaration

以下是 org.apache.commons.io.LineIterator 类的声明 -

public class LineIterator
   extends Object
      implements Iterator<String>, Closeable

Example of LineIterator Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.
Learn web technologies,
prepare exams,
code online,
all at one place.

IOTester.java

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;

public class IOTester {
   public static void main(String[] args) {
      try{
         usingLineIterator();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingLineIterator() throws IOException {
      //get the file object
      File file = FileUtils.getFile("input.txt");

      try(LineIterator lineIterator = FileUtils.lineIterator(file)){
         System.out.println("Contents of input.txt");
         while (lineIterator.hasNext()) {
            System.out.println(lineIterator.next());
         }
      }
   }
}

Output

它将打印以下结果。

Contents of input.txt
Welcome to TutorialsPoint. Simply Easy Learning.
Learn web technologies,
prepare exams,
code online,
all at one place.

Apache Commons IO - NameFileFilter Class

按名称筛选文件名。

Class Declaration

以下是 org.apache.commons.io.filefilter.NameFileFilter 类的声明 -

public class NameFileFilter
   extends AbstractFileFilter
      implements Serializable

Example of NameFileFilter Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

让我们打印当前目录中的所有文件和目录,然后筛选名称为 Input.txt 的文件。

IOTester.java

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.NameFileFilter;

public class IOTester {
   public static void main(String[] args) {
      try{
         usingNameFileFilter();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingNameFileFilter() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");
      //get names of all files and directory in current directory
      String[] files = currentDirectory.list();
      System.out.println("All files and Folders.\n");
      for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
      }
      System.out.println("\nFile with name input.txt\n");
      String[] acceptedNames = {"input", "input.txt"};
      String[] filesNames = currentDirectory.list( new NameFileFilter(acceptedNames, IOCase.INSENSITIVE) );

      for ( int i = 0; i < filesNames.length; i++ ) {
         System.out.println(filesNames[i]);
      }
   }
}

Output

它将打印以下结果。

All files and Folders.

.classpath
.project
.settings
bin
input.txt
src

File with name input.txt

input.txt

Apache Commons IO - WildcardFileFilter Class

使用提供的通配符筛选文件。

Class Declaration

以下是 org.apache.commons.io.filefilter.WildcardFileFilter 类的声明 -

public class WildcardFileFilter
   extends AbstractFileFilter
      implements Serializable

Example of WildcardFileFilter Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

让我们打印当前目录中的所有文件和目录,然后筛选名称以 t 结尾的文件。

IOTester.java

import java.io.File;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingWildcardFileFilter();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }
   public static void usingWildcardFileFilter() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");
      //get names of all files and directory in current directory
      String[] files = currentDirectory.list();
      System.out.println("All files and Folders.\n");
      for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
      }
      System.out.println("\nFile name ending with t.\n");
      String[] filesNames = currentDirectory.list( new WildcardFileFilter("*t") );
      for ( int i = 0; i < filesNames.length; i++ ) {
         System.out.println(filesNames[i]);
      }
   }
}

Output

它将打印以下结果。

All files and Folders.

.classpath
.project
.settings
bin
input.txt
src

File name ending with t

.project
input.txt

Apache Commons IO - SuffixFileFilter Class

根据后缀筛选文件。这用于检索特定类型的所有文件。

Class Declaration

以下是 org.apache.commons.io.filefilter.SuffixFileFilter 类的声明 -

public class SuffixFileFilter
   extends AbstractFileFilter
      implements Serializable

Example of SuffixFileFilter Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

让我们打印当前目录中的所有文件和目录,然后筛选扩展名为 txt 的文件。

IOTester.java

import java.io.File;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingSuffixFileFilter();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingSuffixFileFilter() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");
      //get names of all files and directory in current directory
      String[] files = currentDirectory.list();
      System.out.println("All files and Folders.\n");
      for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
      }
      System.out.println("\nFile with extenstion txt\n");
      String[] filesNames = currentDirectory.list( new SuffixFileFilter("txt") );
      for ( int i = 0; i < filesNames.length; i++ ) {
         System.out.println(filesNames[i]);
      }
   }
}

Output

它将打印以下结果。

All files and Folders.

.classpath
.project
.settings
bin
input.txt
src

File with extenstion txt

input.txt

Apache Commons IO - PrefixFileFilter Class

根据前缀筛选文件。

Class Declaration

以下是 org.apache.commons.io.filefilter.PrefixFileFilter 类的声明 -

public class PrefixFileFilter
   extends AbstractFileFilter
      implements Serializable

Example of PrefixFileFilter Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

让我们打印当前目录中的所有文件和目录, 然后使用以输入开头的名称过滤一个文件。

IOTester.java

import java.io.File;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingPrefixFileFilter();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingPrefixFileFilter() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");
      //get names of all files and directory in current directory
      String[] files = currentDirectory.list();
      System.out.println("All files and Folders.\n");
      for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
      }
      System.out.println("\nFile starting with input\n");
      String[] filesNames = currentDirectory.list( new PrefixFileFilter("input") );
      for ( int i = 0; i < filesNames.length; i++ ) {
         System.out.println(filesNames[i]);
      }
   }
}

Output

它将打印以下结果。

All files and Folders.

.classpath
.project
.settings
bin
input.txt
src

File with extenstion txt

input.txt

Apache Commons IO - OrFileFilter Class

提供跨文件筛选器列表的条件 OR 逻辑。如果列表中的任何过滤器返回 true, 则返回 true。否则, 它返回 false。

Class Declaration

以下是 org.apache.commons.io.filefilter.OrFileFilter 类声明 -

public class OrFileFilter
   extends AbstractFileFilter
      implements ConditionalFileFilter, Serializable

Example of OrFileFilter Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

让我们打印当前目录中的所有文件和目录, 然后用以。开头或以 t 结束的名称过滤文件。

IOTester.java

import java.io.File;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingOrFileFilter();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingOrFileFilter() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");
      //get names of all files and directory in current directory
      String[] files = currentDirectory.list();
      System.out.println("All files and Folders.\n");
      for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
      }
      System.out.println("\nFile starting with . or ends with t\n");
      String[] filesNames = currentDirectory.list(
         new OrFileFilter(new PrefixFileFilter("."), new WildcardFileFilter("*t")));
      for ( int i = 0; i < filesNames.length; i++ ) {
         System.out.println(filesNames[i]);
      }
   }
}

Output

它将打印以下结果。

All files and Folders.

.classpath
.project
.settings
bin
input.txt
src

File starting with . or ends with t

.classpath
.project
.settings
input.txt

Apache Commons IO - AndFileFilter Class

提供跨文件筛选器列表的条件 AND 逻辑。如果列表中的所有过滤器返回 true, 则返回 true。否则, 它返回 false。

Class Declaration

以下是 org.apache.commons.io.filefilter.AndFileFilter 类声明 -

public class AndFileFilter
   extends AbstractFileFilter
      implements ConditionalFileFilter, Serializable

Example of AndFileFilter Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

让我们打印当前目录中的所有文件和目录, 然后用以。开头且以 t 结束的名称过滤文件。

IOTester.java

import java.io.File;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingAndFileFilter();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }
   public static void usingAndFileFilter() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");
      //get names of all files and directory in current directory
      String[] files = currentDirectory.list();
      System.out.println("All files and Folders.\n");
      for ( int i = 0; i < files.length; i++ ) {
         System.out.println(files[i]);
      }
      System.out.println("\nFile starting with . and ends with t\n");
      String[] filesNames = currentDirectory.list(
         new AndFileFilter(new PrefixFileFilter("."), new WildcardFileFilter("*t")));
      for ( int i = 0; i < filesNames.length; i++ ) {
         System.out.println(filesNames[i]);
      }
   }
}

Output

它将打印以下结果。

All files and Folders.

.classpath
.project
.settings
bin
input.txt
src

File starting with . or ends with t

.project

Apache Commons IO - FileEntry Class

提供文件或目录的状态, 即一个时间点的文件属性。

Class Declaration

以下是对 org.apache.commons.io.monitor.FileEntry 类的声明 -

public class FileEntry
   extends Object
      implements Serializable

Features

FileEntry 类对象在时间点提供以下文件属性。

  1. getName() - file name.

  2. exists() - 检查文件是否存在。

  3. isDirectory() - 检查文件是否为目录。

  4. lastModified() - 给出最后修改日期时间。

  5. listFiles() - 给出目录的内容。

Example of FileEntry Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

import java.io.File;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingFileEntry();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingFileEntry() throws IOException {
      //get the file object
      File file = FileUtils.getFile("input.txt");

      FileEntry fileEntry = new FileEntry(file);

      System.out.println("Monitored File: " + fileEntry.getFile());
      System.out.println("File name: " + fileEntry.getName());
      System.out.println("Is Directory: " + fileEntry.isDirectory());
   }
}

Output

它将打印以下结果。

Monitored File: input.txt
File name: input.txt
Is Directory: false

Apache Commons IO - FileAlterationObserver Class

表示根目录下文件的状态, 检查文件系统, 并通知监听器创建、更改或删除事件。

Class Declaration

以下是 org.apache.commons.io.monitor.FileAlterationObserver 类声明 -

public class FileAlterationObserver
   extends Object
      implements Serializable

Example of FileAlterationObserver Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

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;

public class IOTester {
   public static void main(String[] args) {
      try{
         usingFileAlterationObserver();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingFileAlterationObserver() throws IOException {
      //get the file object
      File inputFile = FileUtils.getFile("input.txt");
      String absolutePath = inputFile.getAbsolutePath();
      String parent = absolutePath.substring(0,absolutePath.indexOf("input.txt"));
      File parentDirectory = FileUtils.getFile(parent);

      FileAlterationObserver observer = new FileAlterationObserver(parentDirectory);

      observer.addListener(new FileAlterationListenerAdaptor(){

         @Override
         public void onDirectoryCreate(File file) {
            System.out.println("Folder created: " + file.getName());
         }

         @Override
         public void onDirectoryDelete(File file) {
            System.out.println("Folder deleted: " + file.getName());
         }

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

      //create a monitor to check changes after every 500 ms
      FileAlterationMonitor monitor = new FileAlterationMonitor(500, observer);

      try{
         monitor.start();

         //create a new directory
         File newFolder = new File("test");
         File newFile = new File("test1");

         newFolder.mkdirs();
         Thread.sleep(1000);
         newFile.createNewFile();
         Thread.sleep(1000);
         FileDeleteStrategy.NORMAL.delete(newFolder);
         Thread.sleep(1000);
         FileDeleteStrategy.NORMAL.delete(newFile);
         Thread.sleep(1000);

         monitor.stop(10000);

      }catch(IOException e){
         System.out.println(e.getMessage());
      } catch(InterruptedException e){
         System.out.println(e.getMessage());
      }catch (Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

Output

它将打印以下结果。

Folder created: test
File created: test1
Folder deleted: test
File deleted: test1

Apache Commons IO - FileAlterationMonitor Class

Representa 一条线程, 它生成一个监视线程, 定期触发任何注册的 FileAlterationObserver。

Class Declaration

以下是 org.apache.commons.io.monitor.FileAlterationMonitor 类声明 -

public final class FileAlterationMonitor
   extends Object
      implements Runnable

Example of FileAlterationMonitor Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

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;

public class IOTester {
   public static void main(String[] args) {
      try{
         usingFileAlterationMonitor();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingFileAlterationMonitor() throws IOException {
      //get the file object
      File inputFile = FileUtils.getFile("input.txt");
      String absolutePath = inputFile.getAbsolutePath();
      String parent = absolutePath.substring(0,absolutePath.indexOf("input.txt"));
      File parentDirectory = FileUtils.getFile(parent);

      FileAlterationObserver observer = new FileAlterationObserver(parentDirectory);

      observer.addListener(new FileAlterationListenerAdaptor(){

         @Override
         public void onDirectoryCreate(File file) {
            System.out.println("Folder created: " + file.getName());
         }

         @Override
         public void onDirectoryDelete(File file) {
            System.out.println("Folder deleted: " + file.getName());
         }

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

      //create a monitor to check changes after every 500 ms
      FileAlterationMonitor monitor = new FileAlterationMonitor(500, observer);

      try{
         monitor.start();

         //create a new directory
         File newFolder = new File("test");
         File newFile = new File("test1");

         newFolder.mkdirs();
         Thread.sleep(1000);
         newFile.createNewFile();
         Thread.sleep(1000);
         FileDeleteStrategy.NORMAL.delete(newFolder);
         Thread.sleep(1000);
         FileDeleteStrategy.NORMAL.delete(newFile);
         Thread.sleep(1000);

         monitor.stop(10000);

      }catch(IOException e){
         System.out.println(e.getMessage());
      } catch(InterruptedException e){
         System.out.println(e.getMessage());
      }catch (Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

Output

它将打印以下结果。

Folder created: test
File created: test1
Folder deleted: test
File deleted: test1

Apache Commons IO - NameFileComparator Class

比较两个文件的名称。NameFileComparator 可用于使用文件名称按大小写敏感、不敏感或系统相关的大小写敏感的方式对文件列表或数组进行排序。

Class Declaration

下面是 org.apache.commons.io.comparator.NameFileComparator 类的声明 -

public class NameFileComparator
   extends Object
      implements Serializable

Example of NameFileComparator Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

import org.apache.commons.io.IOCase;
import org.apache.commons.io.comparator.NameFileComparator;
import org.apache.commons.io.filefilter.FileFileFilter;

public class IOTester {
   public static void main(String[] args) {
      try{
         usingNameFileComparator();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingNameFileComparator() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");

      NameFileComparator comparator = new NameFileComparator(IOCase.INSENSITIVE);

      File[] sortedFiles = comparator.sort(currentDirectory.listFiles((FileFilter)FileFileFilter.FILE));

      System.out.println("Sorted By Name: ");
      for(File file:sortedFiles){
         System.out.println(file.getName());
      }
   }
}

Output

它将打印以下结果。

Sorted By Name:
.classpath
.project
input.txt

Apache Commons IO - SizeFileComparator Class

比较两个文件/目录的大小。SizeFileComparator 可用于对文件列表或数组(按照其大小)或目录(按照其子项)进行排序。

Class Declaration

下面是 org.apache.commons.io.comparator.SizeFileComparator 类的声明 -

public class SizeFileComparator
   extends Object
      implements Serializable

Example of SizeFileComparator Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingSizeFileComparator();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingSizeFileComparator() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");

      SizeFileComparator comparator = new SizeFileComparator();

      File[] sortedFiles = comparator.sort(currentDirectory.listFiles((FileFilter)FileFileFilter.FILE));

      System.out.println("Sorted By Size: ");
      for(File file:sortedFiles){
         System.out.println(file.getName() + ", size(kb) :" + file.length());
      }
   }
}

Output

它将打印以下结果。

Sorted By Size:
input.txt, size:124
.project, size:382
.classpath, size:441

Apache Commons IO - LastModifiedFileComparator Class

比较两个文件/目录的最后修改日期。LastModifiedFileComparator 可用于对文件/目录列表或数组(按照其最后的修改日期)进行排序。

Class Declaration

下面是 org.apache.commons.io.comparator.LastModifiedFileComparator 类的声明 -

public class LastModifiedFileComparator
   extends Object
      implements Serializable

Example of LastModifiedFileComparator Class

以下是我们需要解析的输入文件 -

Welcome to TutorialsPoint. Simply Easy Learning.

IOTester.java

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Date;

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

public class IOTester {
   public static void main(String[] args) {
      try{
         usingLastModifiedFileComparator();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }

   public static void usingLastModifiedFileComparator() throws IOException {
      //get the current directory
      File currentDirectory = new File(".");

      LastModifiedFileComparator comparator = new LastModifiedFileComparator();

      File[] sortedFiles = comparator.sort(currentDirectory.listFiles((FileFilter)FileFileFilter.FILE));

      System.out.println("Sorted By Last Modified date: ");
      for(File file:sortedFiles){
         System.out.println(file.getName() + ", Modified on: " + new Date(file.lastModified()));
      }
   }
}

Output

它将打印以下结果。

Sorted By Last Modified date:
.project, Modified on: Thu Oct 12 19:06:45 IST 2017
.classpath, Modified on: Mon Nov 20 13:09:55 IST 2017
input.txt, Modified on: Mon Nov 20 19:27:55 IST 2017

Apache Commons IO - TeeInputStream Class

它是一个 InputStream 代理,会透明地将所有从代理流读取的字节副本写入给定的 OutputStream。当在此代理上调用 close() 方法时,受代理的输入流便会关闭。它可用于操作一次两个流。

Class Declaration

下面是 org.apache.commons.io.input.TeeInputStream 类的声明 -

public class TeeInputStream
   extends ProxyInputStream

Example of TeeInputStream Class

在此示例中,关闭 TeeInputStream 会关闭 TeeInputStream 以及 TeeOutputStream 对象。

IOTester.java

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 class IOTester {
   private static final String SAMPLE = "Welcome to TutorialsPoint. Simply Easy Learning.";

   public static void main(String[] args) {
      try{
         usingTeeInputStream();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }
   public static void usingTeeInputStream() throws IOException {
      TeeInputStream teeInputStream = null;
      TeeOutputStream teeOutputStream = null;
      try {
         ByteArrayInputStream inputStream = new ByteArrayInputStream(SAMPLE.getBytes("US-ASCII"));
         ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
         ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();

         teeOutputStream = new TeeOutputStream(outputStream1, outputStream2);
         teeInputStream = new TeeInputStream(inputStream, teeOutputStream, true);
         teeInputStream.read(new byte[SAMPLE.length()]);

         System.out.println("Output stream 1: " + outputStream1.toString());
         System.out.println("Output stream 2: " + outputStream2.toString());

      } catch (IOException e) {
         System.out.println(e.getMessage());
      } finally {
         //teeIn.close() closes teeIn and teeOut which in turn closes the out1 and out2.
         try {
            teeInputStream.close();
         }
         catch (IOException e) {
            System.out.println(e.getMessage());
         }
      }
   }
}

Output

它将打印以下结果。

Output stream 1: Welcome to TutorialsPoint. Simply Easy Learning.
Output stream 2: Welcome to TutorialsPoint. Simply Easy Learning.

Apache Commons IO - TeeOutputStream Class

TeeOutputStream 拆分 OutputStream。它以 Unix“tee”命令命名。它允许流分支到两个流。

Class Declaration

下面是 org.apache.commons.io.output.TeeOutputStream 类的声明 -

public class TeeOutputStream
   extends ProxyOutputStream

Example of TeeOutputStream Class

在此示例中,TeeOutputStream 接受两个输出流作为参数,并将数据传递给 TeeOutputStream 会将数据设置到两个输出流。

IOTester.java

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 class IOTester {
   private static final String SAMPLE = "Welcome to TutorialsPoint. Simply Easy Learning.";
   public static void main(String[] args) {
      try{
         usingTeeInputStream();
      }catch(IOException e){
         System.out.println(e.getMessage());
      }
   }
   public static void usingTeeInputStream() throws IOException {
      TeeInputStream teeInputStream = null;
      TeeOutputStream teeOutputStream = null;
      try {
         ByteArrayInputStream inputStream = new ByteArrayInputStream(SAMPLE.getBytes("US-ASCII"));
         ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
         ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();

         teeOutputStream = new TeeOutputStream(outputStream1, outputStream2);
         teeInputStream = new TeeInputStream(inputStream, teeOutputStream, true);
         teeInputStream.read(new byte[SAMPLE.length()]);

         System.out.println("Output stream 1: " + outputStream1.toString());
         System.out.println("Output stream 2: " + outputStream2.toString());

      } catch (IOException e) {
         System.out.println(e.getMessage());
      } finally {
         //teeIn.close() closes teeIn and teeOut which in turn closes the out1 and out2.
         try {
            teeInputStream.close();
         }
         catch (IOException e) {
            System.out.println(e.getMessage());
         }
      }
   }
}

Output

它将打印以下结果。

Output stream 1: Welcome to TutorialsPoint. Simply Easy Learning.
Output stream 2: Welcome to TutorialsPoint. Simply Easy Learning.