java io
基本介紹
基本構(gòu)成
java nio和io區(qū)別
- 面向流與面向緩沖
- IO是面向流的颊乘,NIO是面向緩沖區(qū)的吨拗。
- Java IO面向流意味著每次從流中讀一個或多個字節(jié)爬范,直至讀取所有字節(jié)捺檬,它們沒有被緩存在任何地方预明。此外役耕,它不能前后移動流中的數(shù)據(jù)采转。如果需要前后移動從流中讀取的數(shù)據(jù),需要先將它緩存到一個緩沖區(qū)瞬痘。 Java NIO的緩沖導(dǎo)向方法略有不同故慈。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動框全。這就增加了處理過程中的靈活性察绷。但是,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)津辩。而且拆撼,需確保當(dāng)更多的數(shù)據(jù)讀入緩沖區(qū)時容劳,不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)。
- 阻塞與非阻塞IO
- Java IO的各種流是阻塞的闸度。
- 這意味著竭贩,當(dāng)一個線程調(diào)用read() 或 write()時,該線程被阻塞筋岛,直到有一些數(shù)據(jù)被讀取娶视,或數(shù)據(jù)完全寫入。
- Java NIO的非阻塞模式
- 使一個線程從某通道發(fā)送請求讀取數(shù)據(jù)睁宰,但是它僅能得到目前可用的數(shù)據(jù)肪获,如果目前沒有數(shù)據(jù)可用時,就什么都不會獲取柒傻。而不是保持線程阻塞孝赫,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情红符。 非阻塞寫也是如此青柄。一個線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入预侯,這個線程同時可以去做別的事情致开。 線程通常將非阻塞IO的空閑時間用于在其它通道上執(zhí)行IO操作,所以一個單獨的線程現(xiàn)在可以管理多個輸入和輸出通道(channel)萎馅。
- 選擇器(Selectors)
Java NIO的選擇器允許一個單獨的線程來監(jiān)視多個輸入通道双戳,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經(jīng)有可以處理的輸入糜芳,或者選擇已準(zhǔn)備寫入的通道飒货。這種選擇機(jī)制,使得一個單獨的線程很容易來管理多個通道峭竣。