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

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

生活随笔

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

java

小师妹学JavaIO之:目录还是文件

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

文章目錄

  • 簡(jiǎn)介
  • linux中的文件和目錄
  • 目錄的基本操作
  • 目錄的進(jìn)階操作
  • 目錄的腰疼操作
  • 總結(jié)

簡(jiǎn)介

目錄和文件傻傻分不清楚,目錄和文件的本質(zhì)到底是什么?在java中怎么操縱目錄,怎么遍歷目錄。本文F師兄會(huì)為大家一一講述。

linux中的文件和目錄

小師妹:F師兄,我最近有一個(gè)疑惑,java代碼中好像只有文件沒有目錄呀,是不是當(dāng)初發(fā)明java的大神,一不小心走了神?

F師兄:小師妹真勇氣可嘉呀,敢于質(zhì)疑權(quán)威是從小工到專家的最重要的一步。想想F師兄我,從小沒人提點(diǎn),老師講什么我就信什么,專家說(shuō)什么我就聽什么:股市必上一萬(wàn)點(diǎn),房子是給人住的不是給人炒的,原油寶當(dāng)然是小白理財(cái)必備產(chǎn)品…然后,就沒有然后了。

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

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

更多內(nèi)容請(qǐng)?jiān)L問(wèn)www.flydean.com

雖然java中沒有目錄的概念只有File文件,而File其實(shí)是可以表示目錄的:

public boolean isDirectory()

File中有個(gè)isDirectory方法,可以判斷該File是否是目錄。

File和目錄傻傻分不清楚,小師妹,有沒有聯(lián)想到點(diǎn)什么?

小師妹:F師兄,我記得你上次講到Linux下面所有的資源都可以看做是文件,在linux下面文件和目錄的本質(zhì)是不是一樣的?

對(duì)的,在linux下面文件是一等公民,所有的資源都是以文件的形式來(lái)區(qū)分的。

什么扇區(qū),邏輯塊,頁(yè)之類的底層結(jié)構(gòu)我們就不講了。我們先考慮一下一個(gè)文件到底應(yīng)該包含哪些內(nèi)容。除了文件本身的數(shù)據(jù)之外,還有很多元數(shù)據(jù)的東西,比如文件權(quán)限,所有者,group,創(chuàng)建時(shí)間等信息。

在linux系統(tǒng)中,這兩個(gè)部分是分開存儲(chǔ)的。存放數(shù)據(jù)本身的叫做block,存放元數(shù)據(jù)的叫做inode。

inode中存儲(chǔ)了block的地址,可以通過(guò)inode找到文件實(shí)際數(shù)據(jù)存儲(chǔ)的block地址,從而進(jìn)行文件訪問(wèn)。考慮一下大文件可能占用很多個(gè)block,所以一個(gè)inode中可以存儲(chǔ)多個(gè)block的地址,而一個(gè)文件通常來(lái)說(shuō)使用一個(gè)inode就夠了。

為了顯示層級(jí)關(guān)系和方便文件的管理,目錄的數(shù)據(jù)文件中存放的是該目錄下的文件和文件的inode地址,從而形成了一種一環(huán)套一環(huán),圓環(huán)套圓環(huán)的鏈?zhǔn)疥P(guān)系。

上圖列出了一個(gè)通過(guò)目錄查找其下文件的環(huán)中環(huán)布局。

我想java中目錄沒有單獨(dú)列出來(lái)一個(gè)類的原因可能是參考了linux底層的文件布局吧。

目錄的基本操作

因?yàn)樵趈ava中目錄和文件是公用File這個(gè)類的,所以File的基本操作目錄它全都會(huì)。

基本上,目錄和文件相比要多注意下面三類方法:

public boolean isDirectory() public File[] listFiles() public boolean mkdir()

為什么說(shuō)是三類呢?因?yàn)檫€有幾個(gè)和他們比較接近的方法,這里就不一一列舉了。

isDirectory判斷該文件是不是目錄。listFiles列出該目錄下面的所有文件。mkdir創(chuàng)建一個(gè)文件目錄。

