国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java NIO

superw / 813人閱讀

摘要:一旦聲明不能改變。后數(shù)據(jù)不能進(jìn)行讀寫位置,表示緩沖區(qū)中正在操作數(shù)據(jù)的位置。標(biāo)記,表示記錄當(dāng)前的位置。緩沖區(qū)的限制不能為負(fù),并且不能大于其容量。一通道用于源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)的連接。

1.Java NIO 簡(jiǎn)介

2.Java NIO 與IO 的主要區(qū)別

3.緩沖區(qū)(Buffer)和通道(Channel)

4.文件通道(FileChannel)

5.NIO 的非阻塞式網(wǎng)絡(luò)通信

?選擇器(Selector)
?SocketChannel、ServerSocketChannel、DatagramChannel

面向流

面向緩沖區(qū)

Java NIO(New IO)是從Java 1.4版本開始引入的一個(gè)新的IO API,可以替代標(biāo)準(zhǔn)的Java IO API。NIO與原來(lái)的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支持面向緩沖區(qū)的、基于通道的IO操作。NIO將以更加高效的方式進(jìn)行文件的讀寫操作。

Java NIO 與IO 的主要區(qū)別

import java.nio.ByteBuffer;

import org.junit.Test;

/*

一、緩沖區(qū)(Buffer):在 Java NIO 中負(fù)責(zé)數(shù)據(jù)的存取。緩沖區(qū)就是數(shù)組。用于存儲(chǔ)不同數(shù)據(jù)類型的數(shù)據(jù)

根據(jù)數(shù)據(jù)類型不同(boolean 除外),提供了相應(yīng)類型的緩沖區(qū):

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

上述緩沖區(qū)的管理方式幾乎一致,通過(guò) allocate() 獲取緩沖區(qū)

二、緩沖區(qū)存取數(shù)據(jù)的兩個(gè)核心方法:

put() : 存入數(shù)據(jù)到緩沖區(qū)中

get() : 獲取緩沖區(qū)中的數(shù)據(jù)

三、緩沖區(qū)中的四個(gè)核心屬性:

capacity : 容量,表示緩沖區(qū)中最大存儲(chǔ)數(shù)據(jù)的容量。一旦聲明不能改變。

limit : 界限,表示緩沖區(qū)中可以操作數(shù)據(jù)的大小。(limit 后數(shù)據(jù)不能進(jìn)行讀寫)

position : 位置,表示緩沖區(qū)中正在操作數(shù)據(jù)的位置。

mark : 標(biāo)記,表示記錄當(dāng)前 position 的位置。可以通過(guò) reset() 恢復(fù)到 mark 的位置

0 <= mark <= position <= limit <= capacity

四、直接緩沖區(qū)與非直接緩沖區(qū):

非直接緩沖區(qū):通過(guò) allocate() 方法分配緩沖區(qū),將緩沖區(qū)建立在 JVM 的內(nèi)存中

直接緩沖區(qū):通過(guò) allocateDirect() 方法分配直接緩沖區(qū),將緩沖區(qū)建立在物理內(nèi)存中。可以提高效率

*/
public class TestBuffer {

@Test
public void test3(){
    //分配直接緩沖區(qū)
    ByteBuffer buf = ByteBuffer.allocateDirect(1024);

    System.out.println(buf.isDirect());
}

@Test
public void test2(){
    String str = "abcde";

    ByteBuffer buf = ByteBuffer.allocate(1024);

    buf.put(str.getBytes());

    buf.flip();

    byte[] dst = new byte[buf.limit()];
    buf.get(dst, 0, 2);
    System.out.println(new String(dst, 0, 2));
    System.out.println(buf.position());

    //mark() : 標(biāo)記
    buf.mark();

    buf.get(dst, 2, 2);
    System.out.println(new String(dst, 2, 2));
    System.out.println(buf.position());

    //reset() : 恢復(fù)到 mark 的位置
    buf.reset();
    System.out.println(buf.position());

    //判斷緩沖區(qū)中是否還有剩余數(shù)據(jù)
    if(buf.hasRemaining()){

        //獲取緩沖區(qū)中可以操作的數(shù)量
        System.out.println(buf.remaining());
    }
}

@Test
public void test1(){
    String str = "abcde";

    //1. 分配一個(gè)指定大小的緩沖區(qū)
    ByteBuffer buf = ByteBuffer.allocate(1024);

    System.out.println("-----------------allocate()----------------");
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //2. 利用 put() 存入數(shù)據(jù)到緩沖區(qū)中
    buf.put(str.getBytes());

    System.out.println("-----------------put()----------------");
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //3. 切換讀取數(shù)據(jù)模式
    buf.flip();

    System.out.println("-----------------flip()----------------");
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //4. 利用 get() 讀取緩沖區(qū)中的數(shù)據(jù)
    byte[] dst = new byte[buf.limit()];
    buf.get(dst);
    System.out.println(new String(dst, 0, dst.length));

    System.out.println("-----------------get()----------------");
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //5. rewind() : 可重復(fù)讀
    buf.rewind();

    System.out.println("-----------------rewind()----------------");
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //6. clear() : 清空緩沖區(qū). 但是緩沖區(qū)中的數(shù)據(jù)依然存在,但是處于“被遺忘”狀態(tài)
    buf.clear();

    System.out.println("-----------------clear()----------------");
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    System.out.println((char)buf.get());

}

}

