JavaRush /Blog Java /Random-VI /Tệp Java, đường dẫn

Tệp Java, đường dẫn

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ nói về cách làm việc với các tập tin và thư mục. Bạn đã biết cách quản lý nội dung của tệp: chúng tôi có rất nhiều lớp dành cho việc này :) Tôi nghĩ bạn có thể dễ dàng nhớ một số lớp cần thiết cho những mục đích này. Trong bài giảng hôm nay chúng ta sẽ nói cụ thể về quản lý tập tin - tạo, đổi tên, v.v. Trước Java 7, tất cả các thao tác như vậy được thực hiện bằng cách sử dụng File. Bạn có thể đọc về công việc của mình ở đây . Nhưng trong Java 7, những người tạo ra ngôn ngữ này đã quyết định thay đổi cách họ làm việc với các tệp và thư mục. Điều này là do lớp học Filecó một số nhược điểm. Ví dụ: nó không có phương pháp copy()cho phép bạn sao chép tệp từ vị trí này sang vị trí khác (một tính năng dường như rõ ràng là cần thiết). Ngoài ra, lớp Filecòn có khá nhiều phương thức trả về booleangiá trị -value. Nếu xảy ra lỗi, phương thức như vậy sẽ trả về sai thay vì đưa ra một ngoại lệ, điều này khiến cho việc chẩn đoán lỗi và xác định nguyên nhân của chúng trở nên rất khó khăn. Thay vì một lớp duy nhất, Filecó đến 3 lớp xuất hiện: Paths, PathFiles. Nói chính xác thì Pathđây là một giao diện, không phải một lớp học. Chúng ta hãy tìm hiểu xem chúng khác nhau như thế nào và tại sao chúng lại cần thiết. Hãy bắt đầu với điều dễ dàng nhất - Paths.

Đường dẫn

Pathslà một lớp rất đơn giản với một phương thức tĩnh duy nhất get(). Nó được tạo ra chỉ để lấy một đối tượng thuộc loại từ chuỗi hoặc URI đã truyền Path. Nó không có chức năng khác. Đây là một ví dụ về công việc của anh ấy:
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

   public static void main(String[] args) {

       Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
   }
}
Đây không phải là lớp học khó nhất phải không? :) Chà, vì chúng ta có một đối tượng type Path, hãy tìm hiểu xem nó là gì Pathvà tại sao nó lại cần thiết :)

Con đường

Path, nhìn chung, là một dạng tương tự được thiết kế lại của File. Làm việc với nó dễ dàng hơn nhiều so với File. Thứ nhất , nhiều phương thức tiện ích (tĩnh) đã bị xóa khỏi nó và chuyển sang lớp này Files. Thứ hai , Pathgiá trị trả về của các phương thức đã được sắp xếp. Trong lớp, Filecác phương thức trả về this String, that boolean, that File- không dễ để tìm ra. Ví dụ: có một phương thức getParent()trả về đường dẫn gốc cho tệp hiện tại dưới dạng chuỗi. Nhưng đồng thời, có một phương thức getParentFile()trả về điều tương tự, nhưng ở dạng đối tượng File! Điều này rõ ràng là dư thừa. Do đó, trong giao diện, Pathphương thức getParent()và các phương thức khác để làm việc với tệp chỉ cần trả về một đối tượng Path. Không có nhiều lựa chọn - mọi thứ đều dễ dàng và đơn giản. Nó có những phương pháp hữu ích nào Path? Dưới đây là một số trong số họ và ví dụ về công việc của họ:
  • getFileName()— trả về tên tập tin từ đường dẫn;

  • getParent()— trả về thư mục “cha” liên quan đến đường dẫn hiện tại (nghĩa là thư mục cao hơn trong cây thư mục);

  • getRoot()— trả về thư mục “root”; nghĩa là cái nằm ở đầu cây thư mục;

  • startsWith(), endsWith()- kiểm tra xem đường dẫn có bắt đầu/kết thúc bằng đường dẫn đã qua hay không:

    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           Path fileName = testFilePath.getFileName();
           System.out.println(fileName);
    
           Path parent = testFilePath.getParent();
           System.out.println(parent);
    
           Path root = testFilePath.getRoot();
           System.out.println(root);
    
           boolean endWithTxt = testFilePath.endsWith("Desktop\\testFile.txt");
           System.out.println(endWithTxt);
    
           boolean startsWithLalala = testFilePath.startsWith("lalalala");
           System.out.println(startsWithLalala);
       }
    }

    Đầu ra của bảng điều khiển:

    testFile.txt
    C:\Users\Username\Desktop
    C:\
    true
    false

    Hãy chú ý đến cách thức hoạt động của phương pháp này endsWith(). Nó kiểm tra xem đường dẫn hiện tại có kết thúc bằng đường dẫn đã qua hay không . Nó nằm trên đường dẫn chứ không phải trên tập hợp các ký tự .

    So sánh kết quả của hai cuộc gọi này:

    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath.endsWith("estFile.txt"));
           System.out.println(testFilePath.endsWith("Desktop\\testFile.txt"));
       }
    }

    Đầu ra của bảng điều khiển:


    sai đúng

    Bạn cần chuyển đường dẫn đầy đủ đến phương thức endsWith()chứ không chỉ một tập hợp các ký tự: nếu không, kết quả sẽ luôn là false , ngay cả khi đường dẫn hiện tại thực sự kết thúc bằng một chuỗi ký tự như vậy (như trong trường hợp “estFile.txt ” trong ví dụ trên).

    Ngoài ra, còn Pathcó một nhóm các phương pháp giúp đơn giản hóa việc làm việc với các đường dẫn tuyệt đối (đầy đủ) và tương đối .

