android zip文件读写,Android Java:从zip文件读取文件到webview / string,为什么ZipInputStream会限制读取性能?...

Let's explain it first

我正在使用webView加载HTML应用 . 为了保护源(脚本小子保护)我想从(受保护的)zip文件加载html代码 . html代码已经打包,缩小,组合等,所以大小只有700kb(解压缩) . 这很好用,但有一个问题,它有点慢 .

在下面的示例中,我从zip读取html文件并将结果放在一个字符串中 . 该字符串将用于通过使用以下代码将html代码加载到 webview :

this.webView.loadDataWithBaseURL("file:///android_asset/", this.unzipStream(sFileName), "text/html", "UTF-8", "");

我已经使用不同的解决方案来加快速度并找出 bottleneck is at reading the contents from the zip. I increased the read buffer's blocksize but doesn't help, it never reads the full blocksize. 例如,当我使用4096字节(4kb)作为块大小时,它一次只能读取700到1100个字节 .

Question(s):

如何强制read函数使用指定的完整块大小?

否则,是否有另一种更好的方法(例如将其直接放入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 "";

}

Maybe another way to do it:

还发现了这个java zipfile类http://www.lingala.net/zip4j/ . 它使处理(密码保护)的zip文件更容易,但不包括一个函数(至少我认为是这样)将其解压缩为字符串 . 在搜索时找不到任何东西 . 这个课程无论如何都可能吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在 Android WebView 中加载 index.html 文件时出现缓存找不到的问题,可能有以下几种原因和解决方法: 1. 确保 index.html 文件已经被正确地缓存到了设备的缓存目录中。你可以检查缓存目录是否存在该文件。 2. 如果使用了 AppCache,确保 manifest.appcache 文件中已经正确地列出了 index.html 文件。检查 manifest.appcache 文件的路径和内容是否正确。 3. 确保在加载 index.html 文件之前,WebView 的缓存模式已经正确设置。可以使用 `setCacheMode` 方法将缓存模式设置为 `LOAD_CACHE_ELSE_NETWORK`,以确保优先加载缓存。 ```java webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); ``` 4. 如果 index.html 文件位于 assets 目录下,而不是设备的缓存目录中,你需要使用 `loadUrl` 方法加载 assets 文件。示例代码如下: ```java webView.loadUrl("file:///android_asset/index.html"); ``` 5. 如果 index.html 文件位于设备的缓存目录中,你需要构建正确的文件路径并使用 `loadUrl` 方法加载该文件。示例代码如下: ```java String cachePath = getApplicationContext().getCacheDir().getAbsolutePath(); String indexPath = "file://" + cachePath + "/index.html"; webView.loadUrl(indexPath); ``` 通过以上方法,你可以检查并确保正确地加载和缓存 index.html 文件。如果问题仍然存在,请检查文件路径和缓存操作是否正确,并确保文件在指定的位置可访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值