1-通道(Channel)與緩沖區(qū)(Buffer)

通道和緩沖區(qū)
?Java NIO系統(tǒng)的核心在于:通道(Channel)和緩沖區(qū)(Buffer)。通道表示打開到IO 設(shè)備(例如:文件、套接字)的連接。若需要使用NIO 系統(tǒng),需要獲取用于連接IO 設(shè)備的通道以及用于容納數(shù)據(jù)的緩沖區(qū)。然后操作緩沖區(qū),對(duì)數(shù)據(jù)進(jìn)行處理。

緩沖區(qū)(Buffer)

? 緩沖區(qū)(Buffer):一個(gè)用于特定基本數(shù)據(jù)類
型的容器。由java.nio 包定義的,所有緩沖區(qū)
都是Buffer 抽象類的子類。

? Java NIO 中的Buffer 主要用于與NIO 通道進(jìn)行
交互,數(shù)據(jù)是從通道讀入緩沖區(qū),從緩沖區(qū)寫
入通道中的。

緩沖區(qū)(Buffer)
Buffer 就像一個(gè)數(shù)組,可以保存多個(gè)相同類型的數(shù)據(jù)。根
據(jù)數(shù)據(jù)類型不同(boolean 除外) ,有以下Buffer 常用子類:
? ByteBuffer
? CharBuffer
? ShortBuffer
? IntBuffer
? LongBuffer
? FloatBuffer
? DoubleBuffer
上述Buffer 類他們都采用相似的方法進(jìn)行管理數(shù)據(jù),只是各自
管理的數(shù)據(jù)類型不同而已。都是通過(guò)如下方法獲取一個(gè)Buffer
對(duì)象:

緩沖區(qū)的基本屬性

Buffer 中的重要概念:
? 容量(capacity) :表示Buffer 最大數(shù)據(jù)容量,緩沖區(qū)容量不能為負(fù),并且創(chuàng)
建后不能更改。

? 限制(limit):第一個(gè)不應(yīng)該讀取或?qū)懭氲臄?shù)據(jù)的索引,即位于limit 后的數(shù)據(jù)
不可讀寫。緩沖區(qū)的限制不能為負(fù),并且不能大于其容量。

? 位置(position):下一個(gè)要讀取或?qū)懭氲臄?shù)據(jù)的索引。緩沖區(qū)的位置不能為
負(fù),并且不能大于其限制

? 標(biāo)記(mark)與重置(reset):標(biāo)記是一個(gè)索引,通過(guò)Buffer 中的mark() 方法
指定Buffer 中一個(gè)特定的position,之后可以通過(guò)調(diào)用reset() 方法恢復(fù)到這
個(gè)position.

緩沖區(qū)的基本屬性

Buffer 的常用方法

緩沖區(qū)的數(shù)據(jù)操作

Buffer 所有子類提供了兩個(gè)用于數(shù)據(jù)操作的方法:get()
與put() 方法

獲取Buffer 中的數(shù)據(jù)

get() :讀取單個(gè)字節(jié)
get(byte[] dst):批量讀取多個(gè)字節(jié)到dst 中
get(int index):讀取指定索引位置的字節(jié)(不會(huì)移動(dòng)position)

放入數(shù)據(jù)到Buffer 中

put(byte b):將給定單個(gè)字節(jié)寫入緩沖區(qū)的當(dāng)前位置
put(byte[] src):將src 中的字節(jié)寫入緩沖區(qū)的當(dāng)前位置
put(int index, byte b):將指定字節(jié)寫入緩沖區(qū)的索引位置(不會(huì)移動(dòng)position)

                     直接與非直接緩沖區(qū)

字節(jié)緩沖區(qū)要么是直接的,要么是非直接的。如果為直接字節(jié)緩沖區(qū),則Java 虛擬機(jī)會(huì)盡最大努力直接在
此緩沖區(qū)上執(zhí)行本機(jī)I/O 操作。也就是說(shuō),在每次調(diào)用基礎(chǔ)操作系統(tǒng)的一個(gè)本機(jī)I/O 操作之前(或之后),
虛擬機(jī)都會(huì)盡量避免將緩沖區(qū)的內(nèi)容復(fù)制到中間緩沖區(qū)中(或從中間緩沖區(qū)中復(fù)制內(nèi)容)。

直接字節(jié)緩沖區(qū)可以通過(guò)調(diào)用此類的allocateDirect() 工廠方法來(lái)創(chuàng)建。此方法返回的緩沖區(qū)進(jìn)行分配和取消
分配所需成本通常高于非直接緩沖區(qū)。直接緩沖區(qū)的內(nèi)容可以駐留在常規(guī)的垃圾回收堆之外,因此,它們對(duì)
應(yīng)用程序的內(nèi)存需求量造成的影響可能并不明顯。所以,建議將直接緩沖區(qū)主要分配給那些易受基礎(chǔ)系統(tǒng)的
本機(jī)I/O 操作影響的大型、持久的緩沖區(qū)。一般情況下,最好僅在直接緩沖區(qū)能在程序性能方面帶來(lái)明顯好
處時(shí)分配它們。

直接字節(jié)緩沖區(qū)還可以通過(guò)FileChannel 的map() 方法將文件區(qū)域直接映射到內(nèi)存中來(lái)創(chuàng)建。該方法返回
MappedByteBuffer 。Java 平臺(tái)的實(shí)現(xiàn)有助于通過(guò)JNI 從本機(jī)代碼創(chuàng)建直接字節(jié)緩沖區(qū)。如果以上這些緩沖區(qū)
中的某個(gè)緩沖區(qū)實(shí)例指的是不可訪問(wèn)的內(nèi)存區(qū)域,則試圖訪問(wèn)該區(qū)域不會(huì)更改該緩沖區(qū)的內(nèi)容,并且將會(huì)在
訪問(wèn)期間或稍后的某個(gè)時(shí)間導(dǎo)致拋出不確定的異常。

字節(jié)緩沖區(qū)是直接緩沖區(qū)還是非直接緩沖區(qū)可通過(guò)調(diào)用其isDirect() 方法來(lái)確定。提供此方法是為了能夠在
性能關(guān)鍵型代碼中執(zhí)行顯式緩沖區(qū)管理。

非直接緩沖區(qū)

直接緩沖區(qū)

通道(Channel)

通道(Channel):由java.nio.channels 包定義
的。Channel 表示IO 源與目標(biāo)打開的連接。
Channel 類似于傳統(tǒng)的“流”。只不過(guò)Channel
本身不能直接訪問(wèn)數(shù)據(jù),Channel 只能與
Buffer 進(jìn)行交互。

通道(Channel)

通道(Channel)

Java 為Channel 接口提供的最主要實(shí)現(xiàn)類如下:

?FileChannel:用于讀取、寫入、映射和操作文件的通道。
?DatagramChannel:通過(guò)UDP 讀寫網(wǎng)絡(luò)中的數(shù)據(jù)通道。
?SocketChannel:通過(guò)TCP 讀寫網(wǎng)絡(luò)中的數(shù)據(jù)。
?ServerSocketChannel:可以監(jiān)聽(tīng)新進(jìn)來(lái)的TCP 連接,對(duì)每一個(gè)新進(jìn)來(lái)
的連接都會(huì)創(chuàng)建一個(gè)SocketChannel。

獲取通道

獲取通道的一種方式是對(duì)支持通道的對(duì)象調(diào)用
getChannel() 方法。支持通道的類如下:
? FileInputStream
? FileOutputStream
? RandomAccessFile
? DatagramSocket
? Socket
? ServerSocket
獲取通道的其他方式是使用Files 類的靜態(tài)方法newByteChannel() 獲
取字節(jié)通道。或者通過(guò)通道的靜態(tài)方法open() 打開并返回指定通道。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.junit.Test;

/*
 * 一、通道(Channel):用于源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)的連接。在 Java NIO 中負(fù)責(zé)緩沖區(qū)中數(shù)據(jù)的傳輸。Channel 本身不存儲(chǔ)數(shù)據(jù),因此需要配合緩沖區(qū)進(jìn)行傳輸。
 * 
 * 二、通道的主要實(shí)現(xiàn)類
 *     java.nio.channels.Channel 接口:
 *         |--FileChannel
 *         |--SocketChannel
 *         |--ServerSocketChannel
 *         |--DatagramChannel
 * 
 * 三、獲取通道
 * 1. Java 針對(duì)支持通道的類提供了 getChannel() 方法
 *         本地 IO:
 *         FileInputStream/FileOutputStream
 *         RandomAccessFile
 * 
 *         網(wǎng)絡(luò)IO:
 *         Socket
 *         ServerSocket
 *         DatagramSocket
 *         
 * 2. 在 JDK 1.7 中的 NIO.2 針對(duì)各個(gè)通道提供了靜態(tài)方法 open()
 * 3. 在 JDK 1.7 中的 NIO.2 的 Files 工具類的 newByteChannel()
 * 
 * 四、通道之間的數(shù)據(jù)傳輸
 * transferFrom()
 * transferTo()
 * 
 * 五、分散(Scatter)與聚集(Gather)
 * 分散讀取(Scattering Reads):將通道中的數(shù)據(jù)分散到多個(gè)緩沖區(qū)中
 * 聚集寫入(Gathering Writes):將多個(gè)緩沖區(qū)中的數(shù)據(jù)聚集到通道中
 * 
 * 六、字符集:Charset
 * 編碼:字符串 -> 字節(jié)數(shù)組
 * 解碼:字節(jié)數(shù)組  -> 字符串
 * 
 */
public class TestChannel {

    //字符集
    @Test
    public void test6() throws IOException{
        Charset cs1 = Charset.forName("GBK");

        //獲取編碼器
        CharsetEncoder ce = cs1.newEncoder();

        //獲取解碼器
        CharsetDecoder cd = cs1.newDecoder();

        CharBuffer cBuf = CharBuffer.allocate(1024);
        cBuf.put("威武!");
        cBuf.flip();

        //編碼
        ByteBuffer bBuf = ce.encode(cBuf);

        for (int i = 0; i < 12; i++) {
            System.out.println(bBuf.get());
        }

        //解碼
        bBuf.flip();
        CharBuffer cBuf2 = cd.decode(bBuf);
        System.out.println(cBuf2.toString());

        System.out.println("------------------------------------------------------");

        Charset cs2 = Charset.forName("GBK");
        bBuf.flip();
        CharBuffer cBuf3 = cs2.decode(bBuf);
        System.out.println(cBuf3.toString());
    }