Chúng ta hãy xem xét các phương pháp này:
  • boolean isAbsolute()— trả về true nếu đường dẫn hiện tại là tuyệt đối:

    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath.isAbsolute());
       }
    }

    Đầu ra của bảng điều khiển:

    ĐÚNG VẬY

  • Path normalize()— “bình thường hóa” đường dẫn hiện tại, loại bỏ các phần tử không cần thiết khỏi nó. Có thể bạn biết rằng các hệ điều hành phổ biến thường sử dụng ký tự “.” khi biểu thị đường dẫn. (“thư mục hiện tại”) và “..” (thư mục mẹ). Ví dụ: “ ./Pictures/dog.jpg ” có nghĩa là trong thư mục chúng ta đang ở hiện tại có một thư mục Pictures và trong đó có một tệp “dog.jpg”

    Vì vậy, nó ở đây. Nếu chương trình của bạn có đường dẫn sử dụng “.” hoặc “..”, phương thức normalize()sẽ xóa chúng và nhận được đường dẫn không chứa chúng:

    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
    
           Path path5 = Paths.get("C:\\Users\\Java\\.\\examples");
    
           System.out.println(path5.normalize());
    
           Path path6 = Paths.get("C:\\Users\\Java\\..\\examples");
           System.out.println(path6.normalize());
       }
    }

    Đầu ra của bảng điều khiển:

    C:\Users\Java\examples
    C:\Users\examples

  • Path relativize()- tính toán đường dẫn tương đối giữa đường dẫn hiện tại và đường đi đã qua.

    Ví dụ:

    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath1 = Paths.get("C:\\Users\\Users\\Users\\Users");
           Path testFilePath2 = Paths.get("C:\\Users\\Users\\Users\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath1.relativize(testFilePath2));
       }
    }

    Đầu ra của bảng điều khiển:

    Tên người dùng\Desktop\testFile.txt

Danh sách đầy đủ các phương pháp Pathlà khá lớn. Bạn có thể tìm thấy tất cả chúng trong tài liệu của Oracle . Chúng tôi sẽ chuyển sang xem xét Files.

Các tập tin

