Có mã Java được tích hợp sẵn sẽ phân tích cú pháp một thư mục nhất định và tìm kiếm nó cho các tệp .txt
không?Java: Tìm tệp .txt trong thư mục được chỉ định
Trả lời
Bạn có thể sử dụng phương pháp listFiles()
được cung cấp bởi lớp java.io.File
.
import java.io.File;
import java.io.FilenameFilter;
public class Filter {
public File[] finder(String dirName){
File dir = new File(dirName);
return dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String filename)
{ return filename.endsWith(".txt"); }
});
}
}
@Funsuk, điều này làm việc cho tôi tốt, ít nhất là cho các trường hợp thử nghiệm đơn giản tôi đã cố gắng. 36 người dường như đồng ý. Bằng cách nào nó không hoạt động cho bạn? – djna
Hãy thử:
List<String> textFiles(String directory) {
List<String> textFiles = new ArrayList<String>();
File dir = new File(directory);
for (File file : dir.listFiles()) {
if (file.getName().endsWith((".txt"))) {
textFiles.add(file.getName());
}
}
return textFiles;
}
Bạn muốn làm một trường hợp tìm kiếm không nhạy cảm trong trường hợp này:
if (file.getName().toLowerCase().endsWith((".txt"))) {
Nếu bạn muốn một cách đệ quy tìm kiếm thông qua một cây thư mục cho các tập tin văn bản, bạn sẽ có có khả năng thích nghi ở trên như là một hàm đệ quy hoặc một hàm lặp lại bằng cách sử dụng một ngăn xếp.
Có vẻ tốt. Hãy để tôi thử điều này .. – Sri
Đây là mã của tôi nền tảng cụ thể (unix)
public static List<File> findFiles(String dir, String... names)
{
LinkedList<String> command = new LinkedList<String>();
command.add("/usr/bin/find");
command.add(dir);
List<File> result = new LinkedList<File>();
if (names.length > 1)
{
List<String> newNames = new LinkedList<String>(Arrays.asList(names));
String first = newNames.remove(0);
command.add("-name");
command.add(first);
for (String newName : newNames)
{
command.add("-or");
command.add("-name");
command.add(newName);
}
}
else if (names.length > 0)
{
command.add("-name");
command.add(names[0]);
}
try
{
ProcessBuilder pb = new ProcessBuilder(command);
Process p = pb.start();
p.waitFor();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null)
{
// System.err.println(line);
result.add(new File(line));
}
p.destroy();
}
catch (Exception e)
{
e.printStackTrace();
}
return result;
}
Tại sao mọi người lại muốn sử dụng điều này khi có giải pháp đa nền tảng dễ dàng hơn nhiều? – BlueSilver
Một lý do để sử dụng phiên bản gốc là tránh đọc một danh sách lớn các tệp trong một thư mục dài. Trong Java 6, lớp 'java.io.File' không bao gồm các phương thức đọc các tệp trong một thư mục dưới dạng luồng hoặc sử dụng trình lặp. Việc triển khai Java 6 của 'File.listFiles (FileFilter)' và 'File.listFiles (FilenameFilter) 'cả hai đầu tiên đọc tất cả các tập tin từ một thư mục và sau đó áp dụng các bộ lọc. Khi gặp phải một thư mục chứa hàng triệu tập tin, ví dụ, 'File.listFiles' có thể đọc rất nhiều tập tin mà nó có thể tiêu thụ tất cả bộ nhớ heap trong JVM. –
Xem http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java để thực hiện 'File.listFiles (FileFilter)'. –
Nó thực sự hữu ích, tôi đã sử dụng nó với một thay đổi nhỏ:
filename=directory.list(new FilenameFilter() {
public boolean accept(File dir, String filename) {
return filename.startsWith(ipro);
}
});
import org.apache.commons.io.filefilter.WildcardFileFilter;
.........
.........
File dir = new File(fileDir);
FileFilter fileFilter = new WildcardFileFilter("*.txt");
File[] files = dir.listFiles(fileFilter);
Đoạn mã trên hoạt động tuyệt vời đối với tôi
tôi đã thực hiện giải pháp của tôi dựa trên những bài viết tôi thấy ở đây với Google. Và tôi nghĩ rằng không có hại cho việc đăng bài của tôi cũng như ngay cả khi nó là một sợi cũ.
Mã duy nhất cộng với mã này cho là nó có thể lặp qua các thư mục con.
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.WildcardFileFilter;
Phương pháp thực hiện như sau:
List <File> exploreThis(String dirPath){
File topDir = new File(dirPath);
List<File> directories = new ArrayList<>();
directories.add(topDir);
List<File> textFiles = new ArrayList<>();
List<String> filterWildcards = new ArrayList<>();
filterWildcards.add("*.txt");
filterWildcards.add("*.doc");
FileFilter typeFilter = new WildcardFileFilter(filterWildcards);
while (directories.isEmpty() == false)
{
List<File> subDirectories = new ArrayList();
for(File f : directories)
{
subDirectories.addAll(Arrays.asList(f.listFiles((FileFilter)DirectoryFileFilter.INSTANCE)));
textFiles.addAll(Arrays.asList(f.listFiles(typeFilter)));
}
directories.clear();
directories.addAll(subDirectories);
}
return textFiles;
}
org.apache.commons.io.FileUtils nhập khẩu;
Danh sách htmFileList = new ArrayList();
cho (File file: (danh sách) FileUtils.listFiles (new File (srcDir), new String [] { "txt", "TXT"}, true)) { htmFileList.add (file); }
Đây là mã mới nhất của tôi để thêm tất cả các file văn bản từ một thư mục
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
public class FileFinder extends SimpleFileVisitor<Path> {
private PathMatcher matcher;
public ArrayList<Path> foundPaths = new ArrayList<>();
public FileFinder(String pattern) {
matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path name = file.getFileName();
if (matcher.matches(name)) {
foundPaths.add(file);
}
return FileVisitResult.CONTINUE;
}
}
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
Path fileDir = Paths.get("files");
FileFinder finder = new FileFinder("*.txt");
Files.walkFileTree(fileDir, finder);
ArrayList<Path> foundFiles = finder.foundPaths;
if (foundFiles.size() > 0) {
for (Path path : foundFiles) {
System.out.println(path.toRealPath(LinkOption.NOFOLLOW_LINKS));
}
} else {
System.out.println("No files were founds!");
}
}
}
- 1. Java - Tìm kiếm tệp trong thư mục
- 2. Tạo một tệp trong một thư mục được chỉ định
- 3. Cách đọc tệp TXT trong Thư mục Trang Máy chủ Java
- 4. Lưu tệp (.txt) vào Thư mục Nội dung trong Android?
- 5. Đọc tệp .txt bên trong thư mục tài liệu
- 6. Tìm tập tin trong một thư mục sử dụng Java
- 7. Tìm kiếm tệp trong thư mục có nhiều thư mục
- 8. Liệt kê các tệp trong một thư mục được chỉ định bằng PL/SQL
- 9. Cách gửi danh sách tệp trong thư mục tới tệp txt trong Linux
- 10. chuỗi tìm kiếm C# trong tệp txt
- 11. Sửa đổi tệp .txt trong Java
- 12. Tìm tệp có phần mở rộng nhất định trong thư mục
- 13. Cách tìm chỉ mục gần nhất với chỉ mục được chỉ định trong Matlab
- 14. Cách mở tệp trong thư mục khác trong java?
- 15. Tìm tệp và thư mục trong Gói OSGI
- 16. Tìm phần tử với chỉ mục z được chỉ định
- 17. libarchive - Trích xuất vào thư mục được chỉ định
- 18. xóa tất cả các tệp có kích thước bằng không trong thư mục được chỉ định
- 19. Tệp Grails JAR trong thư mục lib không tìm thấy
- 20. Liệt kê tất cả các tệp và thư mục trong thư mục + thư mục con
- 21. Eclipse: Chỉ định nhiều thư mục res như chỉ định nhiều thư mục src
- 22. Tìm hiểu xem tệp nào được thêm vào thư mục
- 23. Git chỉ tìm một thư mục
- 24. Tìm tệp trong thư mục từ dòng lệnh
- 25. Trích xuất jar vào thư mục được chỉ định
- 26. Cách tìm thư mục "Tài liệu của tôi" trong Java
- 27. Java - Đọc nhiều txt file vào một thư mục và xử lý chúng
- 28. Đọc một dòng đặc biệt trong tệp txt trong Java
- 29. Cách tìm tệp mới nhất trong thư mục bằng tập lệnh PowerShell?
- 30. Chu kỳ thông qua các thư mục con và tệp trong thư mục gốc do người dùng chỉ định
Có thể là câu trả lời được nền tảng cụ thể? – Milhous
Xem thêm http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim
Đây là câu hỏi thực sự. Nếu nó khó hiểu vì nó sẽ cần phải được đóng lại, thì sẽ không có câu trả lời mà không chỉ trả lời câu hỏi một cách hoàn hảo, mà còn có 89 upvotes. – SpaceCore186