Java NIO(一)-概述[譯]
Java NIO概述
NIO(New IO),自jdk1.4發布的特性,是一種可以替代IO API的特性,這以為著可以替代標準的Java IO與Java Networking的API。Java NIO相比于標準的IO API接口有這不同的工作機制。
- 通道和緩沖(Channels and Buffers)
- 標準IO中使用字節流與字符流;
- NIO中使用通道和緩沖,數據是始終是從通道讀取到緩沖,或者從緩沖中寫入到通道。
- 非阻塞IO
- Java NIO可以使用非阻塞IO。例如,一個線程可以請求一個通道將數據讀入到緩沖區中。通道讀取數據緩沖區時,線程可以做其他的事情。一旦數據讀取到緩沖區,線程可以繼續處理它。這同樣適用于將數據從緩沖區寫入到通道。
- 選擇器(Selectors)
- Java NIO包含“選擇器”的概念。選擇器是一個對象,可以監視多個渠道事件(如:連接打開,數據接受等等)。因此,一個線程可以監視多個渠道數據。
NIO核心
- Java NIO包括以下核心組件:
- Channels(通道)
- Buffers(緩沖)
- Selectors(選擇器)
Java NIO有更多的類和組件,但Channels,Buffers和Selectors組成了核心API。其余的組件,如Pipe和FileLock僅僅是用于結合使用這三個核心組件的實用工具類。
Channels and Buffers
通常,NIO中所有的IO始于一個通道。通道有點像流。從通道中,數據可以讀取到緩沖區。數據也可以從緩沖區寫進一個通道。圖示: Channel
- Channel的主要實現類:
- FileChannel:讀取文件與寫入文件
- DatagramChannel:通過UDP讀寫數據
- SocketChannel:通過TCP讀寫數據
- ServerSocketChannel:監聽TCP連接,類似web服務器。每次輸入的連接都會創建一個SocketChannel
如上,這些通道覆蓋了UDP+TCP的網絡IO與文件IO
- 例子
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
Buffer
- NIO中Buffer的主要實現類:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
這些是Buffer的覆蓋基本數據類型,您可以通過IO發送這幾種類型:byte,short,int,long,float,double。
另外,Java NIO中也有內存映射文件一起使用的MappedByteBuffer。
Selectors
Selectors允許一個線程處理多個Channels。如果應用程序有許多連接(Channels)打開但每個連接都只有低傳輸量的時候,這非常敏捷。例如,聊天服務器的情形。下面是一個例子的一個線程使用一個Selector來處理3個Channel:
使用注冊通道的選擇器吧。你可以定義它為select()方法。該方法在有一個等待已經注冊的Channel的事件之前會一直阻塞。一旦方法返回,線程可以處理這些事件。比如說,接收到事件的連接,數據接受等等。
智能推薦
Java NIO (一)
在現在,Java NIO已經越來越多的獲得了應用包括Tomcat,netty等,這項技術也由之前面試時候的加分項變成了Java程序員必備的技能之一。而之前我一直沒有系統的對其進行學習梳理,因此現在閑下來,想對這一塊的知識做一個相對完整的整理。話不多說,開始吧。 引 NIO主要有三大核心部分:Channel(通道),Buffer(緩沖區), Selector。傳統IO基于字節流和字符流進行操作,而N...
JAVA NIO入門一
1.簡介 2.什么是NIO 2.1 BIO Server: 服務端起來了之后,可以通過telnet 127.0.0.1 8080和服務端進行通信: 當然也可以自己寫個Client: BIO連接和線程對應關系: 引入線程池對客戶端連接進行處理: 雖然引入線程池極大的優化了BIO,但是線程池中的線程不可能無限制的增加,在高并發的情況下如果連接數量遠遠大于線程池中線程數量,那大于線程數量的請求就只能被阻...
netty(一) java NIO
關于java,其網絡通信方面性能可以說在慢慢挖掘,而且是現今被挖掘出來有效率最高的一塊了,不止2017年,最近這兩年開始,你會發現,java很多組件都采用了NIO的方式,因為其性能確實可以帶來很大提高,從阿里dubbo的廣泛應用netty,到tomcat8以后的NIO通訊,作為一個老程序員,我們發現一定要深入研究java的NIO了,它現在成了java各種應用級開發的核心功能。 在jdk1.4之前,...
Java NIO學習一
一、NIO概述 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。 NIO主要有三大核心部分:Channel(通道),Buffer(緩沖區), Selector。傳統IO基于字節流和字符流進行操作,而NIO基于Channel和Buffer(緩沖區)進行操作,數據總是從通道讀取到緩沖區中,或者...
Java NIO(一)
2019獨角獸企業重金招聘Python工程師標準>>> 原文地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO(New IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標準IO不同的IO工作方式。 Java NIO: Channels and Buf...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...