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