多文件读取循环和区分 .pdf 和 .doc 文件

Multiple file reading loop and distinguishing between .pdf and .doc files

我正在用 Eclipse 编写一个 Java 程序来扫描简历中的关键字并从中筛选最合适的简历,除了显示每个简历的关键字。简历可以是 doc/pdf 格式。

我已经成功实现了一个单独读取pdf文件和doc文件的程序(通过使用Apache的PDFBox和POI jar包并为所需的方法导入库),显示关键字并根据数量显示简历强度找到的关键字。

现在卡在两个问题中:

(1) 我需要在程序中区分 pdf 文件和 doc 文件,这很容易通过 if 语句实现但是我很困惑如何编写代码来检测如果文件具有 .pdf 或 .doc 扩展名。 (我打算为select简历构建一个应用程序,但程序必须决定它是否会实现doc类型文件读取块或pdf类型文件读取块)

(2) 我打算 运行 简历列表的程序,为此我需要一个循环,在这个循环中我将 运行 每个简历的关键字扫描操作,但我想不出办法,因为即使文件被命名为 'resume1'、'resume2' 等,我们也无法在文件位置分配循环的可迭代变量,如:'C:/Resumes_Folder/Resume[i]'因为那是路径。

如有任何帮助,我们将不胜感激!

  1. 您可以使用 FileFilter 只读取一种类型或另一种类型,然后做出相应的响应。它会给你一个 List 只包含所需类型的文件。
  2. 第二个要求让我感到困惑。我认为通过创建一个 class 来封装您想要的已解析 Resume 的数据和行为,您会得到很好的服务。编写一个工厂 class,接收一个 InputStream 并生成一个 Resume,其中包含您需要的数据。

您犯了一个 classic 错误:您将所有逻辑嵌入到 main 方法中。这将使测试您的代码变得更加困难。

所有问题的解决都是将大问题分解成小问题,解决小问题,然后将它们组合起来最终解决大问题。

我建议您将此问题分解为更小的 classes。例如,在您可以读取和解析单个 PDF 和 DOC 文件之前,不必担心遍历目录中的文件。

创建接口:

public interface ResumeParser {
    Resume parse(InputStream is) throws IOException;
}

对 PDF 和 Word Doc 实施不同的实施。

创建工厂以根据文件类型为您提供合适的ResumeParser

public class ResumeParserFactory {
    public ResumeParser create(String fileType) {
        if (fileType.contains(".pdf") {
           return new PdfResumeParser();            
        } else if (fileType.contains(".doc") {
           return new WordResumeParser();
        } else {
           throw new IllegalArgumentException("Unknown document type: " + fileType);
        }
    }
}

一定要边写边写单元测试。你应该知道如何使用 JUnit.

你可以做一些基本的事情,比如:

// Put the path to the folder containing all the resumes here
File f = new File("C:\");
ArrayList<String> names = new ArrayList<> 
(Arrays.asList(Objects.requireNonNull(f.list())));

for (String fileName : names) {
   if (fileName.length() > 3) {
       String type = fileName.substring(fileName.length() - 3);
       if (type.equalsIgnoreCase("doc")) {
           // doc file logic here
       } else if (type.equalsIgnoreCase("pdf")) {
           // pdf file logic here
       }
    }
}

但正如 DuffyMo 的回答所说,您也可以使用 FileFilter(这绝对是比我的快速代码更好的选择)。

希望对您有所帮助。

使用 FileFilter 的另一种替代方法是使用 DirectoryStream,因为 Files::newDirectoryStream 可以轻松指定相关的文件结尾:

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{doc,pdf}")) {
           for (Path entry: stream) {
               // process files here
           }
       } catch (DirectoryIteratorException ex) {
           // I/O error encounted during the iteration, the cause is an IOException
           throw ex.getCause();
       }
}