2016-12-05 83 views
-3

我試圖寫入我的輸入流,它擴展了InputStream並學習瞭如下內容InputStream中的read()api如何工作?

輸入流是一個抽象類,它包含抽象方法和實現它的某些方法。注意到InputStream包含抽象方法

public abstract int read() throws IOException; 

我不太確定這種方法的用處。因此,轉介延伸的InputStream一些其它InputStream和得到FilterInputStream延伸InputStream在這個read方法的實現是像

public int read() throws IOException { 
    return in.read(); 
} 

in這裏指的是底層輸入流。考慮FilterInputStream構造這就好比

protected FilterInputStream(InputStream in) { 
     this.in = in; 
} 

在read()方法實現這個簡單的調用read方法中是InputStream這僅僅是一個抽象的方法,它的父類。

  1. InputStream中的read()方法的作用是什麼?
  2. 當我調用FSDataInputStream的讀取方法時會發生什麼?
  3. 我們在這裏添加read()方法只是爲了避免編譯錯誤?或者我們有其他用途嗎?

我很困惑這些。請幫助我瞭解它。

+4

1.閱讀javadoc。 2.閱讀javadoc。 3.閱讀javadoc。認真閱讀javadoc。 InputStream的全部要點是能夠從字節流中讀取字節。 read()是**這樣做的方法:它讀取InputStream的字節流中的下一個字節。 –

+0

閱讀javadocs @JBNizet我仍然不清楚....如果read()方法從輸入流讀取數據它讀多少?它會從輸入流中讀取整個數據嗎? – lsof

+0

如果您沒有閱讀方法,輸入是什麼? – EJP

回答

0

爲,@JB Nizet建議ByteArrayInputStream實現讀取以明確的方式和代碼片斷如下,

public synchronized int read() { 
    return (pos < count) ? (buf[pos++] & 0xff) : -1; 
} 

所以,這將返回其聲明如下

在緩衝區中的下一個字節
protected byte buf[]; 

其中,buf []是流創建者提供的字節數組。緩衝區中的元素是唯一可以從流中讀取的字節;元素buf [pos]是要讀取的下一個字節。

爲什麼它返回像(BUF [POS ++] & 0xff的)的結果?

這是一個nice explanation這使我們明確了爲什麼value & with 0xff完成。

ie;以符號值(0到255之間)返回結果。這將無符號值(字節)轉換爲有符號值&0xff

2

InputStream中的read()方法的作用是什麼?

它讀取一個字節的數據。它必須由InputStream的任何(非抽象)子類來實現。

FilterInputStream的情況下,它是通過從另一個流中讀取來實現的;即過濾器正在包裝的流。該流將是InputStream的一些子類的實例,其實現read()以實際從某處讀取數據。

當調用FSDataInputStream的read方法會發生什麼?

你叫結束了在流調用read()FSDataInputStream包裝;即在FSDataInputStream構造函數中傳遞的那個。

爲了避免編譯錯誤,我們在這裏添加read()方法嗎?或者我們有其他用途嗎?

InputStream API中的read()方法的用途是作爲實際流類中實際方法的佔位符。

read()方法FilterInputStream的用途是實際的方法。它通過將read()調用委託給鏈中的下一個流來完成此操作。(請注意,在一般情況下,FilterInputStream有被子類是有用的,你會想到的是,子類將覆蓋至少一些read方法。)

在這種情況下,FSDataInputStream(這是一個FilterInputStream)作用作爲允許將常規FSInputStream用作DataInputStream的適配器。對於read()方法,簡單委派就足夠了。

+0

非常清楚地解釋@Stephen會很高興,如果你能給我一個例子一個實現這個實際的'read()'方法的底層流實現示例。 – lsof

+0

@RajasubaSubramanian看看ByteArrayInputStream。 –

+0

@RajasubaSubramanian *閱讀Javadoc。*在'java.io'中已經有好幾個例子,Stephen已經命名了其中兩個。 – EJP

相關問題