2013-09-23 21 views
1

對於java.io.InputStream中,有兩個主要的功能讀INT 讀()和公共INT讀(字節[] B,詮釋斷, int len)的InputStream/OutputStream的讀()/ write()函數的相關性和用法

類似地,對於java.io.OutputStream中有兩個功能寫入(b)和寫((字節[] B,詮釋斷,INT LEN))

雖然我理解的基本差異,但在閱讀寫(b)的描述時,它表示它說:「要寫入的字節是參數b的八個低位,而b的24個高位被忽略。」現在如果是這樣的話,那麼我們實際上是在浪費32位指令集中的剩餘24位,CPU將加載一個整數。相反,如果我使用其他寫入((byte [] b,int off,int len)),那麼我將佔用堆棧/堆棧以獲取字節數組的大小。雖然我試圖想到哪一個更適合高可伸縮性,但我不能忽視寫(b)浪費24位(3字節),而另一方面,如果我使用讀/寫(byte [] b,int關閉,int len),我有更高的堆棧大小的風險。那麼,什麼是最好的選擇?

在解決方法中,我試圖擴展InputStream和OutputStream,並通過提供一個字節[4]來使用所有32位來覆蓋讀取(b)和寫入(b)函數。它工作得很好,但仍然必須看看這是否有任何性能增強。它非常類似於使用讀/寫(4,0,int 4)

我將不勝感激任何關於此主題的幫助/評論。

回答

1

如果您想達到速度,您可能需要一次讀取多個字節。例如,如果您想要在磁盤上寫入/讀取某些內容,您可能需要一次讀取/寫入完整扇區(4k或8k字節)。

此外,這樣做可以最大限度地減少系統調用的次數,因此應用程序將更快。

關於堆棧,在java中,字節數組將在堆上,並且只有@Mike提到的引用存儲在堆棧中。

+0

謝謝。聲明4K/8K字節是一個很好的提示。但是,你不覺得,在硬盤上聲明一個相當於扇區的塊會很大嗎?你不認爲對於具有局部變量的函數,整個數組將被複制到堆棧?在字節數組是一個類變量的情況下,我明白它自然是一個引用,因爲byte []聲明在堆上。 – Ashley

+0

@Ashley,我想你對Java中的數組如何工作存在誤解。看到[這個問題](http://stackoverflow.com/questions/2099695/java-array-is-stored-in-stack-or-heap)。數組總是存儲在堆上。 – mpontillo

+0

@Ashley在磁盤上的4k/8k相比其他應用程序的內存中的jvm存儲相當小。 – Claudiu

1

使用採用byte[]的版本不會將整個字節數組推送到堆棧上。您將推送到堆棧的字節數組的引用。

除非您只寫一個字節,否則最好使用需要byte[]的版本。

+0

謝謝邁克。你不認爲對於具有局部變量的函數,整個數組將被複制到堆棧?在字節數組是一個類變量的情況下,我明白它自然是一個引用,因爲byte []聲明在堆上。 PLS。讓我知道你的想法。 – Ashley

+0

不可以。您可以在[Java語言規範](http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html)中找到關於此的更多信息。數組實際上被語言認爲是對象,並且總是這樣傳遞。 – mpontillo

+0

再次感謝邁克。我認爲你的澄清已經清除了我的疑慮。在下面的這篇文章中,@csoroiu建議使用4K/8k大小的字節數組(等於硬盤上的扇區)。聲明4K/8K字節是一個很好的提示。但是,你不覺得,在硬盤上聲明一個相當於扇區的塊會很大嗎? – Ashley