日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

小师妹学JavaIO之:File copy和File filter

發(fā)布時(shí)間:2024/2/28 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小师妹学JavaIO之:File copy和File filter 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 簡(jiǎn)介
  • 使用java拷貝文件
  • 使用File filter
  • 總結(jié)

簡(jiǎn)介

一個(gè)linux命令的事情,小師妹非要讓我教她怎么用java來(lái)實(shí)現(xiàn),哎,攤上個(gè)這么杠精的小師妹,我也是深感無(wú)力,做一個(gè)師兄真的好難。

使用java拷貝文件

今天小師妹找到我了:F師兄,能告訴怎么拷貝文件嗎?

拷貝文件?不是很簡(jiǎn)單的事情嗎?如果你有了文件的讀權(quán)限,只需要這樣就可以了。

cp www.flydean.com www.flydean.com.back

當(dāng)然,如果是目錄的話(huà)還可以加兩個(gè)參數(shù)遍歷和強(qiáng)制拷貝:

cp -rf srcDir distDir

這么簡(jiǎn)單的linux命令,不要告訴我你不會(huì)。

小師妹笑了:F師兄,我不要用linux命令,我就想用java來(lái)實(shí)現(xiàn),我不正在學(xué)java嗎?學(xué)一門(mén)當(dāng)然要找準(zhǔn)機(jī)會(huì)來(lái)練習(xí)啦,快快教教我吧。

既然這樣,那我就開(kāi)講了。java中文件的拷貝其實(shí)也有三種方法,可以使用傳統(tǒng)的文件讀寫(xiě)的方法,也可以使用最新的NIO中提供的拷貝方法。

使用傳統(tǒng)方法當(dāng)然沒(méi)有NIO快,也沒(méi)有NIO簡(jiǎn)潔,我們先來(lái)看看怎么使用傳統(tǒng)的文件讀寫(xiě)的方法來(lái)拷貝文件:

public void copyWithFileStreams() throws IOException{File fileToCopy = new File("src/main/resources/www.flydean.com");File newFile = new File("src/main/resources/www.flydean.com.back");newFile.createNewFile();try(FileOutputStream output = new FileOutputStream(newFile);FileInputStream input = new FileInputStream(fileToCopy)){byte[] buf = new byte[1024];int bytesRead;while ((bytesRead = input.read(buf)) > 0){output.write(buf, 0, bytesRead);}}}

上面的例子中,我們首先定義了兩個(gè)文件,然后從兩個(gè)文件中生成了OutputStream和InputStream,最后以字節(jié)流的形式從input中讀出數(shù)據(jù)到outputStream中,最終完成了文件的拷貝。

傳統(tǒng)的File IO拷貝比較繁瑣,速度也比較慢。我們接下來(lái)看看怎么使用NIO來(lái)完成這個(gè)過(guò)程:

public void copyWithNIOChannel() throws IOException{File fileToCopy = new File("src/main/resources/www.flydean.com");File newFile = new File("src/main/resources/www.flydean.com.back");try(FileInputStream inputStream = new FileInputStream(fileToCopy);FileOutputStream outputStream = new FileOutputStream(newFile)){FileChannel inChannel = inputStream.getChannel();FileChannel outChannel = outputStream.getChannel();inChannel.transferTo(0, fileToCopy.length(), outChannel);}}

之前我們講到NIO中一個(gè)非常重要的概念就是channel,通過(guò)構(gòu)建源文件和目標(biāo)文件的channel通道,可以直接在channel層面進(jìn)行拷貝,如上面的例子所示,我們調(diào)用了inChannel.transferTo完成了拷貝。

最后,還有一個(gè)更簡(jiǎn)單的NIO文件拷貝的方法:

public void copyWithNIOFiles() throws IOException{Path source = Paths.get("src/main/resources/www.flydean.com");Path destination = Paths.get("src/main/resources/www.flydean.com.back");Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);}

直接使用工具類(lèi)Files提供的copy方法即可。

使用File filter

太棒了,小師妹一臉崇拜:F師兄,我還有一個(gè)需求,就是想刪除某個(gè)目錄里面的以.log結(jié)尾的日志文件,這個(gè)需求是不是很常見(jiàn)?F師兄一般是怎么操作的?

一般這種操作我都是一個(gè)linux命令就搞定了,如果搞不定那就用兩個(gè):

rm -rf *.log

當(dāng)然,如果需要,我們也是可以用java來(lái)實(shí)現(xiàn)的。

java中提供了兩個(gè)Filter都可以用來(lái)實(shí)現(xiàn)這個(gè)功能。

這兩個(gè)Filter是java.io.FilenameFilter和java.io.FileFilter:

@FunctionalInterface public interface FilenameFilter {boolean accept(File dir, String name); } @FunctionalInterface public interface FileFilter {boolean accept(File pathname); }

這兩個(gè)接口都是函數(shù)式接口,所以他們的實(shí)現(xiàn)可以直接用lambda表達(dá)式來(lái)代替。

兩者的區(qū)別在于,FilenameFilter進(jìn)行過(guò)濾的是文件名和文件所在的目錄。而FileFilter進(jìn)行過(guò)濾的直接就是目標(biāo)文件。

在java中是沒(méi)有目錄的概念的,一個(gè)目錄也是用File的表示的。

上面的兩個(gè)使用起來(lái)非常類(lèi)似,我們就以FilenameFilter為例,看下怎么刪除.log文件:

public void useFileNameFilter(){String targetDirectory = "src/main/resources/";File directory = new File(targetDirectory);//Filter out all log filesString[] logFiles = directory.list( (dir, fileName)-> fileName.endsWith(".log"));//If no log file found; no need to go furtherif (logFiles.length == 0)return;//This code will delete all log files one by onefor (String logfile : logFiles){String tempLogFile = targetDirectory + File.separator + logfile;File fileDelete = new File(tempLogFile);boolean isdeleted = fileDelete.delete();log.info("file : {} is deleted : {} ", tempLogFile , isdeleted);}}

上面的例子中,我們通過(guò)directory.list方法,傳入lambda表達(dá)式創(chuàng)建的Filter,實(shí)現(xiàn)了過(guò)濾的效果。

最后,我們將過(guò)濾之后的文件刪除。實(shí)現(xiàn)了目標(biāo)。

總結(jié)

小師妹的兩個(gè)問(wèn)題解決了,希望今天可以不要再見(jiàn)到她。

更多精彩內(nèi)容且看:

  • 區(qū)塊鏈從入門(mén)到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
  • Spring Boot 2.X系列教程:七天從無(wú)到有掌握Spring Boot-持續(xù)更新
  • Spring 5.X系列教程:滿(mǎn)足你對(duì)Spring5的一切想象-持續(xù)更新
  • java程序員從小工到專(zhuān)家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程

本文的例子https://github.com/ddean2009/learn-java-io-nio

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/io-file-copy-file-filter/

本文來(lái)源:flydean的博客

歡迎關(guān)注我的公眾號(hào):程序那些事,更多精彩等著您!

總結(jié)

以上是生活随笔為你收集整理的小师妹学JavaIO之:File copy和File filter的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。