使用apache 的FileUtils處理文件的復(fù)制等操作方式
平時(shí)對(duì)一些文件進(jìn)行操作,比如說(shuō)寫(xiě)文件,讀文件,復(fù)制一個(gè)文件等,使用原生File操作需要讀取源文件,生成流對(duì)象,再寫(xiě)入一個(gè)新的文件中一系列過(guò)程,使用apache commons-io幫我們封裝了這些實(shí)現(xiàn),有些操作可以很容易的使用它的api來(lái)實(shí)現(xiàn)。
這里使用2.6版本,javadoc參照commons-io-2.6
1、pom依賴加入commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2、常用API使用
2.1 獲取文件
File fileA = FileUtils.getFile(testPath + "a.txt"); // 最終路徑為入?yún)⑵唇悠饋?lái)即testPath + "a.txt" File fileAA = FileUtils.getFile(testPath, "a.txt"); // 獲取某個(gè)目錄下的文件,后面參數(shù)是拼接而成的 File fileAAA = FileUtils.getFile(new File(testPath), "a.txt");
2.2 獲取臨時(shí)目錄和用戶目錄
// 獲取臨時(shí)目錄路徑 // 每種操作系統(tǒng)有所不同,Windows一般是C:\DOCUME~1\用戶~(yú)1\LOCALS~1\Temp,Solaris一般是:/var/tmp/,Linux和Mac OS X一般是:/tmp // Windows的java.io.tmpdir屬性值可以看環(huán)境變量->用戶變量中的TMP。 File tempDirectory = FileUtils.getTempDirectory(); String tempDirectoryPath = FileUtils.getTempDirectoryPath(); File userDirectory = FileUtils.getUserDirectory(); String userDirectoryPath = FileUtils.getUserDirectoryPath(); System.out.println(tempDirectoryPath + " - " + tempDirectory); System.out.println(userDirectoryPath + " - " + userDirectory.getName());
2.3 創(chuàng)建文件
// 創(chuàng)建文件(實(shí)現(xiàn)與Unix上“ touch”實(shí)用程序相同的行為。它會(huì)創(chuàng)建一個(gè)大小為0的新文件,或者如果文件已經(jīng)存在,則將其打開(kāi)和關(guān)閉而不進(jìn)行修改,而是更新文件的日期和時(shí)間。) File fileD = new File(testPath + "d.txt"); FileUtils.touch(fileD);
2.4 寫(xiě)內(nèi)容到文件
// 寫(xiě)文件
File fileB = new File(testPath + "b.txt");
if (!fileB.exists()) {
fileB.createNewFile();
}
// 通過(guò)字節(jié)寫(xiě)入文件
FileUtils.writeByteArrayToFile(fileB, "Hello, smile".getBytes());
FileUtils.writeByteArrayToFile(fileB, "Hello, sunshine".getBytes(), true);
// 通過(guò)行寫(xiě)入文件(覆蓋)
FileUtils.writeLines(fileB, Lists.newArrayList("春夏秋冬, 三餐四季,只愿有你"));
// 通過(guò)行寫(xiě)入文件(追加)
FileUtils.writeLines(fileB, Lists.newArrayList("春風(fēng)很柔,夏風(fēng)很烈,秋風(fēng)清爽,東風(fēng)凜冽,你就是春夏秋冬的風(fēng)"), true);
// 字符串寫(xiě)入,不換行追加
FileUtils.writeStringToFile(fileB, "唯美有你", "UTF-8", true);
FileUtils.writeStringToFile(fileB, "哪里有你", Charset.defaultCharset(), true);
File fileC = new File(testPath + "c.txt");
if (!fileC.exists()) {
fileC.createNewFile();
}
// 流操作
fileInputStream = FileUtils.openInputStream(fileB);
// fileOutputStream = FileUtils.openOutputStream(fileC);
fileOutputStream = FileUtils.openOutputStream(fileC, true);
// 字節(jié)數(shù)組
byte[] buffer = new byte[1024];
// 將文件內(nèi)容寫(xiě)到文件中
while (fileInputStream.read(buffer) != -1) {
fileOutputStream.write(buffer);
}
2.5 讀取文件內(nèi)容
// 按行讀取文件內(nèi)容 List list = FileUtils.readLines(fileAAA, "UTF-8"); System.out.println(list.size() > 0 ? list.get(0) : "" + list.size()); List<String> lines = FileUtils.readLines(fileB, Charset.defaultCharset()); System.out.println(lines.size() > 0 ? lines.get(0) : "" + lines.size()); // 讀取文件內(nèi)容為字節(jié) byte[] bytes = FileUtils.readFileToByteArray(fileB); System.out.println(new String(bytes)); // 讀取文件為String String fileToString = FileUtils.readFileToString(fileB, "UTF-8"); System.out.println(fileToString); String fileToString2 = FileUtils.readFileToString(fileB, Charset.defaultCharset()); System.out.println(fileToString2);
2.6 獲取目錄文件及目錄
// recursive是否遞歸查詢,這里查詢.txt文件,也可以指定其他格式的,如果extensions為null則查詢所有類型的文件
Collection<File> listFiles = FileUtils.listFiles(new File(testPath), null, true);
Collection<File> listFiles2 = FileUtils.listFiles(new File(testPath), new String[]{"txt"}, true);
// 獲取某個(gè)目錄下的所有文件 TrueFileFilter.INSTANCE表示匹配所有的
Collection<File> files1 = FileUtils.listFiles(new File(testPath), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
// 獲取某個(gè)目錄下的所有文件和文件目錄 TrueFileFilter.INSTANCE表示匹配所有的
Collection<File> files2 = FileUtils.listFilesAndDirs(new File(testPath), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
2.7 文件內(nèi)容比較
// 文件內(nèi)容比較 boolean aa = FileUtils.contentEquals(fileA, fileAA); boolean ab = FileUtils.contentEquals(fileA, fileB);
2.8 文件或目錄拷貝
// 文件復(fù)制,將文件A的內(nèi)容復(fù)制給文件D FileUtils.copyFile(fileA, fileD); // 把文件復(fù)制到某個(gè)目錄下 FileUtils.copyFileToDirectory(fileD, new File(testPath + "inner")); // 把某個(gè)目錄拷貝到另外一個(gè)目錄 FileUtils.copyDirectoryToDirectory(new File(testPath + "inner"), new File(testPath + "other")); // 把文件或目錄拷貝到指定目錄 FileUtils.copyToDirectory(fileB, new File(testPath + "inner")); // 文件目錄復(fù)制 FileUtils.copyDirectory(new File(testPath + "inner"), new File(testPath + "first"));
2.9 文件或目錄刪除
// 刪除目錄 FileUtils.deleteDirectory(new File(testPath + "first")); // 刪除文件或目錄 FileUtils.deleteQuietly(fileD); FileUtils.deleteQuietly(new File(testPath + "first"));
這就是FileUtils工具類的一些常用操作API使用。
apache commons-io的FileUtils.copyFile簡(jiǎn)單地復(fù)制文件
一般的方法,我們要復(fù)制一個(gè)文件,可能需要讀取源文件,生成流對(duì)象,再寫(xiě)入一個(gè)新的文件中,使用apache commons-io很容就可以處理文件的復(fù)制。
下面的例子演示我們?cè)鯓邮褂肍ileUtils.copyFile方法在同一個(gè)文件夾復(fù)制文件和使用FileUtils.copyFileToDirectory方法復(fù)制到指定的文件夾中。其中System.getProperty("java.io.tmpdir")為通過(guò)JVM讀取java.io.tmpdir屬性取得臨時(shí)文件夾,每種操作系統(tǒng)有所不同,Windows一般是C:\DOCUME~1\用戶~(yú)1\LOCALS~1\Temp,Solaris一般是:/var/tmp/,Linux和Mac OS X一般是:/tmp,Windows的java.io.tmpdir屬性值可以看環(huán)境變量->用戶變量中的TMP。
當(dāng)然我們一般使用的是絕對(duì)或相對(duì)路徑,如要復(fù)制到F:\ajava目錄中,我們只需將targetDir改成File targetDir = new File("F:\\ajava");運(yùn)行后就可以看到結(jié)果。
package ajava.sample.apache;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
public class AjavaFileCopyExample {
public static void main(String[] args)
{
// 源File對(duì)象
File source = new File("ajava.txt");
// 備份的File對(duì)象
File target = new File("ajava-backup.txt");
//通過(guò)JVM讀取java.io.tmpdir屬性取得臨時(shí)文件夾
File targetDir = new File(System.getProperty("java.io.tmpdir"));
try
{
//在同一個(gè)文件夾復(fù)制文件
System.out.println("復(fù)制 " + source + " 文件到 " + target);
FileUtils.copyFile(source, target);
// 根據(jù)指定的文件夾復(fù)制
System.out.println("復(fù)制 " + source + " 文件到" + targetDir + "目錄");
FileUtils.copyFileToDirectory(source, targetDir);
} catch (IOException e)
{
// Errors will be reported here if any error occures during copying
// the file
e.printStackTrace();
}
}
}
輸出結(jié)果為:
復(fù)制 ajava.txt 文件到 ajava-backup.txt
復(fù)制 ajava.txt 文件到C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp目錄
再查看對(duì)應(yīng)的文件夾,就可以發(fā)現(xiàn)備份文件。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決idea中Terminal終端無(wú)法執(zhí)行GIT命令+Terminal 中文亂碼問(wèn)題
這篇文章主要介紹了解決idea中Terminal終端無(wú)法執(zhí)行GIT命令+Terminal 中文亂碼問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
JavaCV攝像頭實(shí)戰(zhàn)之實(shí)現(xiàn)口罩檢測(cè)
這篇文章主要介紹了利用JavaCV實(shí)現(xiàn)口罩檢測(cè),功能是檢測(cè)攝像頭內(nèi)的人是否帶了口罩,把檢測(cè)結(jié)果實(shí)時(shí)標(biāo)注在預(yù)覽窗口。感興趣的可以試一試2022-01-01
關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問(wèn)題
這篇文章主要介紹了關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印
本文主要介紹了SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Docker環(huán)境下Spring Boot應(yīng)用內(nèi)存飆升分析與解決場(chǎng)景分析
當(dāng)運(yùn)行一個(gè)Spring Boot項(xiàng)目時(shí),如果未設(shè)置JVM內(nèi)存參數(shù),Spring Boot默認(rèn)會(huì)采用JVM自身默認(rèn)的配置策略,接下來(lái)通過(guò)本文給大家介紹Docker環(huán)境下Spring Boot應(yīng)用內(nèi)存飆升分析與解決方法,需要的朋友參考下吧2021-08-08
詳談Java中的事件監(jiān)聽(tīng)機(jī)制
下面小編就為大家?guī)?lái)一篇詳談Java中的事件監(jiān)聽(tīng)機(jī)制。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06