小師妹:F師兄,之前我們還以目錄的遍歷要耗費(fèi)比較長(zhǎng)的時(shí)間,經(jīng)過(guò)你一講解目錄的數(shù)據(jù)結(jié)構(gòu),感覺listFiles并不是一個(gè)耗時(shí)操作呀,所有的數(shù)據(jù)都已經(jīng)準(zhǔn)備好了,直接讀取出來(lái)就行。

對(duì),看問(wèn)題不要看表面,要看到隱藏在表面的本質(zhì)內(nèi)涵。你看師兄我平時(shí)不顯山露水,其實(shí)是真正的中流砥柱,堪稱公司優(yōu)秀員工模范。

小師妹:F師兄,那平時(shí)也沒看上頭表彰你啥的?哦,我懂了,一定是老板怕表彰了你引起別人的嫉妒,會(huì)讓你的好好大師兄的形象崩塌吧,看來(lái)老板真的懂你呀。

目錄的進(jìn)階操作

好了小師妹,你懂了就行,下面F師兄給你講一下目錄的進(jìn)階操作,比如我們?cè)趺纯截愐粋€(gè)目錄呀?

小師妹,拷貝目錄簡(jiǎn)單的F師兄,上次你就教我了:

cp -rf

一個(gè)命令的事情不就解決了嗎?難道里面還隱藏了點(diǎn)秘密?

咳咳咳,秘密倒是沒有,小師妹,我記得你上次說(shuō)要對(duì)java從一而終的,今天師兄給你介紹一個(gè)在java中拷貝文件目錄的方法。

其實(shí)Files工具類里已經(jīng)為我們提供了一個(gè)拷貝文件的優(yōu)秀方法:

public static Path copy(Path source, Path target, CopyOption... options)

使用這個(gè)方法,我們就可以進(jìn)行文件的拷貝了。

如果想要拷貝目錄,就遍歷目錄中的文件,循環(huán)調(diào)用這個(gè)copy方法就夠了。

小師妹:且慢,F師兄,如果目錄下面還有目錄的,目錄下還套目錄的情況該怎么處理?

這就是圈套呀,看我用個(gè)遞歸的方法解決它:

public void useCopyFolder() throws IOException {File sourceFolder = new File("src/main/resources/flydean-source");File destinationFolder = new File("src/main/resources/flydean-dest");copyFolder(sourceFolder, destinationFolder);}private static void copyFolder(File sourceFolder, File destinationFolder) throws IOException{//如果是dir則遞歸遍歷創(chuàng)建dir,如果是文件則直接拷貝if (sourceFolder.isDirectory()){//查看目標(biāo)dir是否存在if (!destinationFolder.exists()){destinationFolder.mkdir();log.info("目標(biāo)dir已經(jīng)創(chuàng)建: {}",destinationFolder);}for (String file : sourceFolder.list()){File srcFile = new File(sourceFolder, file);File destFile = new File(destinationFolder, file);copyFolder(srcFile, destFile);}}else{//使用Files.copy來(lái)拷貝具體的文件Files.copy(sourceFolder.toPath(), destinationFolder.toPath(), StandardCopyOption.REPLACE_EXISTING);log.info("拷貝目標(biāo)文件: {}",destinationFolder);}}

基本思想就是遇到目錄我就遍歷,遇到文件我就拷貝。

目錄的腰疼操作

小師妹:F師兄,假如我想刪除一個(gè)目錄中的文件,或者我們想統(tǒng)計(jì)一下這個(gè)目錄下面到底有多少個(gè)文件該怎么做呢?

雖然這些操作有點(diǎn)腰疼,還是可以解決的,Files工具類中有個(gè)方法叫做walk,返回一個(gè)Stream對(duì)象,我們可以使用Stream的API來(lái)對(duì)文件進(jìn)行處理。

刪除文件:

public void useFileWalkToDelete() throws IOException {Path dir = Paths.get("src/main/resources/flydean");Files.walk(dir).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);}

統(tǒng)計(jì)文件:

public void useFileWalkToSumSize() throws IOException {Path folder = Paths.get("src/test/resources");long size = Files.walk(folder).filter(p -> p.toFile().isFile()).mapToLong(p -> p.toFile().length()).sum();log.info("dir size is: {}",size);}

總結(jié)

本文介紹了目錄的一些非常常見和有用的操作。

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

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/java-io-directory/

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

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

總結(jié)

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

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