【问题标题】:Multiple file reading loop and distinguishing between .pdf and .doc files多文件读取循环和区分 .pdf 和 .doc 文件
【发布时间】:2019-09-13 12:59:28
【问题描述】:

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

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

现在有两个问题陷入:

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: java eclipse file pdf doc


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

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

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

    我建议您将此问题分解为更小的类。例如,在您可以读取和解析单个 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

    【讨论】:

      【解决方案2】:

      使用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();
             }
      }
      

      【讨论】:

      • 很好地使用了一个新的 JDK 特性。
      • 谢谢,Java 的一些流特性真的很优雅。
      • 我认为调查这些还不够。我倾向于使用我熟悉的旧习语。超越 lambda 的良好动力。
      【解决方案3】:

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

      // 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(这绝对是比我的快速代码更好的选择)。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        • 2014-03-21
        相关资源
        最近更新 更多