亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java7中NIO.2的使用——文件遞歸操作

2019-11-14 15:18:30
字體:
來源:轉載
供稿:網友

  眾所周知,遞歸編程是一項有爭議的技術,因為它需要大量的內存,但是它能簡化一些編程任務?;旧?,一個遞歸操作都是程序調用自己傳遞參數修改的值或者參數傳遞到當前的程序循環中。遞歸編程通常用來計算階乘斐波那契數列,回文,謝爾賓斯基地毯等問題。下面的代碼演示了用遞歸實現的階乘。

/**   * Calculate the factorial of n (n! = 1 * 2 * 3 * &hellip; * n).   *   * @param n the number to calculate the factorial of.   * @return n! - the factorial of n.   */ static int fact(int n) {    // Base Case:    // If n <= 1 then n! = 1.    if (n <= 1) {        return 1;    }    // Recursive Case:      // If n > 1 then n! = n * (n-1)!    else {         return n * fact(n-1);         }    }

  許多文件的操作需要訪問文件樹結構下的文件,只用遞歸操作再合適不過。NIO.2 在接口中封裝了遍歷文件樹的過程。這個接口叫FileVisitor,在java.nio.file包中。

  這一節我們從FileVisitor學起,一旦你熟悉了FileVisitor,你就能開發一系列執行操作包括文件樹的游歷,文件的查找,刪除,拷貝和移動。

  -----------------------------------------------------------------------------------------------------------------------

  FileVisitor接口

  如前面提到的,FileVisitor接口提供了對文件樹遞歸遍歷的支持。接口中的方法可以在訪問文件的時候,目錄訪問之前,目錄訪問之后,發生失敗后采取控制,一旦你獲得控制,你就能決定如何訪問文件,通過FileVisitResult枚舉決定當訪問下一個訪問結果時如何處理。這個枚舉有四個枚舉常量:

  • FileVisitResult.CONTINUE: 這個訪問結果表明,遍歷過程應該繼續。根據FileVisitor的方法返回類型可以翻譯成不同的行為。
  • FileVisitResult.SKIP_SIBLINGS: 這個訪問結果表明,遍歷過程應該繼續沒有訪問這個文件或目錄的兄弟姐妹節點。
  • FileVisitResult.SKIP_SUBTREE: 這次訪問結果表明,遍歷過程應該繼續除了這個目錄中剩下其他的條目。
  • FileVisitResult.TERMINATE: 這次訪問結果表明,遍歷過程應該終止。

這些枚舉的常亮可以用下面的代碼進行遍歷。

for (FileVisitResult constant : FileVisitResult.values())     System.out.PRintln(constant);

 下面的章節來討論實現FileVisitor接口的方法如何控制遍歷過程。

FileVisitor.visitFile()方法

  這個方法用在一個在目錄中的文件時被調用。通常,這個方法返回CONTINUE 或 TERMINATE。 例如:當尋找一個文件時,方法應該返回CONTINUE知道文件找到,和文件找到后返回TERMINATE。

  當方法調用后,它接收一個file的引用一節文件的一些基本屬性。如果發生IO異常,它會拋出IOException異常。次方法的簽名如下:

FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException

FileVisitor.preVisitDirectory()方法

  此方法在開始訪問以為目錄的條目開始之前被調用。如果方法返回CONTINUE 則 目錄中的條目將被訪問。如果方法返回SKIP_SUBTREE則目錄里的條目不被訪問。當然你也可以訪問文件或是目錄的兄弟節點如果方法返回SKIP_SIBLINGS。方法簽名為:

FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException

FileVisitor.postVisitDirectory()方法

  當整個目錄里的所有條目訪問以后或訪問突然結束時此方法被調用。當這個方法被調用后,它會持有目錄和IOException的引用——如果沒有異常發生則會返回null,或發生一個異常返回對應的錯誤。下面是此方法的簽名:

FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException

FileVisitor.visitFileFailed()方法

  因為各種不同的原因導致文件不能訪問時此方法被調用,例如文件的屬性不允許讀取或目錄不允許打開。方法簽名如下:

FileVisitResult visitFileFailed(T file, IOException exc) throws IOException

----------------------------------------------------------------------------------------------------------------

 SimpleFileVisitor類

  實現FileVisitor接口必須要求實現所有的方法,如果你只需要實現其中一個或幾個方法,就顯得有些不合需要的。在這種情況下,繼承SimpleFileVisitor類就顯得簡單很多,它實現了FileVisitor接口。

  例如,你想遍歷所有的目錄并列出所有的名字,你可以很容易地使用postVisitDirectory()visitFileFailed() 方法。

class ListTree extends SimpleFileVisitor<Path> {     @Override     public FileVisitResult postVisitDirectory(Path dir, IOException exc) {         System.out.println("Visited directory: " + dir.toString());         return FileVisitResult.CONTINUE;     }     @Override     public FileVisitResult visitFileFailed(Path file, IOException exc) {         System.out.println(exc);         return FileVisitResult.CONTINUE;     } } 

 開始遞歸過程

  一旦你創建了遞歸機制,就可以開始這個過程通過調用Files.walkFileTree()方法。最簡單的Files.walkFileTree()的方法傳遞一個開始文件(通常是根),還有一個 文件訪問者對象去調用每個文件。例如,下面的例子。

Path listDir = Paths.get("C:/rafaelnadal"); //define the starting file tree ListTree walk = new ListTree();             //instantiate the walk try{    Files.walkFileTree(listDir, walk);       //start the walk    } catch(IOException e){      System.err.println(e);    }

  第二個重載的walkFileTree()方法第一個參數是開始的文件,然后是自定義的遍歷的選項,目錄層級的最大訪問數,還有 walk 實例。

 

Path listDir = Paths.get("C:/rafaelnadal");              //define the starting file ListTree walk = new ListTree();                          //instantiate the walk EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); //follow links try{    Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk); //start the walk    } catch(IOException e){      System.err.println(e);    }

-----------------------------------------------------------------------------------------------------------------------------------

 寫一個文件搜索程序

  大多數操作系統會提供專用的工具用來搜索文件(例如,在linux下可以使用find命令,同時windows也提供了文件搜索工具),從最簡單的搜索,到高級搜索,所有的工具都是用同一種方式工作:你指定搜索條件然后等待工具返回匹配的文件。但是,如果你要使用編程方式完成這個功能,FileVisitor接口能幫助你實現遍歷查找。無論你是通過名字,擴展名來查找文件還是通過正則表達式在文件內部搜索文本或符號,這些方法都是訪問每個文件和執行一些檢查來確定這個文件是否滿足你的搜索條件。

  如果你基于FileVisitor來實現你的文件搜索工具,你需要注意下面幾點:

  • visitFile()方法用在執行當前文件和你要搜索的文件比較的最合適的方法。在這一點上,你可以提取每個文件的名字,擴展名或者它的屬性或打開文件用來讀取。你可以使用文件名字,擴展名或是其他的方式來決定哪個文件是你要搜索的那個。有時你需要把這些信息混合到復雜的查詢中。這個方法不能用來查找目錄。
  • 如果你要查找目錄,根據不同的情況,可以使用preVisitDirectory()或postVisitDirectory() 方法來實現比較。
  • 如果文件不能訪問,則 visitFileFailed() 方法會返回 FileVisitResult.CONTINUE,因為這個問題不會決定整個搜索過程終止。
  • 如果你通過名字檢索一個文件并且你知道在整個文件樹中有一個對應名字的文件,這時你可以返回FileVisitResult.TERMINATE一旦你使用visistFile()找到了他。否則,將會返回FileVisitResult.CONTINUE。
  • 檢索流程可以跟蹤符號鏈接。在子目錄樹找到符號鏈接的目標文件之前就能跟蹤符號鏈接就能檢索到,這樣看來是一個很好的主意。但不總是個好主意,例如,在刪除文件的時候則不可用。

通過名字檢索文件

  下面的程序通過名字對文件進行檢索rafa_1.jpg在默認目錄下,當找到后終止檢索。

import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.FileVisitOption;import java.nio.file.FileVisitResult;import java.nio.file.FileVisitor;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.attribute.BasicFileAttributes;import java.util.EnumSet;class Search implements FileVisitor {    private final Path searchedFile;    public boolean found;    public Search(Path searchedFile) {        this.searchedFile = searchedFile;        this.found = false;    }void search(Path file) throws IOException {        Path name = file.getFileName();        if (name != null && name.equals(searchedFile)) {            System.out.println("Searched file was found: " + searchedFile +                                                    " in " + file.toRealPath().toString());            found = true;        }    }    @Override    public FileVisitResult postVisitDirectory(Object dir, IOException exc)                                               throws IOException {        System.out.println("Visited: " + (Path) dir);        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)                                              throws IOException {        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)                                      throws IOException {        search((Path) file);        if (!found) {            return FileVisitResult.CONTINUE;        } else {            return FileVisitResult.TERMINATE;        }    }    @Override    public FileVisitResult visitFileFailed(Object file, IOException exc)                                            throws IOException {        //report an error if necessary        return FileVisitResult.CONTINUE;    }}class Main {    public static void main(String[] args) throws IOException {        Path searchFile = Paths.get("rafa_1.jpg");        Search walk = new Search(searchFile);        EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);        Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();        for (Path root : dirs) {            if (!walk.found) {                Files.walkFileTree(root, opts, Integer.MAX_VALUE, walk);            }        }        if (!walk.found) {            System.out.println("The file " + searchFile + " was not found!");        }    }}

 使用模式匹配查找文件

  有時候你可能只知道要檢索文件的部分信息,例如只知道名字或是擴展名,基于這些信息的片段,你可以正則表達式。這個檢索將會根據匹配的表達式檢索到滿足條件的文件位置,或許你要查找的文件正在其中。

  下面的代碼用來在C:/rafaelnadal目錄下查找所有以jpg為擴展名的文件。這個文件會遍歷整個目錄。

import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.FileVisitOption;import java.nio.file.FileVisitResult;import java.nio.file.FileVisitor;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.PathMatcher;import java.nio.file.Paths;import java.nio.file.attribute.BasicFileAttributes;import java.util.EnumSet;class Search implements FileVisitor {    private final PathMatcher matcher;    public Search(String glob) {        matcher = FileSystems.getDefault().getPathMatcher("glob:" + glob);            }    void search(Path file) throws IOException {        Path name = file.getFileName();        if (name != null && matcher.matches(name)) {            System.out.println("Searched file was found: " + name +                                                      " in " + file.toRealPath().toString());        }    }    @Override    public FileVisitResult postVisitDirectory(Object dir, IOException exc)                                                                       throws IOException {        System.out.println("Visited: " + (Path) dir);        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)                                                                       throws IOException {        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)                                                                       throws IOException {        search((Path) file);        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult visitFileFailed(Object file, IOException exc)                                                                       throws IOException {        //report an error if necessary        return FileVisitResult.CONTINUE;    }}class Main {    public static void main(String[] args) throws IOException {        String glob = "*.jpg";        Path fileTree = Paths.get("C:/rafaelnadal/");        Search walk = new Search(glob);        EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);        Files.walkFileTree(fileTree, opts, Integer.MAX_VALUE, walk);    }}

   如果你還知道要查找的文件其他信息,你可以創建一個復雜的檢索。例如,除了知道文件的名字和類型,你還知道文件大概小于多少KB,或許是文件的創建日期,修改日期,是否是隱藏文件或只讀,誰擁有它。下面的代碼演示查找所有擴展名為jpg并且文件小于100KB的文件。

 

import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.FileVisitOption;import java.nio.file.FileVisitResult;import java.nio.file.FileVisitor;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.PathMatcher;import java.nio.file.Paths;import java.nio.file.attribute.BasicFileAttributes;import java.util.EnumSet;class Search implements FileVisitor {    private final PathMatcher matcher;    private final long accepted_size;    public Search(String glob, long accepted_size) {        matcher = FileSystems.getDefault().getPathMatcher("glob:" + glob);        this.accepted_size = accepted_size;            }    void search(Path file) throws IOException {        Path name = file.getFileName();        long size = (Long) Files.getAttribute(file, "basic:size");        if (name != null && matcher.matches(name) && size <= accepted_size) {            System.out.println("Searched file was found: " + name + " in " +                                  file.toRealPath().toString() + " size (bytes):" + size);        }    }    @Override    public FileVisitResult postVisitDirectory(Object dir, IOException exc)                                                                       throws IOException {        System.out.println("Visited: " + (Path) dir);        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)                                                                       throws IOException {         return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)                                                                      throws IOException {        search((Path) file);        return FileVisitResult.CONTINUE;    }    @Override    public FileVisitResult visitFileFailed(Object file, IOException exc)                                                                       throws IOException {        //report an error if necessary        return FileVisitResult.CONTINUE;    }}class Main {    public static void main(String[] args) throws IOException {        String glob = "*.jpg";        long size = 102400; //100 kilobytes in bytes        Path fileTree = Paths.get("C:/rafaelnadal/");        Search walk = new Search(glob, size);        EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);        Files.walkFileTree(fileTree, opts, Integer.MAX_VALUE, walk);           }}

 根據文件里的內容查找文件

  其中一種比較高級的搜索文件的方式是個根據文件中的內容。你可以傳遞一個字符序列或是一段句子,然后返回這包含這些內容的文件。這種方式也也是最耗時的,因為他要進入每個文件里面,這就意味著要先打開文件,讀取,最后關閉它。此外,這里有很多文件格式來支持文本,例如,pdf,Microsoft Word, Excel,Powerpoint,簡單文本, xml, HTML, XHTML等等。每一種格式的讀取方式不盡相同。

  接下來我們會開發一個程序用你來根據傳遞的字符串內容來搜索文件,這個傳遞的字符串里的序列以逗號分隔, 例如:Rafael Nadal,tennis,winner of Roland Garros,BNP Paribas tournament draws。 使用StringTokenizer類,以逗號為分隔符,下面的例子就是提取每個單詞或句子放入ArrayList中。

… String words="Rafael Nadal,tennis,winner of Roland Garros,BNP Paribas tournament draws"; ArrayList<String> wordsarray = new ArrayList<>(); … StringTokenizer st = new StringTokenizer(words, ","); while (st.hasMoreTokens()) {        wordsarray.add(st.nextToken()); }

  下面的代碼循環ArrayList然后比較從訪問的文件中提取的比較每個單詞和句子。searchText()方法以提取的文本作為參數。

//search text private boolean searchText(String text) {    boolean flag = false;    for (int j = 0; j < wordsarray.size(); j++) {         if ((text.toLowerCase()).contains(wordsarray.get(j).toLowerCase())) {             flag = true;             break;        }    }    return flag; }

  下面的例子根據不同的格式來搜索文本。不要重新造輪子,所以我們使用第三方的類庫來實現這些功能。

 在PDF文件中搜索

  對于讀取PDF文件,我們將使用兩個非常流行的開源類庫:iText(http://itextpdf.com/) 和 Apache PDFBox(http://pdfbox.apache.org/)。

 基于iText文檔,下面的方法用來從pdf中提取文本。第一步包括創建一個PdfReader訪問文件,接著通過提取出PDF的頁數,從每個頁面中提取文本,提取的文本傳遞給searchText()方法。如果在提取的文本中找到一token。則停止在當前文件檢索,該文件被認為是一個有效的搜索結果,及其存儲路徑和名稱我們可以打印出來后,整個搜索結束。

//search in PDF files using iText library boolean searchInPDF_iText(String file) {    PdfReader reader = null;    boolean flag = false;    try {        reader = new PdfReader(file);        int n = reader.getNumberOfPages();        OUTERMOST:        for (int i = 1; i <= n; i++) {          String str = PdfTextExtractor.getTextFromPage(reader, i);          flag = searchText(str);          if (flag) {                break OUTERMOST;          }        }    } catch (Exception e) {       } finally {           if (reader != null) {               reader.close();             }             return flag;       } }

   如果你對PDFBox更加熟悉,你可以使用下面的方法。通過PDFParser 類創建PDF文件,然后提取出文件的頁數,并完成通過searchText()方法提取每一頁的文本。

 

boolean searchInPDF_PDFBox(String file) {    PDFParser parser = null;    String parsedText = null;    PDFTextStripper pdfStripper = null;    PDDocument pdDoc = null;    COSDocument cosDoc = null;    boolean flag = false;    int page = 0;    File pdf = new File(file);    try {        parser = new PDFParser(new FileInputStream(pdf));        parser.parse();        cosDoc = parser.getDocument();        pdfStripper = new PDFTextStripper();        pdDoc = new PDDocument(cosDoc);        OUTERMOST:        while (page < pdDoc.getNumberOfPages()) {             page++;             pdfStripper.setStartPage(page);             pdfStripper.setEndPage(page + 1);             parsedText = pdfStripper.getText(pdDoc);             flag = searchText(parsedText);             if (flag) {                  break OUTERMOST;             }        }    } catch (Exception e) {    } finally {           try {              if (cosDoc != null) {                   cosDoc.close();              }              if (pdDoc != null) {                   pdDoc.close();              }           } catch (Exception e) {}    return flag;    } }

 在Microsoft的Word,Excel和PowerPoint中查找

  微軟的辦公套裝軟件文件可以使用Apache POI(http://poi.apache.org/)類庫來操作。下面的例子使用版本3.7,基于開發指南,從word中查找字符串的例子。

boolean searchInWord(String file) {    POIFSFileSystem fs = null;    boolean flag = false;    try {        fs = new POIFSFileSystem(new FileInputStream(file));        HWPFDocument doc = new HWPFDocument(fs);        WordExtractor we = new WordExtractor(doc);        String[] paragraphs = we.getParagraphText();        OUTERMOST:        for (int i = 0; i < paragraphs.length; i++) {              flag = searchText(paragraphs[i]);              if (flag) {                    break OUTERMOST;              }        }      } catch (Exception e) {      } finally {             return flag;      } }

  我們從下面的例子中從Excel文本里提取文本。通過HSSFWorkbook創建excel文檔,先遍歷每個sheet頁,然后是逐行,最后每個單元格。

boolean searchInExcel(String file) {    Row row;    Cell cell;    String text;    boolean flag = false;    InputStream xls = null;    try {        xls = new FileInputStream(file);        HSSFWorkbook wb = new HSSFWorkbook(xls);        int sheets = wb.getNumberOfSheets();        OUTERMOST:        for (int i = 0; i < sheets; i++) {             HSSFSheet sheet = wb.getSheetAt(i);             Iterator<Row> row_iterator = sheet.rowIterator();             while (row_iterator.hasNext()) {                 row = (Row) row_iterator.next();                 Iterator<Cell> cell_iterator = row.cellIterator();                 while (cell_iterator.hasNext()) {                     cell = cell_iterator.next();                     int type = cell.getCellType();                     if (type == HSSFCell.CELL_TYPE_STRING) {                           text = cell.getStringCellValue();                           flag = searchText(text);                           if (flag) {                                 break OUTERMOST;                           }                     }                 }             }        }    } catch (IOException e) {    } finally {          try {              if (xls != null) {                     xls.close();              }          } catch (IOException e) {}    return flag;    } }

  最后我們可以使用下面的代碼從PowerPoint中提取文本。

boolean searchInPPT(String file) {    boolean flag = false;    InputStream fis = null;    String text;    try {        fis = new FileInputStream(new File(file));        POIFSFileSystem fs = new POIFSFileSystem(fis);        HSLFSlideShow show = new HSLFSlideShow(fs);        SlideShow ss = new SlideShow(show);        Slide[] slides = ss.getSlides();        OUTERMOST:        for (int i = 0; i < slides.length; i++) {           TextRun[] runs = slides[i].getTextRuns();           for (int j = 0; j < runs.length; j++) {              TextRun run = runs[j];              if (run.getRunType() == TextHeaderAtom.TITLE_TYPE) {                  text = run.getText();              } else {                  text = run.getRunType() + " " + run.getText();              }              flag = searchText(text);              if (flag) {                     break OUTERMOST;              }           }        Notes notes = slides[i].getNotesSheet();        if (notes != null) {            runs = notes.getTextRuns();            for (int j = 0; j < runs.length; j++) {                 text = runs[j].getText();                 flag = searchText(text);                 if (flag) {                       break OUTERMOST;                 }            }        }      }    } catch (IOException e) {    } finally {          try {            if (fis != null) {                  fis.close();              }           } catch (IOException e) {}    return flag;    } } 

   此外還有很多其他第三方優秀的類庫,上面的例子在處理一些檢索時不一定是最高效的?;蛟S可以使用Apache Lucene(http://lucene.apache.org/java/docs/index.html)來獲取很高的方式來處理。

 在文本文件中搜索

  文本文件(.txt, .html, .xml 等)不需要第三方的類庫,它們完全可以使用NOI.2 的技術來實現:

boolean searchInText(Path file) {    boolean flag = false;    Charset charset = Charset.forName("UTF-8");    try (BufferedReader reader = Files.newBufferedReader(file, charset)) {         String line = null;         OUTERMOST:         while ((line = reader.readLine()) != null) {               flag = searchText(line);               if (flag) {                    break OUTERMOST;               }         }     } catch (IOException e) {     } finally {           return flag;     } }

寫一個完整的檢索程序

import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfTextExtractor; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.nio.file.FileSystems; import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.EnumSet; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.pdfbox.cos.COSDocument; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.util.PDFTextStripper; import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.model.Notes; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.model.TextRun; import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.hslf.usermodel.SlideShow; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; class Search implements FileVisitor {     ArrayList<String> wordsarray = new ArrayList<>();     ArrayList<String> documents = new ArrayList<>();     boolean found = false;     public Search(String words) {         wordsarray.clear();         documents.clear();         StringTokenizer st = new StringTokenizer(words, ",");         while (st.hasMoreTokens()) {             wordsarray.add(st.nextToken().trim());         }     }     void search(Path file) throws IOException {         found = false;         String name = file.getFileName().toString();         int mid = name.lastIndexOf(".");         String ext = name.substring(mid + 1, name.length());         if (ext.equalsIgnoreCase("pdf")) {             found = searchInPDF_iText(file.toString());             if (!found) {                 found = searchInPDF_PDFBox(file.toString());             }         }         if (ext.equalsIgnoreCase("doc") || ext.equalsIgnoreCase("docx")) {             found = searchInWord(file.toString());         }         if (ext.equalsIgnoreCase("ppt")) {             searchInPPT(file.toString());         }         if (ext.equalsIgnoreCase("xls")) {             searchInExcel(file.toString());         }         if ((ext.equalsIgnoreCase("txt")) || (ext.equalsIgnoreCase("xml")                                           || ext.equalsIgnoreCase("html"))                 || ext.equalsIgnoreCase("htm") || ext.equalsIgnoreCase("xhtml")                                                || ext.equalsIgnoreCase("rtf")) {             searchInText(file);         }         if (found) {             documents.add(file.toString());         }     }     //search in text files     boolean searchInText(Path file) {         boolean flag = false;         Charset charset = Charset.forName("UTF-8");         try (BufferedReader reader = Files.newBufferedReader(file, charset)) {             String line = null;             OUTERMOST:             while ((line = reader.readLine()) != null) {                 flag = searchText(line);                 if (flag) {                     break OUTERMOST;                 }             }         } catch (IOException e) {         } finally {             return flag;         }     }     //search in Excel files     boolean searchInExcel(String file) {         Row row;         Cell cell;         String text;         boolean flag = false;         InputStream xls = null;         try {             xls = new FileInputStream(file);             HSSFWorkbook wb = new HSSFWorkbook(xls);             int sheets = wb.getNumberOfSheets();             OUTERMOST:             for (int i = 0; i < sheets; i++) {                 HSSFSheet sheet = wb.getSheetAt(i);                 Iterator<Row> row_iterator = sheet.rowIterator();                 while (row_iterator.hasNext()) {                     row = (Row) row_iterator.next();                     Iterator<Cell> cell_iterator = row.cellIterator();                     while (cell_iterator.hasNext()) {                         cell = cell_iterator.next();                         int type = cell.getCellType();                         if (type == HSSFCell.CELL_TYPE_STRING) {                             text = cell.getStringCellValue();                             flag = searchText(text);                             if (flag) {                                 break OUTERMOST;                             }                         }                     }                 }             }         } catch (IOException e) {         } finally {             try {                 if (xls != null) {                     xls.close();                 }             } catch (IOException e) {             }             return flag;         }     }     //search in PowerPoint files     boolean searchInPPT(String file) {         boolean flag = false;         InputStream fis = null;         String text;         try {             fis = new FileInputStream(new File(file));             POIFSFileSystem fs = new POIFSFileSystem(fis);             HSLFSlideShow show = new HSLFSlideShow(fs);             SlideShow ss = new SlideShow(show);             Slide[] slides = ss.getSlides();             OUTERMOST:             for (int i = 0; i < slides.length; i++) {                 TextRun[] runs = slides[i].getTextRuns();                 for (int j = 0; j < runs.length; j++) {                     TextRun run = runs[j];                     if (run.getRunType() == TextHeaderAtom.TITLE_TYPE) {                         text = run.getText();                     } else {                         text = run.getRunType() + " " + run.getText();                     }                     flag = searchText(text);                     if (flag) {                         break OUTERMOST;                     }                 }                 Notes notes = slides[i].getNotesSheet();                 if (notes != null) {                     runs = notes.getTextRuns();                     for (int j = 0; j < runs.length; j++) {                         text = runs[j].getText();                         flag = searchText(text);                         if (flag) {                             break OUTERMOST;                         }                     }                 }             }         } catch (IOException e) {         } finally {             try {                 if (fis != null) {                     fis.close();                 }             } catch (IOException e) {             }             return flag;         }     }     //search in Word files     boolean searchInWord(String file) {         POIFSFileSystem fs = null;         boolean flag = false;         try {             fs = new POIFSFileSystem(new FileInputStream(file));             HWPFDocument doc = new HWPFDocument(fs);             WordExtractor we = new WordExtractor(doc);             String[] paragraphs = we.getParagraphText();             OUTERMOST:             for (int i = 0; i < paragraphs.length; i++) {                 flag = searchText(paragraphs[i]);                 if (flag) {                     break OUTERMOST;                 }             }         } catch (Exception e) {         } finally {             return flag;         }     }     //search in PDF files using PDFBox library     boolean searchInPDF_PDFBox(String file) {         PDFParser parser = null;         String parsedText = null;         PDFTextStripper pdfStripper = null;         PDDocument pdDoc = null;         COSDocument cosDoc = null;         boolean flag = false;         int page = 0;         File pdf = new File(file);         try {             parser = new PDFParser(new FileInputStream(pdf));             parser.parse();             cosDoc = parser.getDocument();             pdfStripper = new PDFTextStripper();             pdDoc = new PDDocument(cosDoc);             OUTERMOST:             while (page < pdDoc.getNumberOfPages()) {                 page++;                 pdfStripper.setStartPage(page);                 pdfStripper.setEndPage(page + 1);                 parsedText = pdfStripper.getText(pdDoc);                 flag = searchText(parsedText);                 if (flag) {                     break OUTERMOST;                 }             }         } catch (Exception e) {         } finally {             try {                 if (cosDoc != null) {                     cosDoc.close();                 }                 if (pdDoc != null) {                     pdDoc.close();                 }             } catch (Exception e) {             }             return flag;         }     }     //search in PDF files using iText library     boolean searchInPDF_iText(String file) {         PdfReader reader = null;         boolean flag = false;         try {             reader = new PdfReader(file);             int n = reader.getNumberOfPages();             OUTERMOST:             for (int i = 1; i <= n; i++) {                 String str = PdfTextExtractor.getTextFromPage(reader, i);                 flag = searchText(str);                 if (flag) {                     break OUTERMOST;                 }             }         } catch (Exception e) {         } finally {             if (reader != null) {                 reader.close();             }             return flag;         }     }     //search text     private boolean searchText(String text) {         boolean flag = false;         for (int j = 0; j < wordsarray.size(); j++) {             if ((text.toLowerCase()).contains(wordsarray.get(j).toLowerCase())) {                 flag = true;                 break;             }         }         return flag;     }     @Override     public FileVisitResult postVisitDirectory(Object dir, IOException exc)                                                                       throws IOException {         System.out.println("Visited: " + (Path) dir);         return FileVisitResult.CONTINUE;     }     @Override     public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)                                                                       throws IOException {         return FileVisitResult.CONTINUE;     }     @Override     public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)                                                                       throws IOException {         search((Path) file);         return FileVisitResult.CONTINUE;     }     @Override     public FileVisitResult visitFileFailed(Object file, IOException exc)                                                                       throws IOException {         //report an error if necessary         return FileVisitResult.CONTINUE;     } } class Main { public static void main(String[] args) throws IOException {  String words = "Rafael Nadal, tennis, winner of Roland Garros, BNP Paribas tournament draws";  Search walk = new Search(words);  EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);  Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();  for (Path root : dirs) {       Files.walkFileTree(root, opts, Integer.MAX_VALUE, walk);  }           System.out.println("____________________________________________________________");  for(String path_string: walk.documents){      System.out.println(path_string);  }  System.out.println("____________________________________________________________");                 } }

   需要注意的是,有些時候程序處理的很慢,這主要取決于文件大小,要檢查的文件的個數,目錄的層級深度。此外你可以繼續完善這個程序,例如支持更多地格式,增加進度條來顯示處理的狀態,使用多線程加快查找速度。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97超碰国产精品女人人人爽| 日本成人黄色片| 青草青草久热精品视频在线观看| 成人精品一区二区三区电影免费| 国产精品成人aaaaa网站| 人体精品一二三区| 国产精品男人的天堂| 国产精品免费视频xxxx| 国产精品成人品| 久久精彩免费视频| 久热精品视频在线免费观看| 97久久超碰福利国产精品…| 国产精品久久久久久久久久久久久久| 亚洲国产私拍精品国模在线观看| 亚洲男人av电影| 国产精品久久久一区| 91免费在线视频网站| 亚洲美女精品成人在线视频| 亚洲福利小视频| 日韩av网站电影| 欧美日韩中国免费专区在线看| 97精品久久久中文字幕免费| 日韩精品久久久久久久玫瑰园| 日韩av一区二区在线| 亚洲永久在线观看| 亚洲欧美一区二区精品久久久| 欧美精品激情在线| 欧美在线一区二区三区四| 国产一区二区三区视频在线观看| 国产精品18久久久久久首页狼| 欧美性生交xxxxxdddd| 色99之美女主播在线视频| 欧美天堂在线观看| 亚洲欧美国产日韩中文字幕| 欧洲成人在线视频| 日韩欧美国产中文字幕| 欧美日韩国产成人在线观看| 久久精品视频在线观看| 成人精品网站在线观看| 国产精自产拍久久久久久| 国模叶桐国产精品一区| 欧美有码在线视频| 国产成人精品视频在线观看| 亚洲国产高清高潮精品美女| 久久久久久久久久久免费精品| 久久久久久久久久久久久久久久久久av| 国产成人久久久精品一区| 久久成人人人人精品欧| 91国内精品久久| 日本成人精品在线| 久久久亚洲国产天美传媒修理工| 亚洲乱码av中文一区二区| 亚洲成人xxx| 亚洲一区二区在线| 亚洲欧美日本伦理| 91色视频在线导航| 亚洲国产欧美一区二区丝袜黑人| 久久精品成人动漫| 日韩小视频在线| 日韩av电影免费观看高清| 国产综合色香蕉精品| 午夜精品久久久久久久男人的天堂| 91精品国产综合久久久久久蜜臀| 日韩网站免费观看高清| 2020欧美日韩在线视频| 亚洲人成在线观| 日韩中文字幕在线精品| 伦伦影院午夜日韩欧美限制| 久热精品视频在线观看一区| 欧美高清在线观看| 成人高清视频观看www| 日韩欧美极品在线观看| 欧美精品一区在线播放| 欧美日韩国产91| 亚洲欧美另类中文字幕| 国产精品视频一区二区三区四| 久久久久五月天| 日韩中文字幕免费看| 成人免费视频网址| 欧美大片在线免费观看| 亚洲成年人在线| 疯狂蹂躏欧美一区二区精品| 青青草精品毛片| 久久久91精品国产| 97在线视频国产| 日韩有码视频在线| 日韩最新中文字幕电影免费看| 久久久久久久影视| 亚洲国产精品久久久久| 精品国产一区二区三区久久| 日韩在线视频二区| 亚洲一区二区三区视频播放| 欧美老肥婆性猛交视频| 超碰91人人草人人干| 国产精品www色诱视频| 亚洲欧洲美洲在线综合| 91香蕉亚洲精品| 日韩欧美国产中文字幕| 96pao国产成视频永久免费| 日日噜噜噜夜夜爽亚洲精品| 亚洲va欧美va在线观看| 国产一区二区欧美日韩| 日韩在线观看视频免费| 亚洲少妇中文在线| 久久精品国产一区二区三区| 成人免费大片黄在线播放| 亚洲精品中文字幕女同| 一区二区三区回区在观看免费视频| 国产91网红主播在线观看| 久久久精品日本| 欧美精品激情视频| 国外成人性视频| 亚洲欧美日韩区| 国内外成人免费激情在线视频| 久久国产视频网站| 久久久国产精彩视频美女艺术照福利| 青草成人免费视频| 亚洲四色影视在线观看| 欧美成人精品一区二区| 欧美资源在线观看| 国产日韩换脸av一区在线观看| 久久成人18免费网站| 成人美女av在线直播| 国产一区二区三区高清在线观看| 尤物yw午夜国产精品视频| 国产一区二区视频在线观看| 亚洲成色777777女色窝| 国产精品h在线观看| 欧美中文在线免费| 成人在线免费观看视视频| 精品久久久久人成| 欧美日韩高清在线观看| 欧美性猛交丰臀xxxxx网站| 久久久免费观看视频| 91精品国产色综合久久不卡98| 精品亚洲va在线va天堂资源站| 国产欧美一区二区三区视频| 日韩精品中文字幕视频在线| 日韩在线www| 日韩美女在线观看一区| 精品久久国产精品| 国产亚洲人成网站在线观看| 国产精品欧美日韩一区二区| 亚洲男女性事视频| 亚洲成人亚洲激情| 亚洲一二三在线| 日韩精品极品视频| 97香蕉久久夜色精品国产| 在线观看日韩视频| 国模吧一区二区三区| 国产精品视频大全| 91在线看www| 久久不射热爱视频精品| 日韩美女av在线免费观看| 欧美久久精品一级黑人c片| 成人精品一区二区三区电影黑人| 精品国产网站地址| 亚洲女同精品视频| 国产69精品久久久久9999| 国产精品看片资源| 久久久久久久久久亚洲| 欧美电影电视剧在线观看| 日本aⅴ大伊香蕉精品视频| 成人日韩在线电影|