How to read all files in a folder from Java?
如何通过Java读取文件夹中的所有文件?
1 2 3 4 5 6 7 8 9 10 11 12 |
Field.API可以从Java 8获得。
1 2 3 4 5 | try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) { paths .filter(Files::isRegularFile) .forEach(System.out::println); } |
该示例使用API指南中推荐的Try with Resources模式。它确保无论在什么情况下,流都将关闭。
1 2 3 4 5 6 7 8 |
在Java 8中,您可以这样做
1 2 3 | Files.walk(Paths.get("/path/to/folder")) .filter(Files::isRegularFile) .forEach(System.out::println); |
它将在排除所有目录的同时打印文件夹中的所有文件。如果需要列表,请执行以下操作:
1 2 3 | Files.walk(Paths.get("/path/to/folder")) .filter(Files::isRegularFile) .collect(Collectors.toList()) |
如果您想返回
1 2 3 4 | List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder")) .filter(Files::isRegularFile) .map(Path::toFile) .collect(Collectors.toList()); |
您还需要确保关闭流!否则,您可能会遇到一个异常,告诉您打开的文件太多。阅读此处了解更多信息。
关于使用新Java 8功能的这个主题的所有答案都忽略了关闭流。接受答案中的示例应为:
1 2 3 4 5 6 7 | try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) { filePathStream.forEach(filePath -> { if (Files.isRegularFile(filePath)) { System.out.println(filePath); } }); } |
从
The returned stream encapsulates one or more DirectoryStreams. If
timely disposal of file system resources is required, the
try-with-resources construct should be used to ensure that the
stream's close method is invoked after the stream operations are completed.
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 | 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()); } } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 } } |
在Java 7中,您现在可以这样做——http://DOCS.Oracle .COM/JavaSe/Toogs/Value/IO/DRIs。
1 2 3 4 5 6 7 8 9 10 | 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); } |
您还可以创建一个过滤器,然后将其传递到上面的
1 2 3 4 5 6 7 8 9 10 11 | 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; } } }; |
其他筛选示例-http://docs.oracle.com/javase/tutorial/essential/io/dirs.html_glob
只需使用EDCOX1×2(Java 7)遍历所有文件
1 2 3 4 5 6 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; } }); |
如果需要更多选项,可以使用此函数来填充文件夹中的文件数组列表。选项包括:递归性和要匹配的模式。
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 | 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; } |
最好的,阿德里安
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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]); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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() +" "; } } |
如https://stackoverflow.com/a/286001/146745所示,很好地使用了
1 2 3 4 5 6 | File fl = new File(dir); File[] files = fl.listFiles(new FileFilter() { public boolean accept(File file) { return file.isFile(); } }); |
我认为这是读取文件夹和子文件夹中所有文件的好方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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); } } |
虽然我同意Rich、Orian和其他人使用:
1 2 3 4 5 6 7 |
出于某种原因,这里的所有示例都使用绝对路径(即,从根目录开始,或者说,对于Windows,使用驱动器号(C:))。
我想补充一下,也可以使用相对路径。因此,如果您的pwd(当前目录/文件夹)是folder1,并且您想要解析folder1/子文件夹,您只需编写(在上面的代码中,而不是在下面的代码中):
使用Java 1.7递归地在命令行中指定的目录中列出文件的简单示例:
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 | 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()); } } } } |
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 | 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 EDCOX1(6)是很好的,当你是SOORE,它不会抛出避免Java 8文件。
这里有一个安全的解决方案,虽然不像Java8EDCX1那样优雅,但是6:
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 | 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 ", file); ++count[0]; return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException { System.err.printf("Visiting failed for %s ", file); return FileVisitResult.SKIP_SUBTREE; } @Override public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException { System.out.printf("About to visit directory %s ", dir); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } |
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 | 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()); } } } } |
您可以将文件路径放入参数,并使用所有文件路径创建一个列表,而不是手动将其放入列表。然后使用for循环和读卡器。TXT文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 }}} |
1 2 3 4 5 6 7 8 9 10 11 12 |
根据获取目录中所有文件的说明。方法
例如,下一个文件树是:
1 2 3 4 5 6 7 | \---folder | file1.txt | file2.txt | \---subfolder file3.txt file4.txt |
使用
1 2 3 |
给出以下结果:
1 2 3 4 | folder\file1.txt folder\file2.txt folder\subfolder\file3.txt folder\subfolder\file4.txt |
要仅获取当前目录中的所有文件,请使用
1 2 3 |
结果:
1 2 | folder\file1.txt folder\file2.txt |
list down files from Test folder present inside class path
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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())); } } } } } |
为了扩展接受的答案,我将文件名存储到arraylist(而不是将其转储到system.out.println),我创建了一个助手类"myfileutils",以便其他项目可以导入它:
1 2 3 4 5 6 7 8 9 10 11 | 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() ); } } } } |
我添加了文件名的完整路径。您可以这样使用它:
1 2 3 4 5 6 7 8 9 10 |
arraylist由"value"传递,但该值用于指向生活在JVM堆中的相同arraylist对象。这样,每个递归调用都会将文件名添加到同一个arraylist(我们不会在每个递归调用上创建新的arraylist)。
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 | /** * 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")); } } |
您可以过滤任何文本文件或任何其他扩展名..只需将其替换为.mp3
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 | 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); } } } } } |
这将读取给定路径中的指定文件扩展名文件(同时查找子文件夹)
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 | 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; } |
上面有很多很好的答案,这里有一种不同的方法:在Maven项目中,默认情况下,您放入Resources文件夹中的所有内容都会复制到Target/Classes文件夹中。查看运行时可用的内容
1 2 3 4 5 6 7 8 |
现在要从特定文件夹获取文件,假设您的资源文件夹中有一个名为"res"的文件夹,只需替换:
1 |
如果要在com.companyname包中访问,请执行以下操作:
1 | contextClassLoader.getResource("com.companyName"); |
给定一个basedir,列出它下面的所有文件和目录,迭代地编写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; } |
这样做很好:
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 | 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); } } |
为了防止在listfiles()函数上出现nullpointerException,并递归地从子目录中获取所有文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); |
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 | import java.io.File; public class Test { public void test1() { System.out.println("TEST 1"); } public static void main(String[] args) throws SecurityException, ClassNotFoundException{ File actual = new File("src"); File list[] = actual.listFiles(); for(int i=0; i<list.length; i++){ String substring = list[i].getName().substring(0, list[i].getName().indexOf(".")); if(list[i].isFile() && list[i].getName().contains(".java")){ if(Class.forName(substring).getMethods()[0].getName().contains("main")){ System.out.println("CLASS NAME"+Class.forName(substring).getName()); } } } } } |
只要传递你的文件夹,它就会告诉你方法的主要类。