在做的项目中使用到了一些解析的功能,其中便使用到了tika,我对其原理也是一知半解,只会使用代码

但由于文件中含有rar文件,使用tika并不能解析出其中的内容,为了解决这个问题,我想到了一些思路:

1、(linux)使用命令解压rar文件,然后在使用tika对其单个解析

2、将rar文件变成zip文件,因为tika可以解析zip文件,但直接的修改文件名却不行,因为tika是解析的是Content-Type,只单单的修改文件名,Content-Type并不会改变

3、使用java调用第三方软件进行解析

基于上述的一些想法,我只实现了第二种,因为第二种方法所需要的功能整个项目都已经存在,只要稍加修改即可,其代码如下:

FileUtils.java

package com.hackerant.tika;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;public class FileUtils {//loop dir to get file listpublic static ArrayList<String> getFile(String dirPath){ ArrayList<String> filelist = new ArrayList<String>();File root = new File(dirPath);getFiles(root,filelist);return filelist;}//read content from filepublic static String readFile(String filePath,String encode) throws Exception{return readFile(filePath,encode,200000);}//read content from filepublic static String readFile(String filePath,String encode,int limit) throws Exception{String result="";File file = new File(filePath);FileInputStream inputStream = null;InputStreamReader inputReader = null ;try{inputStream = new FileInputStream(file);inputReader = new InputStreamReader(inputStream,encode);BufferedReader br = new BufferedReader(inputReader);String str="";while ((str = br.readLine()) != null) {if(result.length()>limit){br.close();throw new Exception("Read Limit Reached Exception");}result += str;}}catch(Exception ex){throw ex;}finally{inputReader.close();inputStream.close();}return result;}//write content to filepublic static void writeFile(String filePath,String content,String encode) throws Exception{File file = new File(filePath);FileOutputStream outputStream = null;OutputStreamWriter outputWriter = null;try{outputStream = new FileOutputStream(file);outputWriter = new OutputStreamWriter(outputStream,encode);  outputWriter.write(content);  }catch(Exception ex){throw ex;}finally{outputWriter.close();outputStream.close();}}//delete Filepublic static boolean delFile(String filePath){boolean flag = false; File file = new File(filePath);if(file.isFile() && file.exists()){flag = file.delete();}return flag;}//move filepublic static boolean mvFile(String oldPath,String newPath){boolean flag = false; File oldfile = new File(oldPath);File newfile = new File(newPath);if(oldfile.isFile() && oldfile.exists()){if(newfile.exists()){delFile(newfile.getAbsolutePath());}flag = oldfile.renameTo(newfile);}return flag;}public static String getName(String filePath){File file = new File(filePath);return file.getName();}public static String getParent(String filePath){File file = new File(filePath);return file.getParent();}//loop dirprivate static void getFiles(File dir,ArrayList<String> filelist){File[] files = dir.listFiles();for(File file:files){     if(file.isDirectory()){getFiles(file,filelist);}else{filelist.add(file.getAbsolutePath());}     }}public static String getSuffix(String filePath){String suffix = ""; int pos = filePath.lastIndexOf(".");if (pos != -1){suffix = filePath.substring(pos + 1).toLowerCase();}return suffix;}public static String getPrefix(String filePath){String prefix = new File(filePath).getName(); int pos = prefix.lastIndexOf(".");if (pos != -1){prefix = filePath.substring(0,pos);}return prefix;}public static boolean deleteDir(File dir){if (dir.isDirectory()) {String[] children = dir.list();//递归删除目录中的子目录下for (int i=0; i<children.length; i++) {boolean success = deleteDir(new File(dir, children[i]));if (!success) {return false;}}}// 目录此时为空,可以删除return dir.delete();}//对某目录实行 tmpwatch,主方法public static void tmpwatch(File file) {long timestamp = System.currentTimeMillis();if (file.isDirectory()) {String[] children = file.list();// 递归删除目录中的子目录下for (int i = 0; i < children.length; i++) {tmpwatch(new File(file, children[i]),timestamp);}}}//对某目录实行 tmpwatch,删除超过一定时限的文件private static void tmpwatch(File file,long timestamp) {if (file.isDirectory()) {String[] children = file.list();// 递归删除目录中的子目录下for (int i = 0; i < children.length; i++) {tmpwatch(new File(file, children[i]));}}deleteFile(file,timestamp);}//对比时间,超过一定时间删除private static void deleteFile(File file,long timestamp){long stampdis = 1000*60;if(file.isDirectory()){file.delete();}else if(timestamp-file.lastModified() > stampdis){file.delete();}}//递归建立目录,解压缩相关类中使用public static void mkdirs(File file) {File parent = file.getParentFile();if (parent != null && (!parent.exists())) {parent.mkdirs();}}
}

RARTool.java

package com.hackerant.tika;import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;public class RARTool {public static void main(String[] args) {unRarFile("D:/1.rar", "D:/temp/");}/*** 根据原始rar路径,解压到指定文件夹下.* * @param srcRarPath*            原始rar路径* @param dstDirectoryPath*            解压到的文件夹*/public static void unRarFile(String srcRarPath, String dstDirectoryPath) {List<File> list = new ArrayList<File>();if (!srcRarPath.toLowerCase().endsWith(".rar")) {System.out.println("非rar文件!");return;}File dstDiretory = new File(dstDirectoryPath);if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹dstDiretory.mkdirs();}Archive a = null;try {a = new Archive(new File(srcRarPath));if (a != null) {a.getMainHeader().print(); // 打印文件信息.FileHeader fh = a.nextFileHeader();while (fh != null) {if (fh.isDirectory()) { // 文件夹File fol = new File(dstDirectoryPath + File.separator+ fh.getFileNameString());fol.mkdirs();} else { // 文件String pathStr = fh.getFileNameString().trim().replaceAll("\\\\", "/");int ind = pathStr.indexOf("/");if (ind < 0) {ind = 0;}File out = new File(dstDirectoryPath + File.separator+ pathStr.substring(ind, pathStr.length()));// System.out.println(out.getAbsolutePath());try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压.if (!out.exists()) {if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.out.getParentFile().mkdirs();}out.createNewFile();}FileOutputStream os = new FileOutputStream(out);a.extractFile(fh, os);os.close();} catch (Exception ex) {ex.printStackTrace();}}fh = a.nextFileHeader();}a.close();}} catch (Exception e) {e.printStackTrace();}}
}

ZIPTool.java

package com.hackerant.tika;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZIPTool {public static void zip(List<File> list,String filePath) throws Exception {byte[] buffer = new byte[1024];// 生成的ZIP文件名为temp.zipFile f = new File(filePath);File parent = new File(f.getParent());if(!parent.exists())parent.mkdirs();ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f));try{for (int j = 0; j < list.size(); j++) {FileInputStream fis = new FileInputStream(list.get(j));String paString = list.get(j).getPath().replaceAll("\\\\", "/");out.putNextEntry(new ZipEntry(paString.substring(paString.lastIndexOf("/") + 1)));int len;// 读入需要下载的文件的内容,打包到zip文件while ((len = fis.read(buffer)) > 0) {out.write(buffer, 0, len);}out.closeEntry();fis.close();}}catch (Exception e) {e.printStackTrace();}out.close();}}

TikaUtil.java

package com.hackerant.tika;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 org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;public class TikaUtil {public static String parseFile(String filePath) throws Exception{filePath = filePath.replaceAll("\\\\", "/");String zipFile = filePath.substring(0,filePath.indexOf(".")) + ".zip";File file = new File(filePath);String tempPath = filePath.substring(0,filePath.indexOf("/")) + "/temp/";if (filePath.contains("rar")) {RARTool.unRarFile(filePath, tempPath);List<String> pathList = FileUtils.getFile(tempPath);List<File> zipList = new ArrayList<File>();for (int i = 0; i < pathList.size(); i++) {zipList.add(new File(pathList.get(i)));}ZIPTool.zip(zipList, zipFile);file = new File(zipFile);System.out.println(tempPath);FileUtils.deleteDir(new File(tempPath));}if (file.exists()) {Parser parser = new AutoDetectParser();InputStream input = null;try{Metadata metadata = new Metadata();metadata.set(Metadata.CONTENT_ENCODING, "utf-8");metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName());input = new FileInputStream(file);ContentHandler handler = new BodyContentHandler();//当文件大于100000时,new BodyContentHandler(1024*1024*10); ParseContext context = new ParseContext();context.set(Parser.class,parser);parser.parse(input,handler, metadata,context);for(String name:metadata.names()) {System.out.println(name+":"+metadata.get(name));}System.out.println(handler.toString());return handler.toString();}catch (Exception e){e.printStackTrace();}finally {try {if(input!=null)input.close();file.delete();} catch (IOException e) {e.printStackTrace();}}}return null;}public static void main(String argt0[])throws Exception{parseFile("D:/1.rar");}
}

其中RARTool是对rar文件进行解析获得文件地址,ZIPTool是对文件进行压缩为zip文件,FileUtils是一些对文件的操作,TikaUtil是使用tika对文件进行解析

另源码下载可至http://pan.baidu.com/s/18wbkq

Tika解析rar文件相关推荐

  1. java tika 解析pdf,Tika提取PDF文件用法示例

    本文概述 为了从pdf文件中提取内容, Tika使用PDFParser. PDFParser是用于从pdf文件提取内容和元数据的类.此类位于org.apache.tika.parser.pdf包中. ...

  2. java解析压缩文件,支持zip,rar,7z压缩格式

    最近项目有需求对压缩文件进行解析,需要支持市面上比较流行的压缩格式,诸如zip,rar,7z: 由于压缩文件解析比较常见,特将代码整理出来,供后续参考学习: 以下是java代码: maven依赖: & ...

  3. ubuntu下rar文件解压后文件名乱码的解决方案

    在linux解压rar文件,通常使用的命令是 rar e a.rar 但是由于编码的缘故,在windows下打包的的中文文件,解压后时候乱码,提示为无效的编码格式,由于windows是gbk的编码格式 ...

  4. Zip、Rar文件解压

    一.ZIP文件解压 借用第三方工具解压Zip4J, Zip4J是一个开源的 Java 处理 zip 压缩文件的开发包.Zip4J功能比较完备,这里只用了简单的解压 1.导入依赖 <depende ...

  5. java 解析cad文件数据开源免费jar整理

    dxf文件格式解析数据可以用 <!-- https://mvnrepository.com/artifact/net.sourceforge/kabeja --> <dependen ...

  6. 如何反编译apk文件并解析.class文件查看Java源代码

    如何反编译apk文件并解析.class文件查看Java源代码 前期工作:先准备好反编译需要用到的工具:下载链接. 1.把下载好的工具解压,得到下面这三个文件 2.配置环境变量到path(apktool ...

  7. linux 压缩文件夹rar,让Ubuntu 16.04可以压缩/解压缩RAR文件

    在Ubuntu 16.04下经常要用到压缩/解压缩RAR文件, 每次都是网上搜索教程,而且都没有详细解析每个命令的具体用法,现在详细记下方法,以备再次用的时候方便的找到. 因为 参数 e 和 x 经常 ...

  8. JAVA解析pdf文件

    自己记录一下,方便下次用,判断文件是否为pdf类型,并且解析文件内容 1.需要依赖的包 <dependency><groupId>org.apache.pdfbox</g ...

  9. python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch

    今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...

最新文章

  1. 使用QT进行内存管理
  2. poj3648 2-sat 输出任意一组解
  3. 如何用python批量下载数据_使用Python批量下载数据
  4. Exchange Server 2003 部署手册
  5. Win2008 R2 VDI动手实验系列之一:Active Directory搭建
  6. Docker pull镜像报错问题
  7. 3d打印机 开源资料_3D打印的人类双手,开源课程资料以及更多新闻
  8. jupyter notebook OSError: [WinError 10049] 在其上下文中,该请求的地址无效。
  9. 硬核干货!揭秘波士顿动力背后的专利技术
  10. 设计模式—抽象工厂模式(思维导图)
  11. 两台windows笔记本创建家庭组实现文件共享
  12. 一张图看懂什么是运维?
  13. 2020教师计算机考试笔试题,2020年全国教师资格考试信息技术学科知识与能力练习题...
  14. TIM网盘批量下载方法
  15. SVN修改文件夹名称
  16. RFC1738 - 统一资源定位器URL
  17. excel随机数_excel怎样生成随机数
  18. 庐陵文化(作者:王剑冰,河南省作协副主席)
  19. heroku常用命令示例(三)与AWS S3互动
  20. uni-app 中使用背景图片

热门文章

  1. 电脑公司GHOST WIN7 装机旗舰版 2013 09
  2. 个人看过较好的电影推荐
  3. 当前比较流行的页面布局方式
  4. Facebook POP 进阶指南
  5. zigbee无线传感网实训---linux命令的简单了解(one day)
  6. Collecting Luggage - UVALive 2397 - 蓝桥杯 算法训练
  7. 将毫秒值(currentTimeMillis)转换为(年-月-日 时-分-秒)的形式,只需一行代码
  8. 给你的AppImage创建桌面快捷方式
  9. 蒙特卡洛(Monte Carlo)方法简介
  10. xupt2017 I 威尔逊的无底胃