Làm thế nào để đọc tất cả các tệp trong một thư mục thông qua Java?
Files.walkFileTree
, hãy xem stackoverflow.com/a/23814217/1115554
Làm thế nào để đọc tất cả các tệp trong một thư mục thông qua Java?
Files.walkFileTree
, hãy xem stackoverflow.com/a/23814217/1115554
Câu trả lời:
public void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
System.out.println(fileEntry.getName());
}
}
}
final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);
API Files.walk có sẵn từ Java 8.
try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
paths
.filter(Files::isRegularFile)
.forEach(System.out::println);
}
Ví dụ sử dụng mẫu thử với tài nguyên được đề xuất trong hướng dẫn API. Nó đảm bảo rằng bất kể trường hợp nào, luồng sẽ được đóng lại.
getName()
sẽ chỉ cung cấp tên của tệp trong thư mục của nó, có thể là thư mục con của bản gốc. Nếu bạn dự định sử dụng thông tin này để tìm các tệp, bạn có thể thấy đường dẫn được cung cấp getPath()
sẽ hữu ích hơn.
filter
phương thức này. Sau đó, forEach không còn cần thiết nữa. Xem tại đây -> stackoverflow.com/a/26215931/1029251
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile()) {
System.out.println(file.getName());
}
}
Trong Java 8, bạn có thể làm điều này
Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
sẽ in tất cả các tệp trong một thư mục trong khi loại trừ tất cả các thư mục. Nếu bạn cần một danh sách, sau đây sẽ làm:
Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.collect(Collectors.toList())
Nếu bạn muốn quay lại List<File>
thay vì List<Path>
chỉ ánh xạ nó:
List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.collect(Collectors.toList());
Bạn cũng cần đảm bảo đóng luồng! Nếu không, bạn có thể gặp phải một ngoại lệ cho bạn biết rằng có quá nhiều tệp được mở. Đọc ở đây để biết thêm thông tin.
java.nio.file.Path
? Tôi vừa kiểm tra phương thức toFile () nên tồn tại ngay cả trước java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/ trộm
Tất cả các câu trả lời về chủ đề này sử dụng các hàm Java 8 mới đang bỏ qua việc đóng luồng. Ví dụ trong câu trả lời được chấp nhận phải là:
try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
filePathStream.forEach(filePath -> {
if (Files.isRegularFile(filePath)) {
System.out.println(filePath);
}
});
}
Từ javadoc của Files.walk
phương thức:
Luồng được trả về sẽ gói gọn một hoặc nhiều DirectoryStreams. Nếu cần xử lý kịp thời các tài nguyên hệ thống tệp, thì nên sử dụng cấu trúc thử với tài nguyên để đảm bảo rằng phương thức đóng của luồng được gọi sau khi các hoạt động luồng được hoàn thành.
import java.io.File;
public class ReadFilesFromFolder {
public static File folder = new File("C:/Documents and Settings/My Documents/Downloads");
static String temp = "";
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Reading files under the folder "+ folder.getAbsolutePath());
listFilesForFolder(folder);
}
public static void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
// System.out.println("Reading files under the folder "+folder.getAbsolutePath());
listFilesForFolder(fileEntry);
} else {
if (fileEntry.isFile()) {
temp = fileEntry.getName();
if ((temp.substring(temp.lastIndexOf('.') + 1, temp.length()).toLowerCase()).equals("txt"))
System.out.println("File= " + folder.getAbsolutePath()+ "\\" + fileEntry.getName());
}
}
}
}
}
private static final String ROOT_FILE_PATH="/";
File f=new File(ROOT_FILE_PATH);
File[] allSubFiles=f.listFiles();
for (File file : allSubFiles) {
if(file.isDirectory())
{
System.out.println(file.getAbsolutePath()+" is directory");
//Steps for directory
}
else
{
System.out.println(file.getAbsolutePath()+" is file");
//steps for files
}
}
Trong Java 7 bây giờ bạn có thể làm theo cách này - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#listdir
Path dir = ...;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path file: stream) {
System.out.println(file.getFileName());
}
} catch (IOException | DirectoryIteratorException x) {
// IOException can never be thrown by the iteration.
// In this snippet, it can only be thrown by newDirectoryStream.
System.err.println(x);
}
Bạn cũng có thể tạo một bộ lọc mà sau đó có thể được truyền vào newDirectoryStream
phương thức trên
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
public boolean accept(Path file) throws IOException {
try {
return (Files.isRegularFile(path));
} catch (IOException x) {
// Failed to determine if it's a file.
System.err.println(x);
return false;
}
}
};
Các ví dụ lọc khác - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob
Một nhận xét theo để có được tất cả các tập tin trong thư mục.
Phương thức Files.walk(path)
này sẽ trả về tất cả các tệp bằng cách đi bộ cây tệp gốc vào tệp đã bắt đầu.
Chẳng hạn, có cây tập tin tiếp theo:
\---folder
| file1.txt
| file2.txt
|
\---subfolder
file3.txt
file4.txt
Sử dụng java.nio.file.Files.walk(Path)
:
Files.walk(Paths.get("folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Cho kết quả như sau:
folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt
Để nhận tất cả các tệp chỉ trong thư mục hiện tại, hãy sử dụng java.nio.file.Files.list(Path)
:
Files.list(Paths.get("folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Kết quả:
folder\file1.txt
folder\file2.txt
Files.list
ví dụ. Nếu bạn không muốn tìm kiếm đệ quy, đôi khi đây có thể là lựa chọn tốt nhất.
Chỉ cần duyệt qua tất cả các tệp bằng cách sử dụng Files.walkFileTree
(Java 7)
Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("file: " + file);
return FileVisitResult.CONTINUE;
}
});
Nếu bạn muốn có thêm tùy chọn, bạn có thể sử dụng chức năng này nhằm mục đích đưa vào danh sách các tệp có trong một thư mục. Các tùy chọn là: đệ quy và mô hình để phù hợp.
public static ArrayList<File> listFilesForFolder(final File folder,
final boolean recursivity,
final String patternFileFilter) {
// Inputs
boolean filteredFile = false;
// Ouput
final ArrayList<File> output = new ArrayList<File> ();
// Foreach elements
for (final File fileEntry : folder.listFiles()) {
// If this element is a directory, do it recursivly
if (fileEntry.isDirectory()) {
if (recursivity) {
output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));
}
}
else {
// If there is no pattern, the file is correct
if (patternFileFilter.length() == 0) {
filteredFile = true;
}
// Otherwise we need to filter by pattern
else {
filteredFile = Pattern.matches(patternFileFilter, fileEntry.getName());
}
// If the file has a name which match with the pattern, then add it to the list
if (filteredFile) {
output.add(fileEntry);
}
}
}
return output;
}
Tốt nhất, Adrien
File directory = new File("/user/folder");
File[] myarray;
myarray=new File[10];
myarray=directory.listFiles();
for (int j = 0; j < myarray.length; j++)
{
File path=myarray[j];
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
String s = "";
while (br.ready()) {
s += br.readLine() + "\n";
}
}
myarray=new File[10];
không bắt buộc, vì nó sẽ bị ghi đè bởi dòng tiếp theo!
sử dụng tốt java.io.FileFilter
như đã thấy trên https://stackoverflow.com/a/286001/146745
File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isFile();
}
});
static File mainFolder = new File("Folder");
public static void main(String[] args) {
lf.getFiles(lf.mainFolder);
}
public void getFiles(File f) {
File files[];
if (f.isFile()) {
String name=f.getName();
} else {
files = f.listFiles();
for (int i = 0; i < files.length; i++) {
getFiles(files[i]);
}
}
}
Tôi nghĩ rằng đây là cách tốt để đọc tất cả các tệp trong một thư mục và thư mục con
private static void addfiles (File input,ArrayList<File> files)
{
if(input.isDirectory())
{
ArrayList <File> path = new ArrayList<File>(Arrays.asList(input.listFiles()));
for(int i=0 ; i<path.size();++i)
{
if(path.get(i).isDirectory())
{
addfiles(path.get(i),files);
}
if(path.get(i).isFile())
{
files.add(path.get(i));
}
}
}
if(input.isFile())
{
files.add(input);
}
}
Ví dụ đơn giản hoạt động với Java 1.7 để liệt kê đệ quy các tệp trong các thư mục được chỉ định trên dòng lệnh:
import java.io.File;
public class List {
public static void main(String[] args) {
for (String f : args) {
listDir(f);
}
}
private static void listDir(String dir) {
File f = new File(dir);
File[] list = f.listFiles();
if (list == null) {
return;
}
for (File entry : list) {
System.out.println(entry.getName());
if (entry.isDirectory()) {
listDir(entry.getAbsolutePath());
}
}
}
}
Mặc dù tôi đồng ý với Rich, Orian và phần còn lại để sử dụng:
final File keysFileFolder = new File(<path>);
File[] fileslist = keysFileFolder.listFiles();
if(fileslist != null)
{
//Do your thing here...
}
vì một số lý do, tất cả các ví dụ ở đây sử dụng đường dẫn tuyệt đối (nghĩa là tất cả các cách từ root, hoặc, giả sử, ký tự ổ đĩa (C: \) cho các cửa sổ ..)
Tôi muốn thêm rằng có thể sử dụng đường dẫn tương đối là tốt. Vì vậy, nếu pwd của bạn (thư mục / thư mục hiện tại) là thư mục1 và bạn muốn phân tích thư mục1 / thư mục con, bạn chỉ cần viết (trong mã ở trên thay vì):
final File keysFileFolder = new File("subfolder");
package com;
import java.io.File;
/**
*
* @author ?Mukesh
*/
public class ListFiles {
static File mainFolder = new File("D:\\Movies");
public static void main(String[] args)
{
ListFiles lf = new ListFiles();
lf.getFiles(lf.mainFolder);
long fileSize = mainFolder.length();
System.out.println("mainFolder size in bytes is: " + fileSize);
System.out.println("File size in KB is : " + (double)fileSize/1024);
System.out.println("File size in MB is :" + (double)fileSize/(1024*1024));
}
public void getFiles(File f){
File files[];
if(f.isFile())
System.out.println(f.getAbsolutePath());
else{
files = f.listFiles();
for (int i = 0; i < files.length; i++) {
getFiles(files[i]);
}
}
}
}
Java 8 Files.walk(..)
là tốt khi bạn đang sử dụng, nó sẽ không ném Tránh 8 nguyên nhân chấm dứt Files.walk (..) của (java.nio.file.AccessDeniedException) .
Đây là một giải pháp an toàn, mặc dù không thanh lịch như Java 8 Files.walk(..)
:
int[] count = {0};
try {
Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
System.out.printf("Visiting file %s\n", file);
++count[0];
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
System.err.printf("Visiting failed for %s\n", file);
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
System.out.printf("About to visit directory %s\n", dir);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Chỉ để mở rộng câu trả lời được chấp nhận, tôi lưu trữ tên tệp vào một ArrayList (thay vì chỉ bán chúng cho System.out.println) Tôi đã tạo một lớp trợ giúp "MyFileUtils" để nó có thể được nhập bởi các dự án khác:
class MyFileUtils {
public static void loadFilesForFolder(final File folder, List<String> fileList){
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
loadFilesForFolder(fileEntry, fileList);
} else {
fileList.add( fileEntry.getParent() + File.separator + fileEntry.getName() );
}
}
}
}
Tôi đã thêm đường dẫn đầy đủ vào tên tập tin. Bạn sẽ sử dụng nó như thế này:
import MyFileUtils;
List<String> fileList = new ArrayList<String>();
final File folder = new File("/home/you/Desktop");
MyFileUtils.loadFilesForFolder(folder, fileList);
// Dump file list values
for (String fileName : fileList){
System.out.println(fileName);
}
ArrayList được truyền bởi "value", nhưng giá trị được sử dụng để trỏ đến cùng một đối tượng ArrayList sống trong JVM Heap. Theo cách này, mỗi lệnh gọi đệ quy sẽ thêm tên tệp vào cùng một ArrayList (chúng tôi KHÔNG tạo một ArrayList mới trên mỗi lệnh gọi đệ quy).
Bạn có thể đặt đường dẫn tệp để lập luận và tạo một danh sách với tất cả các filepath và không đặt nó vào danh sách theo cách thủ công. Sau đó sử dụng một vòng lặp for và một trình đọc. Ví dụ cho các tệp txt:
public static void main(String[] args) throws IOException{
File[] files = new File(args[0].replace("\\", "\\\\")).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } });
ArrayList<String> filedir = new ArrayList<String>();
String FILE_TEST = null;
for (i=0; i<files.length; i++){
filedir.add(files[i].toString());
CSV_FILE_TEST=filedir.get(i)
try(Reader testreader = Files.newBufferedReader(Paths.get(FILE_TEST));
){
//write your stuff
}}}
package com.commandline.folder;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FolderReadingDemo {
public static void main(String[] args) {
String str = args[0];
final File folder = new File(str);
// listFilesForFolder(folder);
listFilesForFolder(str);
}
public static void listFilesForFolder(String str) {
try (Stream<Path> paths = Files.walk(Paths.get(str))) {
paths.filter(Files::isRegularFile).forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
System.out.println(fileEntry.getName());
}
}
}
}
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class AvoidNullExp {
public static void main(String[] args) {
List<File> fileList =new ArrayList<>();
final File folder = new File("g:/master");
new AvoidNullExp().listFilesForFolder(folder, fileList);
}
public void listFilesForFolder(final File folder,List<File> fileList) {
File[] filesInFolder = folder.listFiles();
if (filesInFolder != null) {
for (final File fileEntry : filesInFolder) {
if (fileEntry.isDirectory()) {
System.out.println("DIR : "+fileEntry.getName());
listFilesForFolder(fileEntry,fileList);
} else {
System.out.println("FILE : "+fileEntry.getName());
fileList.add(fileEntry);
}
}
}
}
}
liệt kê các tập tin từ thư mục Test có trong đường dẫn lớp
import java.io.File;
import java.io.IOException;
public class Hello {
public static void main(final String[] args) throws IOException {
System.out.println("List down all the files present on the server directory");
File file1 = new File("/prog/FileTest/src/Test");
File[] files = file1.listFiles();
if (null != files) {
for (int fileIntList = 0; fileIntList < files.length; fileIntList++) {
String ss = files[fileIntList].toString();
if (null != ss && ss.length() > 0) {
System.out.println("File: " + (fileIntList + 1) + " :" + ss.substring(ss.lastIndexOf("\\") + 1, ss.length()));
}
}
}
}
}
/**
* Function to read all mp3 files from sdcard and store the details in an
* ArrayList
*/
public ArrayList<HashMap<String, String>> getPlayList()
{
ArrayList<HashMap<String, String>> songsList=new ArrayList<>();
File home = new File(MEDIA_PATH);
if (home.listFiles(new FileExtensionFilter()).length > 0) {
for (File file : home.listFiles(new FileExtensionFilter())) {
HashMap<String, String> song = new HashMap<String, String>();
song.put(
"songTitle",
file.getName().substring(0,
(file.getName().length() - 4)));
song.put("songPath", file.getPath());
// Adding each song to SongList
songsList.add(song);
}
}
// return songs list array
return songsList;
}
/**
* Class to filter files which have a .mp3 extension
* */
class FileExtensionFilter implements FilenameFilter
{
@Override
public boolean accept(File dir, String name) {
return (name.endsWith(".mp3") || name.endsWith(".MP3"));
}
}
Bạn có thể lọc bất kỳ tệp văn bản hoặc bất kỳ tiện ích mở rộng nào khác .. chỉ cần thay thế nó bằng .MP3
Có nhiều câu trả lời hay ở trên, đây là một cách tiếp cận khác: Trong một dự án maven, mọi thứ bạn đặt trong thư mục tài nguyên đều được sao chép theo mặc định trong thư mục đích / lớp. Để xem những gì có sẵn trong thời gian chạy
ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
URL resource = contextClassLoader.getResource("");
File file = new File(resource.toURI());
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f.getName());
}
Bây giờ để lấy các tệp từ một thư mục cụ thể, giả sử bạn có một thư mục có tên 'res' trong thư mục tài nguyên của mình, chỉ cần thay thế:
URL resource = contextClassLoader.getResource("res");
Nếu bạn muốn có quyền truy cập trong gói com.companyName thì:
contextClassLoader.getResource("com.companyName");
Điều này sẽ đọc các tệp mở rộng tệp được chỉ định trong đường dẫn cụ thể (cũng xem các thư mục phụ)
public static Map<String,List<File>> getFileNames(String
dirName,Map<String,List<File>> filesContainer,final String fileExt){
String dirPath = dirName;
List<File>files = new ArrayList<>();
Map<String,List<File>> completeFiles = filesContainer;
if(completeFiles == null) {
completeFiles = new HashMap<>();
}
File file = new File(dirName);
FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File file) {
boolean acceptFile = false;
if(file.isDirectory()) {
acceptFile = true;
}else if (file.getName().toLowerCase().endsWith(fileExt))
{
acceptFile = true;
}
return acceptFile;
}
};
for(File dirfile : file.listFiles(fileFilter)) {
if(dirfile.isFile() &&
dirfile.getName().toLowerCase().endsWith(fileExt)) {
files.add(dirfile);
}else if(dirfile.isDirectory()) {
if(!files.isEmpty()) {
completeFiles.put(dirPath, files);
}
getFileNames(dirfile.getAbsolutePath(),completeFiles,fileExt);
}
}
if(!files.isEmpty()) {
completeFiles.put(dirPath, files);
}
return completeFiles;
}
files container
thế nào?
Điều này sẽ hoạt động tốt:
private static void addfiles(File inputValVal, ArrayList<File> files)
{
if(inputVal.isDirectory())
{
ArrayList <File> path = new ArrayList<File>(Arrays.asList(inputVal.listFiles()));
for(int i=0; i<path.size(); ++i)
{
if(path.get(i).isDirectory())
{
addfiles(path.get(i),files);
}
if(path.get(i).isFile())
{
files.add(path.get(i));
}
}
/* Optional : if you need to have the counts of all the folders and files you can create 2 global arrays
and store the results of the above 2 if loops inside these arrays */
}
if(inputVal.isFile())
{
files.add(inputVal);
}
}
Đưa ra một BaseDir, liệt kê tất cả các tệp và thư mục bên dưới nó, được viết lặp đi lặp lại.
public static List<File> listLocalFilesAndDirsAllLevels(File baseDir) {
List<File> collectedFilesAndDirs = new ArrayList<>();
Deque<File> remainingDirs = new ArrayDeque<>();
if(baseDir.exists()) {
remainingDirs.add(baseDir);
while(!remainingDirs.isEmpty()) {
File dir = remainingDirs.removeLast();
List<File> filesInDir = Arrays.asList(dir.listFiles());
for(File fileOrDir : filesInDir) {
collectedFilesAndDirs.add(fileOrDir);
if(fileOrDir.isDirectory()) {
remainingDirs.add(fileOrDir);
}
}
}
}
return collectedFilesAndDirs;
}
để ngăn chặn Nullpulumexceptions trên hàm listFiles () và nhận lại tất cả các tệp từ thư mục con ..
public void listFilesForFolder(final File folder,List<File> fileList) {
File[] filesInFolder = folder.listFiles();
if (filesInFolder != null) {
for (final File fileEntry : filesInFolder) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry,fileList);
} else {
fileList.add(fileEntry);
}
}
}
}
List<File> fileList = new List<File>();
final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);