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

Java 为什么getResourceAsStream()和使用FileInputStream读取文件会返回不同长度的数组?,java,io,Java,Io,我想以字节数组的形式读取文件,并意识到读取字节的数量因使用的方法而异。以下是相关代码: public byte[] readResource() { try (InputStream is = getClass().getClassLoader().getResourceAsStream(FILE_NAME)) { int available = is.available(); byte[] result = new byte[available]

我想以字节数组的形式读取文件,并意识到读取字节的数量因使用的方法而异。以下是相关代码:

    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()返回正确的结果吗?

根据InputStream的属性,
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();

    }
根据InputStream的属性,
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();

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

因为您误用了
available()

“使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是不正确的。”

有人知道我为什么会得到不同的结果,以及如何修复它以使readResource()返回正确的结果吗

在循环中读取,直到流结束

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

因为您误用了
available()

“使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是不正确的。”

有人知道我为什么会得到不同的结果,以及如何修复它以使readResource()返回正确的结果吗


在循环中读取,直到流结束。

可能是不同的文件?您也没有正确读取字节。available()不返回文件的长度。并且read()不能保证读取您要求它读取的字节数。阅读JavaIO教程,了解如何正确读取流的所有字节。谢谢!这很有帮助。getResourceAsStream()从目标文件夹获取了该图像的旧版本。可能是不同的文件?您也没有正确读取字节。available()不返回文件的长度。并且read()不能保证读取您要求它读取的字节数。阅读JavaIO教程,了解如何正确读取流的所有字节。谢谢!这很有帮助。getResourceAsStream()从目标文件夹中获取了该图像的旧版本。他实际上不需要资源的大小,他需要它的全部内容。他实际上不需要资源的大小,他需要它的全部内容。