日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java当中各种流的应用场景_Java中有哪些流,常用流有哪些并有何特点和使用场景 NIO流,特性及使用时注意的事项 IO与NIO区别...

發(fā)布時間:2023/12/19 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java当中各种流的应用场景_Java中有哪些流,常用流有哪些并有何特点和使用场景 NIO流,特性及使用时注意的事项 IO与NIO区别... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。