天天看點

常用工具類commons-io的學習使用commons-io簡介IOUtilsFileUtilsFilenameUtils的使用

commons-io簡介

        commons-io 是Apache封裝好的庫,包含使用程式類、流實作、檔案過濾、檔案比較器、endian轉換類等。

代碼中經常用到io流,自己寫代碼比較繁瑣, 推薦使用commons-io工具類。

commons-io官網:Commons IO – Commons IO Overview

commons-io可以去官網下載下傳也可以用Maven引入依賴

最新寫法:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
           

原來寫法:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>
           

使用舉例

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<lines.size();i++)
               System.out.println(lines.get(i));
       }
}
           

IOUtils

拷貝方法:

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

複制檔案夾

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的使用

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

}
           

Filters過濾器

1.基本功能過濾器 

類型:
FileFileFilter       僅接受檔案

DirectoryFilter          僅接受目錄

名稱:

PrefixFileFilter          基于字首(不帶路徑的檔案名)

SuffixFileFilter          基于字尾(不帶路徑的檔案名)

NameFileFilter         基于檔案名稱(不帶路徑的檔案名)

WildcardFileFilter 基于通配符(不帶路徑的檔案名)
RegexFileFilter         基于正規表達式

時間:

AgeFileFilter       基于最後修改時間

MagicNumberFileFileter   基于Magic Number

大小:
EmptyFileFilter         基于檔案或目錄是否為空

SizeFileFilter      基于檔案尺寸


隐藏屬性:
HiddenFileFilter   基于檔案或目錄是否隐藏
讀寫屬性:
CanReadFileFilter 基于是否可讀
CanWriteFileFilter     基于是否可寫入

DelegateFileFilter 将普通的FileFilter和FilenameFilter包裝成IOFileFilter
           

2.邏輯關系過濾器        

AndFileFilter       基于AND邏輯運算
OrFileFilter        基于OR邏輯運算
NotFileFilter       基于NOT邏輯運算


TrueFileFilter           不進行過濾
FalseFileFilter          過濾所有檔案及目錄
           

工具類:FileFilterUtils     

提供一些工廠方法用于生成各類檔案過濾器

提供一些靜态方法用于對指定的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);

    }

}
           

四、Comparators比較器

org.apache.commons.io.comparator包下隻有這四個類:

CompositeFileComparator

DefaultFileComparator

DirectoryFileComparator

ExtensionFileComparator

LastModifiedFileComparator

NameFileComparator

PathFileComparator

SizeFileComparator
           

都有着四個方法:

compare(File file1, File file2)

sort(File... files)

sort(List<File> 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);

    }

}