Files- đây là lớp tiện ích nơi các phương thức tĩnh từ lớp được di chuyển File. Files- cái này gần giống với Arraysor Collections, chỉ có điều nó hoạt động với các tệp chứ không phải với mảng và bộ sưu tập :) Nó tập trung vào việc quản lý các tệp và thư mục. Sử dụng các phương thức tĩnh Files, chúng ta có thể tạo, xóa và di chuyển các tập tin và thư mục. Đối với các hoạt động này, các phương thức được sử dụng createFile()(đối với thư mục - createDirectory()) move()delete(). Đây là cách sử dụng chúng:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class Main {

   public static void main(String[] args) throws IOException {

       //file creation
       Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
       System.out.println("Was the file created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       // create directory
       Path testDirectory = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory"));
       System.out.println("Was the directory successfully created?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory")));

       //move file from desktop to testDirectory. You need to move with the name of the file in the folder!
       testFile1 = Files.move(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Is our file left on the desktop?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       System.out.println("Has our file been moved to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));

       //remove file
       Files.delete(testFile1);
       System.out.println("Does the file still exist?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));
   }
}
Ở đây trước tiên chúng ta tạo một tệp (phương thức Files.createFile()) trên màn hình nền, sau đó tạo một thư mục ở đó (phương thức Files.createDirectory()). Sau đó, chúng tôi di chuyển tệp (phương thức Files.move()) từ màn hình nền sang thư mục mới này và cuối cùng chúng tôi xóa tệp (phương thức Files.delete()). Đầu ra của bảng điều khiển: Tệp đã được tạo thành công chưa? đúng Thư mục đã được tạo thành công phải không? true Tệp của chúng tôi vẫn còn trên màn hình nền phải không? false Tệp của chúng tôi đã được chuyển đến testDirectory chưa? đúng Tập tin vẫn tồn tại? SAI Chú ý:Cũng giống như các phương thức giao diện Path, nhiều phương thức Filestrả về một đối tượngPath . Hầu hết các phương thức lớp Filescũng chấp nhận Path. Ở đây một phương pháp sẽ trở thành trợ lý trung thành của bạn Paths.get()- hãy sử dụng nó một cách tích cực. Còn gì thú vị nữa Files? Thứ mà lớp cũ thực sự thiếu là phương thức ! File. copy()Chúng ta đã nói về anh ấy ngay từ đầu bài giảng, bây giờ là lúc gặp anh ấy!
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class Main {

   public static void main(String[] args) throws IOException {

       //file creation
       Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
       System.out.println("Was the file created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       // create directory
       Path testDirectory2 = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2"));
       System.out.println("Was the directory successfully created?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2")));

       //copy the file from the desktop to the directory testDirectory2.
       testFile1 = Files.copy(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Is our file left on the desktop?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       System.out.println("Has our file been copied to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt")));
   }
}
Đầu ra của bảng điều khiển: Tệp đã được tạo thành công chưa? đúng Thư mục đã được tạo thành công phải không? true Tệp của chúng tôi vẫn còn trên màn hình nền phải không? true Tệp của chúng tôi có được sao chép vào testDirectory không? true Bây giờ bạn có thể sao chép tập tin theo chương trình! :) Nhưng lớp này Filescho phép bạn không chỉ tự quản lý các tệp mà còn có thể làm việc với nội dung của nó. Để ghi dữ liệu vào một tệp, nó có một phương thức write()và để đọc - tối đa 3:, read()readAllBytes()Chúng tôi readAllLines() sẽ đi sâu vào phần sau một cách chi tiết. Tại sao trên đó? Bởi vì nó có kiểu trả về rất thú vị - List<String>! Tức là nó trả về cho chúng ta danh sách các dòng trong file. Tất nhiên, điều này làm cho việc xử lý nội dung trở nên rất thuận tiện, vì toàn bộ tệp, từng dòng một, chẳng hạn, có thể được xuất ra bảng điều khiển theo một vòng lặp thông thường for:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {

   public static void main(String[] args) throws IOException {

       List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);

       for (String s: lines) {
           System.out.println(s);
       }
   }
}
Đầu ra của console: Tôi nhớ một khoảnh khắc tuyệt vời: Bạn xuất hiện trước mặt tôi, Như một ảo ảnh thoáng qua, Như một thiên tài với vẻ đẹp thuần khiết. Rất thoải mái! :) Tính năng này đã xuất hiện trong Java 7. Trong Java 8, API Stream đã xuất hiện , bổ sung một số thành phần lập trình chức năng vào Java. Bao gồm các khả năng phong phú hơn để làm việc với các tập tin. Hãy tưởng tượng rằng chúng ta có một nhiệm vụ: tìm tất cả các dòng trong một tệp bắt đầu bằng từ “How”, chuyển chúng thành UPPER CASE và xuất chúng ra bảng điều khiển. Giải pháp sử dụng một lớp Filestrong Java 7 sẽ như thế nào? Một cái gì đó như thế này:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {

   public static void main(String[] args) throws IOException {

       List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);

       List<String> result = new ArrayList<>();

       for (String s: lines) {
           if (s.startsWith("How")) {
               String upper = s.toUpperCase();
               result.add(upper);
           }
       }

       for (String s: result) {
           System.out.println(s);
       }
   }
}
Đầu ra của bảng điều khiển: NHƯ MỘT TẦM NHÌN NHANH CHÓNG, NHƯ MỘT THIÊN TÀI VẺ ĐẸP NGUYÊN CHẤT. Có vẻ như chúng tôi đã làm được việc đó, nhưng bạn có nghĩ rằng đối với một nhiệm vụ đơn giản như vậy, mã của chúng tôi hóa ra hơi... dài dòng không? Sử dụng API luồng Java 8, giải pháp trông thanh lịch hơn nhiều:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

   public static void main(String[] args) throws IOException {

       Stream<String> stream = Files.lines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"));

       List<String> result  = stream
               .filter(line -> line.startsWith("How"))
               .map(String::toUpperCase)
               .collect(Collectors.toList());
       result.forEach(System.out::println);
   }
}
Chúng tôi đã đạt được kết quả tương tự nhưng với ít mã hơn nhiều! Hơn nữa, không thể nói rằng chúng ta đã thua ở “khả năng đọc”. Tôi nghĩ bạn có thể dễ dàng nhận xét về chức năng của mã này, ngay cả khi bạn không quen với API luồng. Nhưng tóm lại, Luồng là một chuỗi các phần tử mà trên đó bạn có thể thực hiện các chức năng khác nhau. Chúng ta lấy đối tượng Stream từ phương thức Files.lines()và sau đó áp dụng 3 hàm cho nó:
  1. Bằng cách sử dụng phương pháp này, filter()chúng tôi chỉ chọn những dòng từ tệp bắt đầu bằng “How”.

  2. Chúng ta duyệt qua tất cả các dòng đã chọn bằng phương pháp này map()và đưa từng dòng đó về CHỮ HOA.

  3. Chúng tôi kết hợp tất cả các dòng kết quả vào Listviệc sử dụng collect().

