首页 > 解决方案 > JAR 资源输入流未读取请求的大小

问题描述

我运行以下代码:

public static void main(String[] args) {
    InputStream stream = ClassLoader.getSystemResourceAsStream("resources/fonts/calibri.texture");
    try {
        int n = 458343;
        byte[] a = new byte[n];
        int i;
        do {
            i = stream.read(a);
            System.out.println("request: " + n + ", read: " + i);
        } while(i != -1);
    } catch (IOException e) {}
}

在 Netbeans 中,输出为:

请求:458343,阅读:458343
请求:458343,读取:-1

用命令java -jar my_jar.jar是:

请求:458343,阅读:50563
请求:458343,阅读:47392
请求:458343,阅读:52704
请求:458343,阅读:48790
请求:458343,阅读:48714
请求:458343,阅读:48903
请求:458343,阅读:63921
请求:458343,阅读:47532
请求:458343,阅读:49824
请求:458343,读取:-1

两种大小的总和为 458343,但是为什么 JAR 中资源的 InputStream 会有这样的行为呢?

标签: java

解决方案


jar 中的资源需要解压才能使用,这可能就是为什么资源以更小的块返回的原因,而不是更有效的直接文件系统调用。块大小也可能是这里的一个因素。


推荐阅读