如何遍歷資料夾下上億檔案而不棧溢位

2021-09-20 08:30:20 字數 1165 閱讀 2524

序:乙個資料夾下面有很多層的小檔案,如何算出這個資料夾下面有多少檔案?遞迴遍歷,簡單暴力,遞迴在一般情況確實是比較方便的解決方案,但是當資料夾深度多深,遞迴的反覆呼叫會導致方法一直無法釋放,造成jvm的棧溢位。那我們該怎麼辦?

原文和作者一起討論:

說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的it前輩講的他曾經的面試經歷。他說他當時比較緊張就想到了遞迴,沒有想到其他的方案。

當然他跟我說這個問題的時候,它也沒有想到好的處理方案。它認為這種情況可以參考網路爬蟲的遞迴,為了防止爬蟲在乙個深度出不來,通常會設定每一次爬的深度,然後通過各種的限制條件來保證每乙個檔案都被訪問到。

當時我靈光一閃,因為當時我在溫故資料結構的知識,我說這個資料夾的層次看著好呀嘛好眼熟,不就相當於乙個樹的結構,那我們學資料結構的時候是如何遍歷節點的。有左遞迴,中遞迴,右遞迴,當然這就是上面的遞迴方法,不是我們要找的解決方案,那麼該怎麼辦?

看,角落裡有我們經常忽視的層序遍歷。

層序遍歷:層序遍歷就是從所在樹的根節點出發,首先訪問第一層的樹根節點,然後從左到右訪問第2層上的節點,接著是第三層的節點,以此類推,自上而下,自左至右逐層訪問樹的結點的過程就是層序遍歷。

我們只需要使用乙個list集合來儲存每乙個檔案(夾),然後按次序讀取list集合的元素,並判斷如果是資料夾則把該資料夾下的所有檔案(夾)追加到list集合後面,然後讀取list的下乙個元素以此類推。

public

class

demo }}

}}

都是有經驗的開發人員,上面的**就沒有必要進行注釋了。

當然有人會較真,當檔案數量很多,就算這**可以保證棧不溢位,但是list集合數量上去了,堆也會爆的。

當然,這是一種情況,其實也很簡單,每從集合讀取乙個元素,就把該元素從集合溢位,存入硬碟中即可,然後迴圈裡面的判斷條件中不對i進行遞增即可。

public

class

demo

}list.remove(i);}}

}

大家有更好的解決方案可以一起分享討論.

intsmaze(劉洋)

出處:

由於博主能力有限,文中可能存在描述不正確,歡迎指正、補充!

如何遍歷資料夾下上億檔案而不棧溢位

序 乙個資料夾下面有很多層的小檔案,如何算出這個資料夾下面有多少檔案?遞迴遍歷,簡單暴力,遞迴在一般情況確實是比較方便的解決方案,但是當資料夾深度多深,遞迴的反覆呼叫會導致方法一直無法釋放,造成jvm的棧溢位。那我們該怎麼辦?原文和作者一起討論 說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的...

如何遍歷資料夾下上億檔案而不棧溢位

序 乙個資料夾下面有很多層的小檔案,如何算出這個資料夾下面有多少檔案?遞迴遍歷,簡單暴力,遞迴在一般情況確實是比較方便的解決方案,但是當資料夾深度多深,遞迴的反覆呼叫會導致方法一直無法釋放,造成jvm的棧溢位。那我們該怎麼辦?原文和作者一起討論 說實話這個問題我以前也沒有遇到過,我是聽一位我很敬佩的...

Python如何import資料夾下的檔案

python的import包含檔案功能就跟php的include類似,但更確切的說應該更像是php中的require,因為python裡的import只要目標不存在就報錯程式無法往下執行。要包含目錄裡的檔案,php中只需要給對路徑就ok。python中則不同,下面來看看這個例子。目錄結構 a.py ...