Ở lối ra chúng ta nhận được kết quả tương tự: NHƯ MỘT TẦM NHÌN NHANH CHÓNG, NHƯ THIÊN TÀI VẺ ĐẸP THUẦN TUYỆT. Nếu bạn muốn tìm hiểu thêm về các khả năng của thư viện này, chúng tôi khuyên bạn nên đọc bài viết này . Chúng ta sẽ quay trở lại với con cừu của mình, tức là các tập tin :) Khả năng cuối cùng mà chúng ta sẽ xem xét hôm nay là đi qua cây tập tin . Cấu trúc tệp trong các hệ điều hành hiện đại thường có dạng cây: nó có gốc và có các nhánh mà từ đó các nhánh khác có thể được tách ra, v.v. Thư mục đóng vai trò là gốc và nhánh. Ví dụ: thư mục “ C:// ” có thể đóng vai trò là thư mục gốc . Hai nhánh tách ra từ nó: “ C://Downloads ” và “ C://Users ”. Từ mỗi nhánh này có thêm 2 nhánh: “ C://Downloads/Pictures ”, “ C://Downloads/Video ”, “ C://Users/JohnSmith ”, “ C://Users/Pudge2005 ” . Các nhánh khác tách ra từ các nhánh này, v.v. - đây là cách một cái cây hóa ra. Trong Linux, nó trông giống nhau, chỉ có thư mục đóng vai trò là thư mục gốc / Tệp, Đường dẫn - 2 Bây giờ hãy tưởng tượng rằng chúng ta có một nhiệm vụ: biết thư mục gốc, chúng ta phải xem qua nó, xem xét các thư mục ở mọi cấp độ và tìm các tệp có nội dung trong đó chúng tôi cần. Chúng ta sẽ tìm kiếm các file có dòng “This is the file we need!” Thư mục gốc của chúng tôi sẽ là thư mục “testFolder”, nằm trên màn hình nền. Bên trong nó có các nội dung sau: Tệp, Đường dẫn - 3Bên trong các thư mục cấp 1-a và cấp 1-b cũng có các thư mục: Tệp, Đường dẫn - 4Tệp, Đường dẫn - 5Bên trong các “thư mục cấp 2” này không còn thư mục nào nữa, chỉ có các tệp riêng lẻ: Tệp, Đường dẫn - 6Tệp, Đường dẫn - 7Chúng tôi sẽ chỉ định đặc biệt 3 tệp có nội dung mà chúng tôi cần có tên rõ ràng - FileWeNeed1.txt , FileWeNeed2.txt, FileWeNeed3.txt Đây là những cái chúng ta cần tìm theo nội dung bằng Java. Làm thế nào chúng ta có thể làm điều này? Một phương pháp rất mạnh mẽ để duyệt cây tập tin đã được giải cứu - Files.walkFileTree(). Đây là những gì chúng ta cần làm. Đầu tiên, chúng ta cần FileVisitor. FileVisitorlà một giao diện đặc biệt mô tả tất cả các phương thức duyệt cây tệp. Cụ thể, chúng tôi sẽ đặt logic vào đó để đọc nội dung của tệp và kiểm tra xem nó có chứa văn bản chúng tôi cần hay không. Đây là những gì của chúng ta sẽ trông như thế nào FileVisitor:
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

