3 回答
TA贡献1836条经验 获得超5个赞
您可以使用 a
FileFilter
仅读取一种或另一种类型,然后做出相应的响应。它会给你一个List
仅包含所需类型的文件。第二个要求让我感到困惑。我认为通过创建一个类来封装您想要解析的数据和行为,您会得到很好的帮助
Resume
。编写一个工厂类,它接受InputStream
并生成Resume
包含您需要的数据的工厂类。
您犯了一个典型的错误:您将所有逻辑嵌入到主方法中。这将使测试您的代码变得更加困难。
所有的问题解决都是把大问题分解成小问题,解决小问题,然后组合起来最终解决大问题。
我建议您将这个问题分解为更小的类。例如,在您可以读取和解析单个 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。
TA贡献1877条经验 获得超6个赞
使用 a 的另一种替代方法FileFilter是使用 a 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();
}
}
TA贡献1831条经验 获得超4个赞
你可以做一些基本的事情,比如:
// 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
}
}
}
添加回答
举报