java当中各种流的应用场景_Java中有哪些流,常用流有哪些并有何特点和使用场景 NIO流,特性及使用时注意的事项 IO与NIO区别...
IO流
流(stream):一組有順序的,有起點和終點的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q或抽象,對文件中的內(nèi)容讀和寫的操作。
及時關閉不使用的流,避免造成資源流失,可能會導致內(nèi)存溢出
1、數(shù)據(jù)流向
輸入流: 負責數(shù)據(jù)的讀取
例:從服務器讀取數(shù)據(jù),下載
InputStream抽象類(子類:FileInputStream/BufferedInputStream)
Reader抽象類(子類:InputStreamReader/BufferedReader)
輸入流: 數(shù)據(jù)的寫入
例:上傳文件
OutputStream抽象類(子類:FileOutStream/BufferedOutputStream)
Writer抽象類(子類:OutputStreamWriter/BufferedWriter)
2、數(shù)據(jù)類型
字符流: 處理字符,根據(jù)碼表映射字符,一次可能讀多個字節(jié) 一次讀入或讀出16位二進制
Reader / Writer
字節(jié)流: 處理字節(jié) 一次讀入或讀出8位二進制
InputStream / OutputStream
總結
IO采用的是裝飾模式,即采用處理流包裝節(jié)點流的方式來達到代碼通用性
處理流和節(jié)點流的區(qū)分方法:
節(jié)點流在新建時需要一個數(shù)據(jù)源(文件、網(wǎng)絡)作為參數(shù)
作用:提高代碼通用性,編寫代碼的便捷性,提高性能
處理流需要一個節(jié)點流作為參數(shù)
作用:對應抽象基類的實現(xiàn)類,他們都實現(xiàn)了抽象基類的基礎讀寫方法Read()方法,若返回-1,代表已經(jīng)讀到數(shù)據(jù)源末尾
1、常用流
對文件進行操作:FileInputStream(字節(jié)輸入流)
FileOutputStrean(字節(jié)輸出流)
FileReader(字符輸入流)
FileWriter(字符輸出流)
對管道進行操作:PipedInputStream(字節(jié)輸入流)
PipedOutStream(字節(jié)輸出流)
PipedReader(字符輸入流)
PipedWriter(字符輸出流)
字節(jié)/字符數(shù)組:ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWriter是帶緩沖區(qū)的處理流
作用:避免每次和硬盤打交道,提高數(shù)據(jù)訪問的效率
數(shù)據(jù)流:DataInputStream
DataOutputStream
作用:可以直接輸出float類型和long類型,提高了數(shù)據(jù)讀寫的效率
隨機訪問文件:RandomAccessFile
Buffered緩沖流:BufferedInputStream
BufferedOutputStream
CharArrayReader
CharArrayWriter實在內(nèi)存中開辟了一個字節(jié)或字符數(shù)組
場景
文件傳輸(復制文件,刪除文件或文件夾,文件改名等)
網(wǎng)絡傳輸(從服務器進行數(shù)據(jù)讀取,上傳下載等)
硬盤數(shù)據(jù)的存儲
NIO流
由來
傳統(tǒng)的IO流有很多缺陷,尤其阻塞性加上磁盤寫本來就慢,會導致cpu使用效率大大降低
所以,JDK1.4發(fā)布了NIO包,采用通道+緩沖區(qū),使得新式的IO操作直接面向緩存區(qū),并非阻塞的,提高程序的性能,提升cpu的利用率
例:計算機的處理速度和用戶按鍵盤的速度
NIO的簡述
主要有三大核心部分:
通道(Channel,是一個對象,可以通過他來讀取和寫入數(shù)據(jù))
緩沖區(qū)(Buffer,是一個對象,包含一些要寫入或者剛讀出的數(shù)據(jù))
選擇區(qū)(Selector能檢測到多個NIO通道,并能夠知曉通道是否為讀寫事件做好準備,這樣一個單獨的線程可以管理多個channel,從而管理多個網(wǎng)絡連接)
數(shù)據(jù)從通道讀取到緩沖區(qū)中,或者緩沖區(qū)寫入到通道中。
選擇區(qū)用于監(jiān)聽多個通道事件(例:連接打開,數(shù)據(jù)到達),因此單個線程可以監(jiān)聽多個數(shù)據(jù)通道
為所有的原始類型(boolean類除外)提供緩存支持的數(shù)據(jù)容器,使用它可以提供非阻塞式的高伸縮性網(wǎng)絡,主要解決了多線程的問題
特性:分散與聚焦讀取
文件鎖定功能
網(wǎng)絡異步IO
注意事項
SelectionKey用完一定要移除
SelectionKey.open()不是線程安全的,可能會拋出NullPointerException
如果一個selection thread已經(jīng)在select方法上等待,那么這個時候如果有另一個線程調(diào)用channal.register方法的話,那么他將被blocking
selectionKay.cancel() BUG導致CPU占用100%
!!!使用JDK6 U4以上版本不會出現(xiàn)以上BUG(除SelectionKey.open()不是線程安全以外)
場景
用于管理線程的并發(fā)數(shù) 讀取大文件速度快
1
IO/NIO區(qū)別
IONIO
面向流面向緩沖
阻塞IO非阻塞IO
使用流處理數(shù)據(jù)使用塊處理數(shù)據(jù)
選擇器
面向流與面向緩沖區(qū)
IO是面向流的,直至讀取所有字節(jié),他們沒有被緩存在任何地方。此外,他不能前后移動流中的數(shù)據(jù)。如果需要前后移動從流中讀取的數(shù)據(jù),需要先將他緩存到一個緩沖區(qū)
阻塞與非阻塞IO
IO的各種流是阻塞的。意味著,當一個線程調(diào)用read()或write()時,該線程被阻塞,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情
NIO是非阻塞模式的,當一個線程從某通道發(fā)送請求讀取數(shù)據(jù)時,他僅能得到目前可用數(shù)據(jù),如果目前沒有數(shù)據(jù)可用,就什么都不做。而不是保持線程阻塞,所以直至數(shù)據(jù)可以讀取之前,該線程可以繼續(xù)做其他事情
選擇器
IO沒有選擇器
NIO的選擇器允許一個單獨的線程來監(jiān)視多個輸入通道,可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來”選擇”通道
原文:https://blog.csdn.net/weixin_43517312/article/details/84026443
總結
以上是生活随笔為你收集整理的java当中各种流的应用场景_Java中有哪些流,常用流有哪些并有何特点和使用场景 NIO流,特性及使用时注意的事项 IO与NIO区别...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 顺为领投!“自然机器人”获新融资 聚焦I
- 下一篇: java12章_从零开始学Java 第