多文件读取循环和区分 .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]'
因为那是路径。
如有任何帮助,我们将不胜感激!
- 您可以使用
FileFilter
只读取一种类型或另一种类型,然后做出相应的响应。它会给你一个 List
只包含所需类型的文件。
- 第二个要求让我感到困惑。我认为通过创建一个 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();
}
}
我正在用 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]'
因为那是路径。
如有任何帮助,我们将不胜感激!
- 您可以使用
FileFilter
只读取一种类型或另一种类型,然后做出相应的响应。它会给你一个List
只包含所需类型的文件。 - 第二个要求让我感到困惑。我认为通过创建一个 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();
}
}