2009-09-06 15 views
45

क्या जावा कोड में कोई अंतर्निहित है जो किसी दिए गए फ़ोल्डर को पार्स करेगा और .txt फ़ाइलों के लिए खोज करेगा?जावा: निर्दिष्ट फ़ोल्डर में .txt फ़ाइलों को खोजें

+2

से सभी पाठ फ़ाइलों को जोड़ने के लिए हो सकता है इस सवाल का जवाब मंच विशिष्ट होना कोड है? – Milhous

+0

यह भी देखें http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

यह एक वास्तविक सवाल है। अगर इसे समझना मुश्किल था क्योंकि इसे बंद होने की आवश्यकता होगी, तो ऐसा कोई जवाब नहीं होगा जो न केवल प्रश्न का उत्तर दे, बल्कि 89 अपवॉट भी हो। – SpaceCore186

उत्तर

110

आप java.io.File वर्ग द्वारा प्रदान की listFiles() विधि का उपयोग कर सकते हैं।

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"); } 
     }); 

    } 

} 
+1

@ फ़नसुक, यह मेरे लिए ठीक है, कम से कम सरल परीक्षण मामलों के लिए मैंने कोशिश की है। 36 लोग सहमत हैं। यह आपके लिए किस तरह से काम नहीं करता है? – djna

20

प्रयास करें:

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; 
} 

आप एक केस संवेदी खोज करने के लिए जिस स्थिति में हैं:

if (file.getName().toLowerCase().endsWith((".txt"))) { 

आप रिकर्सिवली पाठ फ़ाइलों के लिए एक निर्देशिका वृक्ष के माध्यम से खोज करना चाहते हैं, तो आप होना चाहिए उपरोक्त को एक रिक्त कार्य या एक स्टैक का उपयोग करके एक पुनरावृत्ति समारोह के रूप में अनुकूलित करने में सक्षम है।

+0

अच्छा लग रहा है। मुझे इसे आज़माएं .. – Sri

-2

यहाँ मेरी मंच विशिष्ट कोड (यूनिक्स)

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; 
    } 
+4

कोई भी आसान, क्रॉस-प्लेटफ़ॉर्म समाधान उपलब्ध होने पर इसका उपयोग क्यों करना चाहेगा? – BlueSilver

+0

एक देशी संस्करण का उपयोग करने का एक कारण एक लंबी निर्देशिका में फ़ाइलों की एक बड़ी सूची पढ़ने से बचने के लिए है। जावा 6 में, वर्ग 'java.io.File' में उन तरीकों को शामिल नहीं किया गया है जो किसी निर्देशिका में फ़ाइलों को स्ट्रीम के रूप में पढ़ते हैं या इटरेटर का उपयोग करते हैं। 'File.listFiles (FileFilter) 'और' फ़ाइल 'के जावा 6 कार्यान्वयन।listFiles (FilenameFilter) 'पहले दोनों निर्देशिका से सभी फाइलें पढ़ते हैं और फिर फ़िल्टर लागू करते हैं। जब लाखों फाइलों वाली निर्देशिका का सामना करना पड़ता है, उदाहरण के लिए, 'File.listFiles' इतनी सारी फाइलें पढ़ सकता है कि यह JVM में सभी ढेर मेमोरी का उपभोग कर सकता है। –

+0

'File.listFiles (FileFilter)' के कार्यान्वयन के लिए http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java देखें। –

6

यह वास्तव में उपयोगी है, मैं एक मामूली बदलाव के साथ यह प्रयोग किया है:

filename=directory.list(new FilenameFilter() { 
    public boolean accept(File dir, String filename) { 
     return filename.startsWith(ipro); 
    } 
}); 
16
import org.apache.commons.io.filefilter.WildcardFileFilter; 

......... 
......... 

File dir = new File(fileDir); 
FileFilter fileFilter = new WildcardFileFilter("*.txt"); 
File[] files = dir.listFiles(fileFilter); 

कोड ऊपर मेरे लिए अच्छा काम करता है

2

मैं पदों मैंने पाया के आधार पर मेरे समाधान बनाया यहां Google के साथ। और मैंने सोचा कि मेरा पोस्ट करने के लिए कोई नुकसान नहीं है, भले ही यह पुराना धागा हो।

यह कोड केवल एक ही प्लस देता है कि यह उप-निर्देशिकाओं के माध्यम से भी पुनरावृत्त हो सकता है।

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; 

विधि इस प्रकार है:

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; 
} 
-2

आयात org.apache.commons.io.FileUtils;

सूची htmFileList = new ArrayList();

के लिए

(फ़ाइल फ़ाइल: (सूची) FileUtils.listFiles (नई फ़ाइल (srcDir), नई String [] { "txt", "TXT"}, सच)) { htmFileList.add (फ़ाइल); }

यह मेरी नवीनतम एक निर्देशिका

1
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!"); 
     } 
    } 
} 
संबंधित मुद्दे