public class MyFileVisitor extends SimpleFileVisitor<Path> {

   @Override
   public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

       List<String> lines = Files.readAllLines(file);
       for (String s: lines) {
           if (s.contains("This is the file we need")) {
               System.out.println("Required file found!");
               System.out.println(file.toAbsolutePath());
               break;
           }
       }

       return FileVisitResult.CONTINUE;
   }
}
Trong trường hợp này, lớp của chúng tôi kế thừa từ SimpleFileVisitor. Đây là lớp triển khai FileVisitor, trong đó bạn chỉ cần ghi đè một phương thức: visitFile(). Ở đây chúng tôi mô tả những gì cần phải làm với mỗi tệp trong mỗi thư mục. Nếu bạn cần logic truyền tải phức tạp hơn, bạn nên viết phần triển khai của riêng mình FileVisitor. Ở đó bạn sẽ cần thực hiện thêm 3 phương pháp:
  • preVisitDirectory()— logic phải được thực thi trước khi vào thư mục;

  • visitFileFailed()— phải làm gì nếu không thể nhập tệp (không có quyền truy cập hoặc lý do khác);

  • postVisitDirectory()— logic phải được thực thi sau khi vào thư mục.

Chúng tôi không có logic như vậy nên đối với chúng tôi như vậy là đủ SimpleFileVisitor. Logic bên trong phương thức này visitFile()khá đơn giản: đọc tất cả các dòng từ tệp, kiểm tra xem chúng có chứa nội dung chúng ta cần hay không và nếu có, hãy in đường dẫn tuyệt đối đến bảng điều khiển. Dòng duy nhất có thể gây rắc rối cho bạn là dòng này:
return FileVisitResult.CONTINUE;
Trên thực tế, mọi thứ đều đơn giản. Ở đây chúng tôi chỉ mô tả những gì chương trình sẽ làm sau khi tệp được nhập và tất cả các thao tác cần thiết đã được hoàn thành. Trong trường hợp của chúng ta, chúng ta cần tiếp tục duyệt cây nên chúng ta chọn tùy chọn CONTINUE. Nhưng chẳng hạn, chúng tôi có thể có một nhiệm vụ khác: không phải tìm tất cả các tệp có chứa “Đây là tệp chúng tôi cần”, mà chỉ tìm một tệp như vậy . Sau đó, chương trình phải được chấm dứt. Trong trường hợp này, mã của chúng ta trông giống hệt nhau, nhưng thay vì ngắt; sẽ:
return FileVisitResult.TERMINATE;
Nào, hãy chạy mã của chúng ta và xem nó có hoạt động không.
import java.io.IOException;
import java.nio.file.*;

public class Main {

   public static void main(String[] args) throws IOException {

       Files.walkFileTree(Paths.get("C:\\Users\\Username\\Desktop\\testFolder"), new MyFileVisitor());
   }
}
Đầu ra của bảng điều khiển: Đã tìm thấy tệp cần thiết! C:\Users\Username\Desktop\testFolder\FileWeNeed1.txt Đã tìm thấy tệp cần thiết! C:\Users\Username\Desktop\testFolder\level1-a\level2-aa\FileWeNeed2.txt Đã tìm thấy tệp cần thiết! C:\Users\Username\Desktop\testFolder\level1-b\level2-bb\FileWeNeed3.txt Tuyệt vời, chúng tôi đã làm được! :) Nếu bạn muốn biết thêm về walkFileTree(), tôi giới thiệu cho bạn bài viết này . Bạn cũng có thể hoàn thành một nhiệm vụ nhỏ - thay thế nó SimpleFileVisitorbằng một nhiệm vụ thông thường FileVisitor, thực hiện cả 4 phương pháp và đưa ra mục đích cho chương trình này. Ví dụ: bạn có thể viết chương trình sẽ ghi lại tất cả hành động của mình: hiển thị tên của tệp hoặc thư mục trong bảng điều khiển trước/sau khi nhập chúng. Thế thôi - hẹn gặp lại! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION