日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java7I/O新功能探秘:同步操作,多播與隨機(jī)存取

Java 7將在今年年底正式發(fā)布,關(guān)于它的介紹也層出不窮,之前也報導(dǎo)了Java 7的七大新功能,以及Java 7的最新特性、代碼示例及性能測試方面的特性。而本文將會著重介紹Java 7 I/O方面的新特性:

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供都勻網(wǎng)站建設(shè)、都勻做網(wǎng)站、都勻網(wǎng)站設(shè)計、都勻網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、都勻企業(yè)網(wǎng)站模板建站服務(wù),十年都勻做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

關(guān)于Java 7的更多內(nèi)容,歡迎訪問推薦專題:Java 7 下一代Java開發(fā)技術(shù)詳解

◆SeekableByteChannel:隨機(jī)訪問通道;
◆MulticastChannel:允許IP多播的通道;
◆NetworkChannel:新的網(wǎng)絡(luò)通道超級接口;
◆異步I/O API:新的API使I/O操作可以異步進(jìn)行。

SeekableByteChannel

首先,Java 7包括新的ByteChannel – SeekableByteChannel,這個通道維護(hù)當(dāng)前的位置,你可以讀寫該位置,并允許隨機(jī)訪問。使用這個類型的通道,你可以添加多個線程讀/寫在不同位置相同的線程。

 
 
 
  1. SeekableByteChannel channel1 = Paths.get("Path to file").newByteChannel(); //Simply READ  
  2. SeekableByteChannel channel2 = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE); //READ and WRITE 

你可以使用下面這些方法操作位置和通道的大小。

◆long position():返回目前的位置;
◆long size():返回通道連接實(shí)體的當(dāng)前大小,如通道連接的文件大小;
◆position(long newPosition):移動當(dāng)前位置到某個地方;
◆truncate(long size):根據(jù)給定大小截斷實(shí)體。

position()和truncate()方法簡單地返回當(dāng)前通道,允許鏈?zhǔn)秸{(diào)用?,F(xiàn)在FileChannel實(shí)現(xiàn)了新的接口,使用所有FileChannel你都可以實(shí)現(xiàn)隨機(jī)訪問,當(dāng)然你可以用它讀取一個文件:

 
 
 
  1. SeekableByteChannel channel = null;  
  2. try {  
  3.     channel = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ);  
  4.     ByteBuffer buf = ByteBuffer.allocate(4096);  
  5.  
  6.     System.out.println("File size: " + channel.size());  
  7.  
  8.     String encoding = System.getProperty("file.encoding");  
  9.  
  10.     while (channel.read(buf) > 0) {  
  11.         buf.rewind();  
  12.  
  13.         byte[] bytearr = new byte[bytebuff.remaining()];  
  14.         buf.get(bytearray);  
  15.         System.out.print(new String(bytearray));  
  16.  
  17.         buf.flip();  
  18.  
  19.         System.out.println("Current position : " + channel.position());  
  20.     }  
  21. } catch (IOException e) {  
  22.     System.out.println("Expection when reading : " + e.getMessage());  
  23.     e.printStackTrace();  
  24. } finally {  
  25.     if (sbc != null){  
  26.         channel.close();  
  27.     }  

#p#
MulticastChannel

這個新的接口允許開啟IP多播,因此你可以向一個完整的組發(fā)送和接收IP數(shù)據(jù)報。多播實(shí)現(xiàn)了直接綁定本地多播設(shè)備,這個接口是通過DatagramChannel和AsynchronousDatagramChannel實(shí)現(xiàn)的。下面是從Javadoc中摘取的一個打開DatagramChannel t的簡單示例:

 
 
 
  1. NetworkInterface networkInterface = NetworkInterface.getByName("hme0");  
  2. DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)  
  3.          .setOption(StandardSocketOption.SO_REUSEADDR, true)  
  4.          .bind(new InetSocketAddress(5000))  
  5.          .setOption(StandardSocketOption.IP_MULTICAST_IF, networkInterface);  
  6.  
  7. InetAddress group = InetAddress.getByName("225.4.5.6");  
  8. MembershipKey key = dc.join(group, networkInterface); 

你可以使用以前經(jīng)常使用的DatagramChannel,但操作方式是多播了,因此你收到的是接口中所有的數(shù)據(jù)包,你發(fā)送的數(shù)據(jù)包會發(fā)到所有組。

NetworkChannel

現(xiàn)在所有網(wǎng)絡(luò)通道都實(shí)現(xiàn)了新的NetworkChannel接口,你可以輕松綁定套接字管道,設(shè)置和查詢套接字選項,此外,套接字選項也被擴(kuò)展了,因此你可以使用操作系統(tǒng)特定的選項,對于高性能服務(wù)器這非常有用。

異步I/O

現(xiàn)在我們介紹最重要的新特性:異步I/O API,從它的名字我們就知道它有什么功能了,這個新的通道為套接字和文件提供了異步操作。當(dāng)然,所有操作都是非阻塞的,但對所有異步通道,你也可以執(zhí)行阻塞操作,所有異步I/O操作都有下列兩種形式中的一種:

◆第一個返回java.util.concurrent.Future,代表等待結(jié)果,你可以使用Future特性等待I/O操作結(jié)束;

◆第二個是使用CompletionHandler創(chuàng)建的,當(dāng)操作結(jié)束時,如回調(diào)系統(tǒng),調(diào)用這個處理程序。

下面是它們的一些例子,首先來看看使用Future的例子:

 
 
 
  1. AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("Path to file"));  
  2. ByteBuffer buffer = ByteBuffer.allocate(capacity);  
  3. Future result = channel.read(buffer, 100); //Read capacity bytes from the file starting at position 100  
  4. boolean done = result.isDone(); //Indicate if the result is already terminated 

你也可以等待結(jié)束:

 
 
 
  1. int bytesRead = result.get(); 
  2.  

或等待超時:

 
 
 
  1. int bytesRead = result.get(10, TimeUnit.SECONDS); //Wait at most 10 seconds on the result 
  2.  

再來看看使用CompletionHandler的例子:

 
 
 
  1. Future result = channel.read(buffer, 100, null, new CompletionHandler(){  
  2.     public void completed(Integer result, Object attachement){  
  3.         //Compute the result  
  4.     }  
  5.  
  6.     public void failed(Throwable exception, Object attachement){  
  7.         //Answer to the fail  
  8.     }  
  9. }); 

正如你所看到的,你可以給操作一個附件,在操作末尾給CompletionHandler,當(dāng)然,你可以把null當(dāng)作一個附件提供,你可以傳遞任何你想傳遞的,如用于AsynchronousSocketChannel的Connection,或用于讀操作的ByteBuffer。

 
 
 
  1. Future result = channel.read(buffer, 100, buffer, new CompletionHandler(){  
  2.     public void completed(Integer result, ByteBuffer buffer){  
  3.         //Compute the result  
  4.     }  
  5.  
  6.     public void failed(Throwable exception, ByteBuffer buffer){  
  7.         //Answer to the fail  
  8.     }  
  9. }); 

正如你所看到的,CompletionHandle也提供Future元素表示等待結(jié)果,因此你可以合并這兩個格式。下面是NIO.2中的所有異步通道:

◆AsynchronousFileChannel:讀寫文件的異步通道,這個通道沒有全局位置,因此每個讀寫操作都需要一個位置,你可以使用不同的線程同時訪問文件的不同部分,當(dāng)你打開這個通道時,必須指定READ或WRITE選項;

◆AsynchronousSocketChannel:用于套接字的一個簡單異步通道,連接、讀/寫、分散/聚集方法全都是異步的,讀/寫方法支持超時;

◆AsynchronousServerSocketChannel:用于ServerSocket的異步通道,accept()方法是異步的,當(dāng)連接被接受時,調(diào)用CompletionHandler,這種連接的結(jié)果是一個AsynchronousSocketChannel;

◆AsynchronousDatagramChannel:用于數(shù)據(jù)報套接字的通道,讀/寫(連接)和接收/發(fā)送(無連接)方法是異步的。

#p#

分組

當(dāng)你使用AsynchronousChannels時,有線程調(diào)用完整的處理程序,這些線程被綁定到一個AsynchronousChannelGroup組,這個組包含一個線程池,它封裝了所有線程共享的資源,你可以使用線程池來調(diào)用這些組,AsynchronousFileChannel可以使用它自己的組創(chuàng)建,將ExecutorService作為一個參數(shù)傳遞給open()方法,在open方法中,通道是使用AsynchronousChannelGroup創(chuàng)建的,如果你不給它一個組,或傳遞一個NULL,它就會使用默認(rèn)組。通道被認(rèn)為是屬于組的,因此,如果組關(guān)閉了,通道也就關(guān)閉了。你可以使用ThreadFactory創(chuàng)建一個組:

 
 
 
  1. ThreadFactory myThreadFactory = Executors.defaultThreadFactory();  
  2. AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withFixedThreadPool(25, threadFactory); 
  3.  

或使用一個ExecutorService:

 
 
 
  1. ExecutorService service = Executors.newFixedThreadPool(25);  
  2. AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withThreadPool(service);
  3.  

而且你可以很容易地使用它:

 
 
 
  1. AsynchronousSocketChannel socketChannel = AsynchronousSocketChannel.open(channelGroup); 
  2.  

你可以使用在組上使用shutdown()方法關(guān)閉組,關(guān)閉之后,你就不能使用這個組創(chuàng)建更多的通道,當(dāng)所有通道關(guān)閉后,組也終止了,處理程序結(jié)束,資源也釋放了。

當(dāng)你使用任何類型的池和CompletionHandler時,你必須要注意一點(diǎn),不要在CompletionHandler內(nèi)使用阻塞或長時間操作,如果所有線程都被阻塞,整個應(yīng)用程序都會被阻塞掉。如果你有自定義或緩存的線程池,它會使隊列無限制地增長,最終導(dǎo)致OutOfMemoryError。

我想我把新的異步I/O API涵蓋的內(nèi)容講得差不多了,當(dāng)然這不是一兩句話可以說清楚的,也不是每一個人都會使用到它們,但在某些時候它確實(shí)很有用,Java支持這種I/O操作終歸是一件好事。如果我的代碼中有什么錯誤我表示道歉,因?yàn)槲乙彩莿倓偛沤佑|。

原文名:Java 7 : New I/O features (Asynchronous operations, multicasting, random access) with JSR 203 (NIO.2)

原文出處:www.baptiste-wicht.com/2010/04/java-7-new-io-features-asynchronous-operations-multicasting-random-access-with-jsr-203-nio-2/


文章標(biāo)題:Java7I/O新功能探秘:同步操作,多播與隨機(jī)存取
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/cooicsh.html