0
    private byte[] loadClassData(String className) {
    ZipInputStream in = null;
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(jarPath);
        in = new ZipInputStream(new BufferedInputStream(fis));
        ZipEntry entry;
        while ((entry = in.getNextEntry()) != null) {
            if (entry.getName().contains(".class")) {
                String outFileName = entry.getName()
                        .substring(0, entry.getName().lastIndexOf('.'))
                        .replace('/', '.');
                if (outFileName.equals(className)) {
                    if (entry.getSize() == -1) {
                        Log.e("loadClassData", "can't read the file!");
                        return null;
                    }
                    byte[] classData = new byte[(int) entry.getSize()];
                    in.read(classData);
                    return classData;
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fis.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

在调试中,我总是得到“in”的大小是 512 字节,所以我无法获取文件的其余部分,我不知道为什么。ZipInputStream 有大小限制吗?谢谢!

4

2 回答 2

1
 if (entry.getSize() == -1) {

ZipEntry.getSize() 返回条目数据的未压缩大小,如果未知,则返回 -1。. 您需要删除此检查。

我总是得到“in”的大小是 512 字节

你怎么检查这个?ZipInputStream 没有大小属性​​。无论您检查什么,都无关紧要。

似乎是一个很好的典型ZipInputStream用法示例。

于 2011-10-12T04:18:29.360 回答
0

我认为 512 来自java.util.zip.ZipInputStream's构造函数

public ZipInputStream(InputStream in, Charset charset) {
    super(new PushbackInputStream(in, 512), new Inflater(true), 512);
于 2021-10-05T11:22:10.450 回答