    @Test
    public void test5(){
        Map map = Charset.availableCharsets();

        Set> set = map.entrySet();

        for (Entry entry : set) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
    }

    //分散和聚集
    @Test
    public void test4() throws IOException{
        RandomAccessFile raf1 = new RandomAccessFile("1.txt", "rw");

        //1. 獲取通道
        FileChannel channel1 = raf1.getChannel();

        //2. 分配指定大小的緩沖區(qū)
        ByteBuffer buf1 = ByteBuffer.allocate(100);
        ByteBuffer buf2 = ByteBuffer.allocate(1024);

        //3. 分散讀取
        ByteBuffer[] bufs = {buf1, buf2};
        channel1.read(bufs);

        for (ByteBuffer byteBuffer : bufs) {
            byteBuffer.flip();
        }

        System.out.println(new String(bufs[0].array(), 0, bufs[0].limit()));
        System.out.println("-----------------");
        System.out.println(new String(bufs[1].array(), 0, bufs[1].limit()));

        //4. 聚集寫入
        RandomAccessFile raf2 = new RandomAccessFile("2.txt", "rw");
        FileChannel channel2 = raf2.getChannel();

        channel2.write(bufs);
    }

    //通道之間的數(shù)據(jù)傳輸(直接緩沖區(qū))
    @Test
    public void test3() throws IOException{
        FileChannel inChannel = FileChannel.open(Paths.get("d:/1.mkv"), StandardOpenOption.READ);
        FileChannel outChannel = FileChannel.open(Paths.get("d:/2.mkv"), StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);

//        inChannel.transferTo(0, inChannel.size(), outChannel);
        outChannel.transferFrom(inChannel, 0, inChannel.size());

        inChannel.close();
        outChannel.close();
    }

    //使用直接緩沖區(qū)完成文件的復(fù)制(內(nèi)存映射文件)
    @Test
    public void test2() throws IOException{//2127-1902-1777
        long start = System.currentTimeMillis();

        FileChannel inChannel = FileChannel.open(Paths.get("d:/1.mkv"), StandardOpenOption.READ);
        FileChannel outChannel = FileChannel.open(Paths.get("d:/2.mkv"), StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);

        //內(nèi)存映射文件
        MappedByteBuffer inMappedBuf = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
        MappedByteBuffer outMappedBuf = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());

        //直接對(duì)緩沖區(qū)進(jìn)行數(shù)據(jù)的讀寫操作
        byte[] dst = new byte[inMappedBuf.limit()];
        inMappedBuf.get(dst);
        outMappedBuf.put(dst);

        inChannel.close();
        outChannel.close();

