如何从Java读取文件夹中的所有文件?
如何通过Java读取文件夹中的所有文件?
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);
Files.walk API可从Java 8获得。
try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) { paths .filter(Files::isRegularFile) .forEach(System.out::println); }
该示例使用API指南中推荐的尝试与资源模式。 它确保无论什么情况下都会closures。
File folder = new File("/Users/you/folder/"); File[] listOfFiles = folder.listFiles(); for (File file : listOfFiles) { if (file.isFile()) { System.out.println(file.getName()); } }
在Java 8中,您可以执行此操作
Files.walk(Paths.get("/path/to/folder")) .filter(Files::isRegularFile) .forEach(System.out::println);
这将打印一个文件夹中的所有文件,同时排除所有目录。 如果你需要一个列表,下面会做:
Files.walk(Paths.get("/path/to/folder")) .filter(Files::isRegularFile) .collect(Collectors.toList())
如果你想返回List<File>
而不是List<Path>
只需要映射它:
List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder")) .filter(Files::isRegularFile) .map(Path::toFile) .collect(Collectors.toList());
您还需要确保closuresstream! 否则,你可能会遇到一个exception,告诉你打开了太多的文件。 在这里阅读更多的信息。
所有使用新的Java 8function的主题的答案忽略closuresstream。 被接受的答案中的例子应该是:
try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) { filePathStream.forEach(filePath -> { if (Files.isRegularFile(filePath)) { System.out.println(filePath); } }); }
从Files.walk
方法的javadoc中:
返回的stream封装一个或多个DirectoryStreams。 如果需要及时处理文件系统资源,则应该使用try-with-resources构造来确保在stream操作完成之后调用stream的close方法。
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 } }
在Java 7中,您现在可以这样做 – 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); }
您也可以创build一个filter,然后将其传递给上面的newDirectoryStream
方法
DirectoryStream.Filter<Path> filter = newDirectoryStream.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
使用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; } });
如果你想要更多的select,你可以使用这个函数来填充文件夹中的文件的数组列表。 选项是:recursivility和模式匹配。
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; }
最好的,阿德里安
在https://stackoverflow.com/a/286001/146745上看到了;java.io.FileFilter
很好用法
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]); } } }
我认为这是读取文件夹和子文件夹中的所有文件的好方法
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); } }
简单的例子,用Java 1.7来recursion地列出在命令行中指定的目录中的文件:
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()); } } } }
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"; } }
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]); } } } }
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); } } } } }
从类path中存在的Test文件夹中列出文件
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")); } }
您可以过滤任何文本文件或任何其他扩展名,只要将其replace为.MP3
void getFiles(){ String dirPath = "E:/folder_name"; File dir = new File(dirPath); String[] files = dir.list(); if (files.length == 0) { System.out.println("The directory is empty"); } else { for (String aFile : files) { System.out.println(aFile); } } }
虽然我同意Rich,Orian和其他人的使用:
final File keysFileFolder = new File(<path>); File[] fileslist = keysFileFolder.listFiles(); if(fileslist != null) { //Do your thing here... }
由于某些原因,这里的所有例子都使用绝对path(即从根目录开始,或者说驱动器盘符(C:\))。
我想补充一点,可以使用相对path。 所以,如果你是pwd(当前目录/文件夹)是folder1,你想parsingfolder1 /子文件夹,你只需写(在上面的代码中):
final File keysFileFolder = new File("subfolder");
Java 8 Files.walk(..)
是很好的,当你不喜欢它不会抛出避免Java 8 Files.walk(..)终止原因(java.nio.file.AccessDeniedException) 。
这是一个安全的解决scheme,虽然不如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(); }
只是为了扩大接受的答案,我把文件名存储到一个ArrayList(而不是将它们转储到System.out.println)我创build了一个辅助类“MyFileUtils”,以便可以由其他项目导入:
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() ); } } } }
我添加了文件名的完整path。 你会这样使用它:
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是通过“value”传递的,但是这个值被用来指向JVM堆中的同一个ArrayList对象。 这样,每次recursion调用都会将文件名添加到同一个ArrayList(我们不会在每个recursion调用中创build一个新的ArrayList)。
以防止listFiles()函数上的Nullpointerexceptions并从子目录中recursion地获取所有文件。
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);
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()); } } } } }
只要通过你的文件夹,它会告诉你的主要类的方法。