首页 >Java >java教程 >如何使用 Java 中的 Apache Tika 从 zip 存档中的文件中提取内容?

如何使用 Java 中的 Apache Tika 从 zip 存档中的文件中提取内容?

Barbara Streisand
Barbara Streisand原创
2024-10-30 03:33:28301浏览

How can I extract content from files within a zip archive using Apache Tika in Java?

使用 Apache Tika 从 Zip 存档中的文件中提取内容

问题:

开发一个 Java 程序,利用 Apache Tika 读取存储在 zip 存档中的文件内容。 zip 存档包含各种文件格式(例如 txt、pdf 和 docx)。

解决方案:

要实现所需的功能,请按照以下步骤操作:

  1. 解析 Zip 存档:

    • 利用 ZipInputStream 迭代 zip 存档中的条目。
    • 仅提取感兴趣的文件(例如 txt、pdf、docx)。
  2. 调用 Apache Tika:

    • 创建一个用于捕获提取的内容的文本处理程序(例如 BodyContentHandler)的实例。
    • 实例化解析器(例如 AutoDetectParser)以识别文件类型并应用适当的解析方法。
  3. 提取并转换内容:

    • 通过解析器解析每个提取的文件,将内容提取到文本处理程序中。
    • 转换任何二进制或不支持的数据转换为字符串格式。
  4. 合并提取的内容:

    • 存储从所有内容中提取的内容将文件添加到临时列表中。
    • 将各个文件的内容组合成单个字符串以供进一步处理或显示。

代码片段(已修改):

<code class="java">import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.BodyContentHandler;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandlerFactory;
import org.xml.sax.SAXException;

public class ImprovedZipExtractor {

    public static void main(String[] args) {
        List<String> tempString = new ArrayList<>();
        StringBuffer sbf = new StringBuffer();

        File file = new File("C:\Users\xxx\Desktop\abc.zip");
        InputStream input;

        try {
            input = new FileInputStream(file);
            ZipInputStream zip = new ZipInputStream(input);
            ZipEntry entry = zip.getNextEntry();

            Metadata metadata = new Metadata();
            Parser parser = new AutoDetectParser();

            while (entry != null) {
                if (entry.getName().endsWith(".txt") || entry.getName().endsWith(".pdf")
                        || entry.getName().endsWith(".docx")) {
                    System.out.println("entry=" + entry.getName() + " " + entry.getSize());
                    parser.parse(zip, new BodyContentHandlerFactory(BodyContentHandlerFactory.INCLUDE_ENTITY_ROOT,
                            false).getNewBodyContentHandler(), metadata, new ParseContext());
                    tempString.add(sbf.toString());
                }
                entry = zip.getNextEntry();
            }
            zip.close();
            input.close();

            for (String text : tempString) {
                System.out.println("Apache Tika - Converted input string : " + text);
                sbf.append(text);
                System.out.println("Final text from all the three files " + sbf.toString());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (TikaException e) {
            e.printStackTrace();
        }
    }
}</code>

注意:修改代码以防止每次迭代期间 sbf 被覆盖并在循环外清除它以存储连接的内容非常重要所有文件的内容。

以上是如何使用 Java 中的 Apache Tika 从 zip 存档中的文件中提取内容?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn