最近做一个项目,要求解析rar文档
语言为java
系统为linux
开发工具为eclipse接口为
public int getText(InputStream is ,StringBuffer text)
int 为返回rar文件是否加密。
is为rar文件输入流。
text为解析rar文档内的全部文档内容。
现在我遇到的问题是怎么用rar的命令,和这里传进来的流一起,解析rar文件
我用直接传rar文件的路径和名字是很好做的,关键是现在要以流的形式传进来。
我就不知道怎么做了。
请大家帮帮哦。
本人不甚感激。
语言为java
系统为linux
开发工具为eclipse接口为
public int getText(InputStream is ,StringBuffer text)
int 为返回rar文件是否加密。
is为rar文件输入流。
text为解析rar文档内的全部文档内容。
现在我遇到的问题是怎么用rar的命令,和这里传进来的流一起,解析rar文件
我用直接传rar文件的路径和名字是很好做的,关键是现在要以流的形式传进来。
我就不知道怎么做了。
请大家帮帮哦。
本人不甚感激。
解决方案 »
- SAXBuilder 问题
- 老题重谈 静态属性和方法的继承
- 请教一个java.util.Date的用法问题
- 如何在Eclipes中开发j2se程序,新人,别见笑,有经验的多指点
- 需要取当前页面上一段HTML存放到seesion中
- 如何实现nio监听两个端口,我server设置了7777 7778 为什么只能收到一个另一个收不到
- 求高手点拨一个Java Socket网络传输的“数据完整性”解决方案.
- 举手之劳,望各位帮忙!!!
- 简单的问题,有关于用到swing的applet
- java.sql.SQLException: ORA-00936: 缺失表达式
- 大家谈谈JavaFX在UI方面能发挥出什么作用??
- window类和panel类有什么区别
只是这里是要求传入流。
我能用传入人rar文件的路径加文件名
能解决
主要是接口定义的是流,我写过将流在还原为rar文件,这样也行
只不过这样效率太低。
我想有没有办法直接用流和unrar命令一起用。而不将流转化为rar文件再来解析。
WinRAR 使用是需要付费的,并不是免费使用的。由于 RAR 的专利性,没有专门的开源框架来解析 RAR 文档。
package RarExtract;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 这里之所以要先把文件写入系统磁盘上,是因为外面只需要调用我这里的getext方法。
* 而getext只接受流为参数。这里没有把整个程序完全写出来,
* 只是在这里说明我这程序的思想。所以也没有经过测试。不过我的实际程序是这样写的,
* 也测试过是能达到要求的。
* @author Administrator
*
*/
public class RarExtractor {
/*
* 解压缩命令
*/
java.util.Random run = new java.util.Random(10); private static String unrarCmd = "C:\\WinRAR\\unrar.exe "; public static void main(String[] args) {
RarExtractor rar = new RarExtractor();
InputStream is = null;
StringBuffer text = new StringBuffer();
try {
is = new FileInputStream("c:\\test.rar");
int n = rar.getText(is, text);
System.out.println(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} /**
*
* @param is
* @param text
* @return
*/
private int getText(InputStream is, StringBuffer text) {
// 写入文件的临时文件名
String fileName = "tempfile" + run.nextInt()+".rar";
// 写入临时文件的路径
String fileDir = "c:\\"+fileName;
try {
//向文件中写入数据
FileOutputStream fos = new FileOutputStream(fileDir);
int n = 0;
byte[] b = new byte[1024];
while ((n = is.read(b)) > 0) {
fos.write(b, 0, n);
}
fos.close();//文件写完后关闭流
//用unrar命令打印输出rar文件列表
String vbCmd = unrarCmd +" vb "+fileDir;
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(vbCmd);
InputStream newis = p.getInputStream();
String fileList = null;//保持rar文件中的文件名列表
while((n = newis.read(b))>0) {
if(fileList == null)
fileList = new String(b,0,n);
else {
fileList += new String(b,0,n);
}
}
String[] fileListArray= null;
if(fileList == null)return 0;
fileListArray = fileList.split("\r\n");//windows系统下以“\r\n分割”
String subFileName = null;
String subFileCmd = null;
for(int i= 0 ; i< fileListArray.length; i++) {
subFileName = fileListArray[i];//获得rar文件内部单个文件名
//p 打印输出文件内容
subFileCmd = unrarCmd + " p "+fileDir +" "+subFileName;
Process subp = rt.exec(subFileCmd);
newis = subp.getInputStream();
//这里根据列表文件名,判断文件的类型,
//根据文件类型,调用不同的文档解析程序解析
//如果文档为rar文件则递归调用该方法
}
} catch (IOException e) {
e.printStackTrace();
}
//删除临时文件
deleteFile(fileDir);
return 0;
} /**删除临时文件
* fileDir为临时文件完全路径
*/
private void deleteFile(String fileDir) {
File file = new File(fileDir);
file.delete();
}
}