繁体   English   中英

为什么getResourceAsStream()和使用FileInputStream读取文件会返回不同长度的数组?

[英]Why does getResourceAsStream() and reading file with FileInputStream return arrays of different length?

我想将文件读取为字节数组,并意识到读取的字节数取决于所使用的方法。 这里相关代码:

    public byte[] readResource() {
    try (InputStream is = getClass().getClassLoader().getResourceAsStream(FILE_NAME)) {
        int available = is.available();
        byte[] result = new byte[available];
        is.read(result, 0, available);

        return result;
    } catch (Exception e) {
        log.error("Failed to load resource '{}'", FILE_NAME, e);
    }

    return new byte[0];
}

public byte[] readFile() {
    File file = new File(FILE_PATH + FILE_NAME);
    try (InputStream is = new FileInputStream(file)) {
        int available = is.available();
        byte[] result = new byte[available];
        is.read(result, 0, available);

        return result;
    } catch (Exception e) {
        log.error("Failed to load file '{}'", FILE_NAME, e);
    }

    return new byte[0];
}

调用File.length()并使用FileInputStream读取将为给定的测试文件返回正确的21566字节长度,尽管将文件作为资源读取会返回21622字节。

有谁知道为什么我得到不同的结果以及如何解决它,以便readResource()返回正确的结果?

为什么getResourceAsStream()和使用FileInputStream读取文件会返回不同长度的数组?

因为你滥用available()在被打击的特别警告的方式方法的Javadoc

“使用此方法的返回值分配旨在容纳该流中所有数据的缓冲区永远是不正确的。”

有谁知道为什么我得到不同的结果以及如何解决它,以便readResource()返回正确的结果?

循环读取直到流结束。

根据InputStream的API文档InputStream.available()不返回资源的大小-它返回

在不阻塞的情况下可以从此输入流读取(或跳过)的字节数的估计值

要从流中获取资源的大小,您需要完全读取流,并计算读取的字节数。

要读取流并以字节数组形式返回内容,可以执行以下操作:

    try (   InputStream is = getClass().getClassLoader().getResourceAsStream(FILE_NAME);
            ByteArrayOutputStream bos = new ByteArrayOutputStream()) {

        byte[] buffer = new byte[4096];
        int bytesRead = 0;
        while ((bytesRead = is.read(buffer)) != -1) {
            bos.write(buffer, 0, bytesRead);
        }
        return bos.toByteArray();

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM