gpt4 book ai didi

java - Android Java : Reading file from zip file into webview/string, 为什么 ZipInputStream 会限制读取性能?

转载 作者:行者123 更新时间:2023-11-30 09:11:08 26 4
gpt4 key购买 nike

先解释一下

我正在使用 webView 加载 HTML 应用程序。为了稍微保护源代码(脚本小子保护),我想从( protected )zip 文件中加载 html 代码。 html 代码已经打包、缩小、组合等,所以大小只有 700kb(未打包)。这工作得很好,但有一个问题,它有点慢。

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

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

我试过不同的解决方案以使其更快,并发现瓶颈在于读取 zip 中的内容。我增加了读取缓冲区的 block 大小但没有帮助,它从不读取完整的 block 大小。 例如,当我使用 4096 字节 (4kb) 作为 block 大小时,它一次只能读取 700 到 1100 字节。

问题:

  • 如何强制读取函数使用指定的完整 block 大小?
  • 否则,是否有其他更好的方法(例如直接放入 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 文件变得更容易,但不包含将其解压缩为字符串的功能(至少我认为是这样)。搜索时什么也没找到。这个类有可能吗?

最佳答案

之后,标题可能是“ZipInputStream limits read performance”或类似的标题,因为其他类型的流不限制读取大小。当你想得到4096字节时,你会得到4096字节。例如,使用文本文件对此进行了测试。我仍然不知道为什么 ZipInputStream 会限制读取性能。

我不太确定是否有真正的性能提升(有时是,有时不是),但现在使用来自 apache 的“Commons IO”包的 IOUtils - http://commons.apache.org/proper/commons-io/ .这也简化了整个“操作”。

我也见过一些带 channel 的解决方案,但似乎只适用于文件流,所以不能使用它(或者不知道如何将它应用到这种情况下)。另请参阅:Faster way of copying data in Java? (参见接受的答案)。

这是我制作的新版本(也将对象名称更改为有意义的名称):

public String unzipStream( String sFileName ) 
{
ByteArrayOutputStream oBaosBuffer = new ByteArrayOutputStream();
try
{
ZipInputStream oZipStream = new ZipInputStream( this.activity.getAssets().open( sFileName ) );
ZipEntry oZipEntry;
long iSize = 0;

while( (iSize == 0) && ((oZipEntry = oZipStream.getNextEntry()) != null) && !oZipEntry.isDirectory() )
{
iSize = IOUtils.copyLarge(oZipStream, oBaosBuffer);
oZipStream.closeEntry();
}

oZipStream.close();

if( iSize > 0 )
{
return oBaosBuffer.toString("UTF-8");
//sResult = new String( Base64.decode(sb.toString("UTF-8"), Base64.DEFAULT), Charset.forName("UTF-8") );
}
}
catch(Exception e)
{
System.out.println("Error unzip: "+e.getMessage());
}

return null;
}

关于java - Android Java : Reading file from zip file into webview/string, 为什么 ZipInputStream 会限制读取性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22259773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com