java讀取其下所有文件夾與文件的路徑,具體內容如下
如果在f:\aa文件夾中,有如下圖的文件夾與文件:
那么,在java中,則如此讀取f:/aa下的所有文件路徑:
1、首先由于用到了文件與容器類下的arraylist,所以在開頭要引入如下包:
1
2
|
import java.io.*; import java.util.*; |
2、方法如下,其中file dirfile除了盤符,比如f:,以外,能夠接受一切合法的路徑。由于盤符下含有一些系統文件,拒絕訪問,因為讀取盤符,可能會出現空指針異常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//這里是僅僅查詢當前路徑下的所有文件夾、文件并且存放其路徑到文件數組 //由于遇到文件夾不查詢其包含所有子文件夾、文件,因此沒必要用到遞歸 public static arraylist<string> dir(file dirfile) throws exception { arraylist<string> dirstrarr = new arraylist<string>(); if (dirfile.exists()) { //直接取出利用listfiles()把當前路徑下的所有文件夾、文件存放到一個文件數組 file files[] = dirfile.listfiles(); for (file file : files) { //如果傳遞過來的參數dirfile是以文件分隔符,也就是/或者\結尾,則如此構造 if (dirfile.getpath().endswith(file.separator)) { dirstrarr.add(dirfile.getpath() + file.getname()); } else { //否則,如果沒有文件分隔符,則補上一個文件分隔符,再加上文件名,才是路徑 dirstrarr.add(dirfile.getpath() + file.separator + file.getname()); } } } return dirstrarr; } |
其上的方法,是不讀取f:\aa下的新建文件夾下的xlsx,如果在讀取的過程中,遇到文件夾要同時讀取其包含所有子文件夾、文件時,則要用到遞歸,先設置一個全局的動態數組:
1
|
public static arraylist<string> dirallstrarr = new arraylist<string>(); |
然后方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public static void dirall(file dirfile) throws exception { if (dirfile.exists()) { file files[] = dirfile.listfiles(); for (file file : files) { //如果遇到文件夾則遞歸調用。 if (file.isdirectory()) { // 遞歸調用 dirall(file); } else { //如果遇到文件夾則放入數組 if (dirfile.getpath().endswith(file.separator)) { dirallstrarr.add(dirfile.getpath() + file.getname()); } else { dirallstrarr.add(dirfile.getpath() + file.separator + file.getname()); } } } } } |
其實在讀取的過程中,關鍵是利用listfiles()方法,獲取本文件夾下的所有文件列表,之后和《【java】移動文件夾及其所有子文件與子文件夾》 , 《【java】利用文件輸入輸出流完成把一個文件夾內的所有文件拷貝的另一的文件夾的操作》 一樣,遇到文件夾則進行遞歸。
上面整個方法的來起來是這樣的一個java文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.io.*; import java.util.*; public class filelist { // 設置一個全局動態數組,來存放文件路徑 // 主要遍歷文件夾,包含所有子文件夾、文件的情況時,用到遞歸,所以要這樣設置 public static arraylist<string> dirallstrarr = new arraylist<string>(); // 這里是僅僅查詢當前路徑下的所有文件夾、文件并且存放其路徑到文件數組 // 由于遇到文件夾不查詢其包含所有子文件夾、文件,因此沒必要用到遞歸 public static arraylist<string> dir(file dirfile) throws exception { arraylist<string> dirstrarr = new arraylist<string>(); if (dirfile.exists()) { // 直接取出利用listfiles()把當前路徑下的所有文件夾、文件存放到一個文件數組 file files[] = dirfile.listfiles(); for (file file : files) { // 如果傳遞過來的參數dirfile是以文件分隔符,也就是/或者\結尾,則如此構造 if (dirfile.getpath().endswith(file.separator)) { dirstrarr.add(dirfile.getpath() + file.getname()); } else { // 否則,如果沒有文件分隔符,則補上一個文件分隔符,再加上文件名,才是路徑 dirstrarr.add(dirfile.getpath() + file.separator + file.getname()); } } } return dirstrarr; } public static void dirall(file dirfile) throws exception { if (dirfile.exists()) { file files[] = dirfile.listfiles(); for (file file : files) { // 如果遇到文件夾則遞歸調用。 if (file.isdirectory()) { // 遞歸調用 dirall(file); } else { // 如果遇到文件夾則放入數組 if (dirfile.getpath().endswith(file.separator)) { dirallstrarr.add(dirfile.getpath() + file.getname()); } else { dirallstrarr.add(dirfile.getpath() + file.separator + file.getname()); } } } } } public static void main(string[] args) throws exception { file dirfile = new file( "f:/aa" ); system.out.println(dir(dirfile)); dirall(dirfile); system.out.println(dirallstrarr); } } |
運行結果如下:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/yongh701/article/details/45170381