Apache Tika и доступ к файлам вместо входного потока Java - PullRequest
5 голосов
/ 18 мая 2011

Я хочу иметь возможность создавать новый анализатор Tika для извлечения метаданных из файла. Мы уже используем Tika, и извлечение метаданных будет выполняться последовательно.

Я думаю, что столкнулся с этой проблемой / запросом улучшения для Тики:

Разрешить передачу файлов или буферов памяти парсерам

У меня есть исполняемый файл консоли c ++, который принимает путь к файлу на входе и затем выводит найденные метаданные, каждая строка состоит из пар имя / значение.
Код C ++ опирается на библиотеки, которые ожидают путь к файлу при доступе к данным. Переписать этот исполняемый файл на Java невозможно. Я думал, что это будет довольно легко подключить это к Тике. Но парсер Tika должен быть на Java, а метод парсера Tika, который необходимо переопределить, принимает открытый входной поток:

void parse (поток InputStream, обработчик ContentHandler, метаданные метаданных, контекст ParseContext)

Так что я думаю, что мое единственное решение - взять поток ввода и записать его во временный файл, а затем обработать записываемый файл и, наконец, очистить файл. Я ненавижу возиться с временным файлом, и, возможно, мне придется беспокоиться об очистке временных файлов, если что-то пойдет не так, и оно не будет удалено.

У кого-нибудь есть умное представление о том, как правильно справиться с чем-то вроде этого?

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

Есть TikaInputStream , который должен помочь. Он обрабатывает обтекание File или InputStream и внутреннюю конвертацию, как того требуют парсеры. Он делает все биты временного файла так, как вам нужно.

Некоторые парсеры Java уже используют его, потому что им нужен файл, а не входной поток. Более того, пользователи, у которых есть файл, могут передать его анализатору, упакованному как InputStream, а анализатор может прочитать его как File или InputStream в соответствии со своими потребностями.

Итак, я бы предложил вам просто превратить InputStream в TikaInputStream (который является просто приведением, если он уже есть), затем получить файл и передать его в ваш c ++.

1 голос
/ 18 мая 2011

Если я правильно понимаю и предполагаю, что вы запускаете программу C ++ с использованием Runtime.exec, вы можете проанализировать стандартный поток вывода Process как InputStream, который хочет Тика.Будет ли это работать?

...