簡體   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