簡體   English   中英

如果我從Reader#read()返回給定值,那么在偏移量之后,對於char是什么意思?

[英]If I return a given value from Reader#read(), what does it mean for chars after that offset?

假設您正在編寫一個刪除字符的所有實例的閱讀器(假設您要刪除“ x”。)

您可以這樣寫:

public class ExampleReader extends FilterReader {
    public ExampleReader(Reader in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        int ch;
        while ((ch = in.read()) != -1) {
            if (ch != 'x') {
                return ch;
            }
        }
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int charsRead = in.read(cbuf, off, len);
        if (charsRead == -1) {
            return -1;
        }

        // srcPos will always be >= dstPos
        int charsRemoved = 0;
        int srcEnd = off + charsRead;
        for (int srcPos = off, dstPos = off; srcPos < srcEnd; srcPos++, dstPos++) {
            char ch = cbuf[srcPos];
            if (ch == 'x') {
                dstPos--;
                charsRemoved++;
            } else {
                cbuf[dstPos] = cbuf[srcPos];
            }
        }

        return charsRead - charsRemoved;
    }
}

在代碼審查中,另一位開發人員聲稱,如果返回的值小於len ,則根據返回值,您不應該在讀取的片段之外寫任何字符。 但是,這在文檔中根本沒有提到-他們只是說傳入的len值是要讀取的最大字符數。

我個人的觀點是,如果您通過len ,那么您就被授予了在off..off+len編寫任何內容的權限,並且如果您碰巧返回了更少的內容,那么您就無法對數組的其余部分。 同樣,如果我打電話給讀者,我不會認為返回范圍之外的數據對於讀取是有意義的。

誰是對的?

(作為一個旁注,我實際實現的是行分隔符規范化,\\ r \\ n和其他對\\ n的設置。我確信在Guava中會出現如此普遍的情況,但似乎並非如此。真的嗎?難得的任務?)

用於InputStream.read()Javadoc說:“這些字節將存儲在元素b [off]至b [off + k-1]中,而元素b [off + k]至b [off + len-1]不受影響。 ” 沒有為Reader.read()重申過,但顯然應該如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM