int 为返回rar文件是否加密。
is为rar文件输入流。
textBuf为保存解析rar文档内的全部文档内容。
public int getText(InputStream is, StringBuffer textBuf){ }
java里面没有提供解析rar文档的类库,后来才知道,WinRAR 使用是需要付费的,并不是免费使用的。
由于 RAR 的专利性,没有专门的开源框架来解析 RAR 文档。
所以就只好用rar的命令来解析了。
具体做法是,根据输入进来的流把,该流表示的文件写入系统硬盘中。然后再用rar的命令来解析。这个方法看起来比较复杂,不过也只有这样了。
代码为:
<!--EndFragment-->
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 {
/*
* 解压缩命令
*/
private static int g_File_Number = 0 ;//写入磁盘时rar文件的编号
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 " + g_File_Number+ ".rar ";
// 写入临时文件的路径
String fileDir = "c:// "+fileName;
try {
//向文件中写入数据
FileOutputStream fos = new FileOutputStrea(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);
subInpuStream = subp.getInputStream();
//这里根据列表文件名,判断文件的类型,
//根据文件类型,调用不同的文档解析程序解析
//如果文档为rar文件则递归调用该方法
getText(subInputStream,text);
}
} catch (IOException e) {
e.printStackTrace();
}
//删除临时文件
deleteFile(fileDir);
return 0;
}
/**删除临时文件
* fileDir为临时文件完全路径
*/
private void deleteFile(String fileDir) {
File file = new File(fileDir);
file.delete();
}
}
轉載來自:http://blog.csdn.net/wqjsir/article/details/4269165