【发布时间】:2014-03-07 20:10:40
【问题描述】:
我们先解释一下
我正在使用 webView 加载 HTML 应用程序。为了稍微保护源代码(脚本小子保护),我想从(受保护的)zip 文件中加载 html 代码。 html 代码已经打包、缩小、组合等,因此只有 700kb 大小(未打包)。这工作得很好,但有一个问题,它有点慢。
在下面的示例中,我从 zip 中读取 html 文件并将结果放入字符串中。此字符串将用于通过使用以下代码将 html 代码加载到 webview 中:
this.webView.loadDataWithBaseURL("file:///android_asset/", this.unzipStream(sFileName), "text/html", "UTF-8", "");
我尝试了不同的解决方案来加快速度,并发现 瓶颈在于从 zip 中读取内容。我增加了读取缓冲区的块大小,但没有帮助,它永远不会读取完整的块大小。例如,当我使用 4096 字节 (4kb) 作为块大小时,它一次只能读取 700 到 1100 个字节。
问题:
- 如何强制读取函数使用指定的完整块大小?
- 否则,有没有更好的方法(比如直接放到webview中)?
这是我制作的代码:
public String unzipStream( String sFileName )
{
final int BLOCKSIZE = 4096;
//String sResult = "";
long iSize = 0;
int iReaded = 0;
ByteArrayOutputStream sb = new ByteArrayOutputStream();
try {
InputStream is = this.activity.getAssets().open( sFileName );
BufferedInputStream fin = new BufferedInputStream( is );
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze;
while( (iSize == 0) && ((ze = zin.getNextEntry()) != null) && !ze.isDirectory() )
{
byte data[] = new byte[BLOCKSIZE];
long iTotal = ze.getSize();
while ((iReaded = zin.read(data,0,BLOCKSIZE)) > 0 && ((iSize+=iReaded) <= iTotal) )
{
sb.write(data,0,iReaded);
}
zin.closeEntry();
}
zin.close();
}
catch(Exception e)
{
System.out.println("Error unzip: "+e.getMessage());
//sResult = "";
iSize = 0;
}
if( iSize > 0 )
{
//Base64.
try {
return sb.toString("UTF-8");
//sResult = new String( Base64.decode(sb.toString("UTF-8"), Base64.DEFAULT), Charset.forName("UTF-8") );
}
catch(Exception ee)
{
//sResult = "";
}
}
return "";
}
也许是另一种方法:
还发现了这个 java zipfile 类http://www.lingala.net/zip4j/。它使处理(受密码保护的)zip 文件变得更容易,但不包括将其解压缩为字符串的功能(至少我认为如此)。搜索时什么也没找到。这门课有可能吗?
【问题讨论】:
标签: java android zip android-webview unzip