Bagaimana cara membaca semua file dalam folder melalui Java?
Files.walkFileTree
, lihat stackoverflow.com/a/23814217/1115554
Bagaimana cara membaca semua file dalam folder melalui Java?
Files.walkFileTree
, lihat stackoverflow.com/a/23814217/1115554
Jawaban:
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 tersedia dari Java 8.
try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
paths
.filter(Files::isRegularFile)
.forEach(System.out::println);
}
Contoh ini menggunakan pola coba-dengan-sumber daya yang direkomendasikan dalam panduan API. Ini memastikan bahwa tidak peduli keadaan apa pun aliran akan ditutup.
getName()
hanya akan memberikan nama file dalam direktori, yang bisa menjadi subdirektori dari aslinya. Jika Anda berencana untuk menggunakan informasi ini untuk menemukan file, Anda mungkin menemukan jalur yang diberikan oleh getPath()
untuk menjadi lebih bermanfaat.
filter
metode ini. Maka forEach tidak lagi dibutuhkan. Lihat di sini -> 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());
}
}
Di Java 8 Anda bisa melakukan ini
Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
yang akan mencetak semua file dalam folder sambil mengecualikan semua direktori. Jika Anda memerlukan daftar, hal-hal berikut akan dilakukan:
Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.collect(Collectors.toList())
Jika Anda ingin kembali, List<File>
bukan List<Path>
hanya memetakannya:
List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.collect(Collectors.toList());
Anda juga perlu memastikan untuk menutup aliran! Kalau tidak, Anda mungkin mengalami pengecualian yang memberi tahu Anda bahwa terlalu banyak file yang terbuka. Baca di sini untuk informasi lebih lanjut.
java.nio.file.Path
? Saya baru saja memeriksa metode toFile () harus ada bahkan sebelum java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Semua jawaban pada topik ini yang menggunakan fungsi Java 8 yang baru diabaikan untuk menutup aliran. Contoh dalam jawaban yang diterima harus:
try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
filePathStream.forEach(filePath -> {
if (Files.isRegularFile(filePath)) {
System.out.println(filePath);
}
});
}
Dari javadoc Files.walk
metode:
Aliran yang dikembalikan merangkum satu atau lebih DirectoryStreams. Jika pembuangan tepat waktu dari sumber daya sistem file diperlukan, konstruk coba-dengan-sumber daya harus digunakan untuk memastikan bahwa metode penutupan aliran dipanggil setelah operasi aliran selesai.
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
}
}
Di Java 7 dan lebih tinggi Anda bisa menggunakan 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);
}
Anda juga dapat membuat filter yang kemudian dapat diteruskan ke newDirectoryStream
metode di atas
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;
}
}
};
Untuk contoh penyaringan lainnya, [lihat dokumentasi]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
Satu komentar sesuai untuk mendapatkan semua file di direktori.
Metode ini Files.walk(path)
akan mengembalikan semua file dengan berjalan di pohon file yang di-root pada file awal yang diberikan.
Misalnya, ada bagan file berikutnya:
\---folder
| file1.txt
| file2.txt
|
\---subfolder
file3.txt
file4.txt
Menggunakan java.nio.file.Files.walk(Path)
:
Files.walk(Paths.get("folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Memberikan hasil sebagai berikut:
folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt
Untuk mendapatkan semua file hanya di direktori saat ini, gunakan java.nio.file.Files.list(Path)
:
Files.list(Paths.get("folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Hasil:
folder\file1.txt
folder\file2.txt
Files.list
contoh. Jika Anda tidak ingin mencari secara rekursif, ini bisa menjadi pilihan terbaik kadang-kadang.
Cukup telusuri semua File menggunakan 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;
}
});
Jika Anda ingin lebih banyak opsi, Anda dapat menggunakan fungsi ini yang bertujuan untuk mengisi daftar array file yang ada dalam folder. Pilihannya adalah: kesesuaian dan pola yang cocok.
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;
}
Terbaik, 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];
tidak diperlukan, karena akan ditimpa oleh baris berikutnya!
penggunaan bagus java.io.FileFilter
seperti yang terlihat di 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]);
}
}
}
Saya pikir ini adalah cara yang baik untuk membaca semua file dalam folder dan sub folder
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);
}
}
Contoh sederhana yang berfungsi dengan Java 1.7 untuk mendaftarkan file secara rekursif dalam direktori yang ditentukan pada command-line:
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());
}
}
}
}
Sementara saya setuju dengan Rich, Orian dan yang lainnya untuk menggunakan:
final File keysFileFolder = new File(<path>);
File[] fileslist = keysFileFolder.listFiles();
if(fileslist != null)
{
//Do your thing here...
}
untuk beberapa alasan semua contoh di sini menggunakan path absolut (yaitu semua jalan dari root, atau, katakanlah, huruf drive (C: \) untuk windows ..)
Saya ingin menambahkan bahwa mungkin untuk menggunakan jalur relatif juga. Jadi, jika Anda pwd (direktori / folder saat ini) adalah folder1 dan Anda ingin mem-parsing folder1 / subfolder, Anda cukup menulis (dalam kode di atas alih-alih):
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(..)
baik ketika Anda berada di darat, ia tidak akan membuang Menghindari Java 8 Files.walk (..) penyebab penghentian (java.nio.file.AccessDeniedException) .
Ini adalah solusi yang aman, meski tidak seanggun 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();
}
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);
}
}
}
Hanya untuk memperluas jawaban yang diterima saya menyimpan nama file ke ArrayList (bukan hanya membuangnya ke System.out.println) Saya membuat kelas pembantu "MyFileUtils" sehingga dapat diimpor oleh proyek lain:
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() );
}
}
}
}
Saya menambahkan path lengkap ke nama file. Anda akan menggunakannya seperti ini:
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 dilewatkan oleh "nilai", tetapi nilainya digunakan untuk menunjuk ke objek ArrayList yang sama yang hidup di JVM Heap. Dengan cara ini, setiap panggilan rekursi menambahkan nama file ke ArrayList yang sama (kami TIDAK membuat ArrayList baru pada setiap panggilan rekursif).
Anda dapat menempatkan path file ke argumen dan membuat daftar dengan semua filepath dan tidak meletakkannya secara manual. Kemudian gunakan for for dan pembaca. Contoh untuk file 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);
}
}
}
}
}
daftar file dari folder Test yang ada di dalam jalur kelas
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"));
}
}
Anda dapat memfilter file teks apa saja atau ekstensi lain .. hanya menggantinya dengan .MP3
Ada banyak jawaban bagus di atas, inilah pendekatan yang berbeda: Dalam proyek pakar, semua yang Anda masukkan ke folder sumber disalin secara default di folder target / kelas. Untuk melihat apa yang tersedia saat runtime
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());
}
Sekarang untuk mendapatkan file dari folder tertentu, katakanlah Anda memiliki folder bernama 'res' di folder sumber daya Anda, cukup ganti:
URL resource = contextClassLoader.getResource("res");
Jika Anda ingin memiliki akses dalam paket com.companyName Anda, maka:
contextClassLoader.getResource("com.companyName");
Ini akan Baca file ekstensi file yang Ditentukan di jalur yang diberikan (terlihat sub folder juga)
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
?
Ini akan bekerja dengan baik:
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);
}
}
Diberikan baseDir, daftar semua file dan direktori di bawahnya, ditulis secara iteratif.
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;
}
untuk mencegah Nullpointerexceptions pada fungsi listFiles () dan secara berulang mendapatkan semua file dari subdirektori juga ..
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);