        long end = System.currentTimeMillis();
        System.out.println("耗費(fèi)時(shí)間為:" + (end - start));
    }

    //利用通道完成文件的復(fù)制(非直接緩沖區(qū))
    @Test
    public void test1(){//10874-10953
        long start = System.currentTimeMillis();

        FileInputStream fis = null;
        FileOutputStream fos = null;
        //①獲取通道
        FileChannel inChannel = null;
        FileChannel outChannel = null;
        try {
            fis = new FileInputStream("d:/1.mkv");
            fos = new FileOutputStream("d:/2.mkv");

            inChannel = fis.getChannel();
            outChannel = fos.getChannel();

            //②分配指定大小的緩沖區(qū)
            ByteBuffer buf = ByteBuffer.allocate(1024);

            //③將通道中的數(shù)據(jù)存入緩沖區(qū)中
            while(inChannel.read(buf) != -1){
                buf.flip(); //切換讀取數(shù)據(jù)的模式
                //④將緩沖區(qū)中的數(shù)據(jù)寫入通道中
                outChannel.write(buf);
                buf.clear(); //清空緩沖區(qū)
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(outChannel != null){
                try {
                    outChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(inChannel != null){
                try {
                    inChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        long end = System.currentTimeMillis();
        System.out.println("耗費(fèi)時(shí)間為:" + (end - start));

    }

}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/77385.html

相關(guān)文章

  • Java NIO 系列教程

    摘要:異步可以讓你異步的使用,例如當(dāng)線程從通道讀取數(shù)據(jù)到緩沖區(qū)時(shí),線程還是可以進(jìn)行其他事情。當(dāng)數(shù)據(jù)被寫入到緩沖區(qū)時(shí),線程可以繼續(xù)處理它。因此,單個(gè)的線程可以監(jiān)聽(tīng)多個(gè)數(shù)據(jù)通道。下面是系列文章的目錄概述通道之間的數(shù)據(jù)傳輸與原文譯者郭蕾校對(duì)方騰飛 Java NIO(New IO)是一個(gè)可以替代標(biāo)準(zhǔn)Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標(biāo)準(zhǔn)IO不同的...

    fanux 評(píng)論0 收藏0
  • Java NIO 概覽

    摘要:線程之間的切換對(duì)于操作系統(tǒng)來(lái)說(shuō)是昂貴的。因此,單線程可以監(jiān)視多個(gè)通道中的數(shù)據(jù)。當(dāng)方法返回后,線程可以處理這些事件。 一 NIO簡(jiǎn)介 Java NIO 是 java 1.4 之后新出的一套IO接口,這里的的新是相對(duì)于原有標(biāo)準(zhǔn)的Java IO和Java Networking接口。NIO提供了一種完全不同的操作方式。 NIO中的N可以理解為Non-blocking,不單純是New。 它支持面...

    chemzqm 評(píng)論0 收藏0
  • 關(guān)于Java IO與NIO知識(shí)都在這里

    摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來(lái)說(shuō)中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過(guò)的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來(lái)了,便于大家學(xué)習(xí)與回顧。 Ja...

    Riddler 評(píng)論0 收藏0
  • Java NIO 的前生今世 之一 簡(jiǎn)介

    摘要:簡(jiǎn)介是由引進(jìn)的異步由以下幾個(gè)核心部分組成和的對(duì)比和的區(qū)別主要體現(xiàn)在三個(gè)方面基于流而基于操作是阻塞的而操作是非阻塞的沒(méi)有概念而有概念基于與基于傳統(tǒng)的是面向字節(jié)流或字符流的而在中我們拋棄了傳統(tǒng)的流而是引入了和的概念在中我只能從中讀取數(shù)據(jù)到中或?qū)? 簡(jiǎn)介 Java NIO 是由 Java 1.4 引進(jìn)的異步 IO.Java NIO 由以下幾個(gè)核心部分組成: Channel Buffer Se...

    李義 評(píng)論0 收藏0
  • 動(dòng)力節(jié)點(diǎn)JavaNIO教程,輕松攻破Java NIO技術(shù)壁壘

    摘要:學(xué)習(xí)和掌握技術(shù)已經(jīng)不是一個(gè)攻城獅的加分技能,而是一個(gè)必備技能。是雙向的,不僅可以讀取數(shù)據(jù)還能保存數(shù)據(jù),程序不能直接讀寫通道,只與緩沖區(qū)交互為了讓大家不被高并發(fā)與大量連接處理問(wèn)題所困擾,動(dòng)力節(jié)點(diǎn)推出了高效處理模型應(yīng)用教程。 大家肯定了解Java IO, 但是對(duì)于NIO一般是陌生的,而現(xiàn)在使用到NIO的場(chǎng)景越來(lái)越多,很多技術(shù)框...

    ralap 評(píng)論0 收藏0
  • Netty序章之BIO NIO AIO演變

    摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問(wèn)題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒(méi)有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡(jiǎn)化了網(wǎng)絡(luò)程序的開發(fā),是很多框架和公司...

    VincentFF 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<