---
# System prepended metadata

title: 'File類別和listFiles(),list(),walk(),find()比較'
tags: [ocpjp]

---

# File類別和listFiles(),list(),walk(),find()比較

:::warning
### File 代表的是一個路徑，指向目標檔案或資料夾位置
File path = new File(".");  表示當前目錄。

File path = new File("C:\\Java"); 絕對路徑的檔案或資料夾位置。

File path = new File(new File("."),"bin"); 表示當前目錄的bin資料夾，如果找不到bin資料夾就會丟出NullPointerException

:::

:::info
### listFiles()方法的返回型別 
該路徑當前目錄下所有檔案或資料夾的絕對路徑(pathname,注意File型別指的是路徑,而不是檔案)
:::

# Files.walk 取得指定目錄下的所有資料夾和檔案
**Question:**
```java=
public static void main(String[] args) throws IOException{
    Stream<Path> files = Files.walk(Paths.get(System.getProperty("user.home"))); //Files.walk 取得這個路徑底下所有目錄的資料夾和檔案
    files.forEach(fName -> { //line n1
        try {
            Path aPath = fName.toAbsolutePath(); //line n2
            System.out.println(fName + ":"
                    + Files.readAttributes(aPath, BasicFileAttributes.class).creationTime());
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    });
}
```
## What is the result?
**A. All files and directories under the home directory are listed along with their attributes.**
B. A compilation error occurs at line n1.
C. The files in the home directory are listed along with their attributes.
D. A compilation error occurs at line n2.
- [x] **Answer: A**

- [參考網站](https://coderbee.net/index.php/java/20131030/543)

:::info
Files新增了3个方法用於走訪目錄：

- Files.list(Path)
- Files.walk(Path, int, FileVisitOption...) 
- Files.walk(Path, FileVisitOption...)

---
Files.list方法只走訪當前目錄的資料夾和檔案，
Files.walk方法走訪指定目錄下的所有資料夾和檔案(深度優先走訪)，除非指定了最大深度。
walk方法的int用來指定走訪的最大深度。
:::

---
# Files.find 在指定目錄下，加了匹配器的走訪方法
- **原始方法**
```java=
Stream<Path> matches = Files.find(start, maxDepth, matcher, options);
```
- **範例1**
```java=
Stream<Path> matches = Files.find(inputDir, Integer.MAX_VALUE, (path, attr) -> inputFile.equals(path), FileVisitOption.FOLLOW_LINKS)
```
- **範例2**
```Java=
Stream<Path> stream = Files.find(Paths.get ("/company"), 1,(p,b) -> b.isDirectory (), FileVisitOption.FOLLOW_LINKS);
```

**Question:**
目錄
/company/emp/info.txt
/company/emp/benefits/b1.txt
```java=
//line n1
stream.forEach(s->System.out.print(s));
```
### Which code fragment can be inserted at line n1to enable the code to print only /company/emp?
A. Stream<Path> stream = Files.list (Paths.get ("/company"));
**B. Stream<Path> stream = Files.find(Paths.get ("/company"), 1,(p,b) -> b.isDirectory (),FileVisitOption.FOLLOW_LINKS);**
C. Stream<Path> stream = Files.walk (Paths.get ("/company"));
D. Stream<Path> stream = Files.list (Paths.get ("/company/emp"));
- [x] **Answer: B**
:::info
選項A: 取得company當前目錄下的所有檔案
選項B: 取得company當前目錄的檔案往下一層的資料夾路徑
選項C: 走訪所有在company底下的所有目錄的檔案
選項D: 取得company/emp 當前目錄的所有檔案
:::
###### tags: `ocpjp`