[英]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.