欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java中的NIO是什么

這篇文章主要介紹“Java中的NIO是什么”,在日常操作中,相信很多人在Java中的NIO是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java中的NIO是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、成都微信小程序、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立10多年以來,已經(jīng)為1000+成都陽光房各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的1000+客戶與我們一路同行,見證我們的成長(zhǎng);未來,我們一起分享成功的喜悅。

什么是NIO

??NIO即NEW I/O,是在JDK1.4引入的一套新的I/O標(biāo)準(zhǔn)。NIO是基于Block,以塊為基本單元處理數(shù)據(jù)。并且為所有的基礎(chǔ)類型提供了Buffer支持。 ?? 數(shù)據(jù)從Channel中讀到Buffer中去,或者從Buffer寫入Channel中。Selector監(jiān)聽多個(gè)Channel的事件,比如打開鏈接或數(shù)據(jù)到達(dá)。

graph LR
  A((Channel))--讀取-->B[Buffer]
graph LR
  A[Buffer]--寫入-->B((Channel))

相比較傳統(tǒng)I/O的區(qū)別

1、傳統(tǒng)的I/O基于字節(jié)流和字符流的操作,NIO則是基于Channel和Buffer進(jìn)行數(shù)據(jù)操作。 2、IO是面向流的,NIO是面向Buffer緩沖區(qū)的。 面向流意味著讀取數(shù)據(jù)從流中挨個(gè)讀取字節(jié),直至讀完全部字節(jié)。如果需要對(duì)讀取的數(shù)據(jù)進(jìn)行前后移動(dòng)操作,則需要建立緩沖區(qū)。而NIO的Buffer正好做到這一點(diǎn),數(shù)據(jù)從Channel被讀取到緩沖區(qū)后,可以很方便的的操作數(shù)據(jù)。 3、IO操作是阻塞模式,調(diào)用read()或者write()操作時(shí),線程阻塞,直至數(shù)據(jù)的讀或?qū)懭拷Y(jié)束。NIO是非阻塞模式,從Channel讀取數(shù)據(jù)時(shí),如果沒有可用數(shù)據(jù),就什么都不獲取,不會(huì)阻塞線程等待,而是把空閑時(shí)間用來執(zhí)行其他Channel上的IO操作,所以單線程可以管理多個(gè)Channel。

NIO三大核心部分

Channel(通道) Buffer(緩沖區(qū)) Selector(選擇區(qū))

Channel

簡(jiǎn)稱“信道”或“通道”,跟IO流里的Stream一個(gè)級(jí)別,不過Stream是單向的,Channel是雙向的,所以既可以用來讀操作,也可以用來寫操作。 主要實(shí)現(xiàn):

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

FileChannel

示例: 傳統(tǒng)IO

    /**
     * 傳統(tǒng)IO操作讀取文件
     */
    public static void oldIo(){
        InputStream inputStream = null;
        try{
            inputStream = new BufferedInputStream(
                    new FileInputStream("src\\main\\java\\top\\qrainly\\demo\\nio\\OldIO.txt"));
            byte[] bytes = new byte[1024];
            int read = inputStream.read(bytes);
            System.out.println(read);
            while (read!=-1){
                for(int i=0;i<read;i++){
                    System.out.println((char) bytes[i]);
                }
                read = inputStream.read(bytes);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try{
                if(inputStream != null){
                    inputStream.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

NIO

/**
     * NIO操作
     */
    public static void nio(){
        RandomAccessFile file = null;
        try{
            file = new RandomAccessFile("src\\main\\java\\top\\qrainly\\demo\\nio\\NIO.txt","rw");
            FileChannel fileChannel = file.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            int read = fileChannel.read(buffer);
            System.out.println(read);
            while (read != -1){
                buffer.flip();
                while (buffer.hasRemaining()){
                    System.out.println((char) buffer.get());
                }
                buffer.compact();
                read = fileChannel.read(buffer);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try{
                if(file != null){
                    file.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

NIO拷貝文件

/**
     * NIO拷貝文件
     * @param source
     * @param target
     */
    public static void nioCopyFile(String source,String target){
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        FileChannel readChannel = null;
        FileChannel writeChannel = null;
        try {
            fileInputStream = new FileInputStream(source);
            fileOutputStream = new FileOutputStream(target);
            readChannel = fileInputStream.getChannel();
            writeChannel = fileOutputStream.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (true){
                buffer.clear();
                int read = readChannel.read(buffer);
                if(read == -1){
                    //讀取完畢
                    break;
                }
                buffer.flip();
                //寫入文件
                writeChannel.write(buffer);
            }

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

        }
    }

SocketChannel

套接字的某些操作可能會(huì)無限期地阻塞 對(duì)accept()方法的調(diào)用可能會(huì)因?yàn)榈却粋€(gè)客戶端連接而阻塞; 對(duì)read()方法的調(diào)用可能會(huì)因?yàn)闆]有數(shù)據(jù)可讀而阻塞,直到連接的另一端傳來新的數(shù)據(jù)。 NIO的channel抽象的一個(gè)重要特征就是可以通過配置它的阻塞行為,以實(shí)現(xiàn)非阻塞式的信道

channel.configureBlocking(false)

示例:

/**
     * 客戶端 NIO實(shí)現(xiàn)
     */
    public static void client(){
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        SocketChannel socketChannel = null;
        try{
            //打開SocketChannel
            socketChannel = SocketChannel.open();
            socketChannel.configureBlocking(false);
            socketChannel.connect(new InetSocketAddress("localhost",8080));
            if(socketChannel.finishConnect()){
                int i = 0;
                while (true){
                    TimeUnit.SECONDS.sleep(1);
                    //讀取數(shù)據(jù)
                    String info = "I'm "+i+++"-th from client";
                    buffer.clear();
                    buffer.put(info.getBytes());
                    buffer.flip();
                    while (buffer.hasRemaining()){
                        System.out.println(buffer);
                        socketChannel.write(buffer);
                    }
                }
            }
        }catch (IOException | InterruptedException e){
            e.printStackTrace();
        } finally {
            try{
                if(socketChannel != null){
                    //關(guān)閉SocketChannel
                    socketChannel.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

服務(wù)端NIO實(shí)現(xiàn)

private static final int BUF_SIZE = 1024;
    private static final int PORT = 8080;
    private static final int TIME_OUT = 3000;

    public static void selector(){
        Selector selector = null;
        ServerSocketChannel serverSocketChannel = null;
        try{
            selector = Selector.open();
            serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.socket().bind(new InetSocketAddress(PORT));
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

            while (true){
                if(selector.select(TIME_OUT) == 0){
                    System.out.println("等待連接...");
                    continue;
                }
                Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
                while (iterator.hasNext()){
                    SelectionKey key= iterator.next();
                    if(key.isAcceptable()){
                        handleAccept(key);
                    }
                    if(key.isReadable()){
                        handleRead(key);
                    }
                    if(key.isWritable() && key.isValid()){
                        handleWrite(key);
                    }
                    if(key.isConnectable()){
                        System.out.println("連接成功!");
                    }
                    iterator.remove();
                }
            }

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

    /**
     * 處理連接
     * @param key
     * @throws IOException
     */
    public static void handleAccept(SelectionKey key) throws IOException {
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
        //監(jiān)聽連接
        SocketChannel socketChannel = serverSocketChannel.accept();
        socketChannel.configureBlocking(false);
        socketChannel.register(key.selector(),SelectionKey.OP_READ, ByteBuffer.allocateDirect(BUF_SIZE));
    }

    /**
     * 處理讀
     * @param key
     * @throws IOException
     */
    public static void handleRead(SelectionKey key) throws IOException {
        SocketChannel socketChannel = (SocketChannel) key.channel();
        ByteBuffer buffer = (ByteBuffer) key.attachment();
        long bytesRead = socketChannel.read(buffer);
        while (bytesRead > 0){
            buffer.flip();
            while (buffer.hasRemaining()){
                System.out.println((char) buffer.get());
            }
            buffer.clear();
            bytesRead = socketChannel.read(buffer);
        }
        if(bytesRead == -1){
            socketChannel.close();
        }
    }

    /**
     * 處理寫
     * @param key
     * @throws IOException
     */
    public static void handleWrite(SelectionKey key) throws IOException {
        ByteBuffer buffer = (ByteBuffer) key.attachment();
        buffer.flip();
        SocketChannel socketChannel = (SocketChannel) key.channel();
        while (buffer.hasRemaining()){
            socketChannel.write(buffer);
        }
        buffer.compact();
    }

??Selector類可以用于避免使用阻塞式客戶端中很浪費(fèi)資源的“忙等”方法需要讀取和分發(fā)。這就需要一種方法阻塞等待,直到至少有一個(gè)信道可以進(jìn)行I/O操作,并指出是哪個(gè)信道。NIO的選擇器就實(shí)現(xiàn)了這樣的功能。 一個(gè)Selector實(shí)例可以同時(shí)檢查一組信道的I/O狀態(tài)。用專業(yè)術(shù)語來說,選擇器就是一個(gè)多路開關(guān)選擇器,因?yàn)橐粋€(gè)選擇器能夠管理多個(gè)信道上的I/O操作。 然而如果用傳統(tǒng)的方式來處理這么多客戶端,使用的方法是循環(huán)地一個(gè)一個(gè)地去檢查所有的客戶端是否有I/O操作,如果當(dāng)前客戶端有I/O操作,則可能把當(dāng)前客戶端扔給一個(gè)線程池去處理,如果沒有I/O操作則進(jìn)行下一個(gè)輪詢,當(dāng)所有的客戶端都輪詢過了又接著從頭開始輪詢;這種方法是非常笨而且也非常浪費(fèi)資源,因?yàn)榇蟛糠挚蛻舳耸菦]有I/O操作,我們也要去檢查;而Selector就不一樣了,它在內(nèi)部可以同時(shí)管理多個(gè)I/O,當(dāng)一個(gè)信道有I/O操作的時(shí)候,他會(huì)通知Selector,Selector就是記住這個(gè)信道有I/O操作,并且知道是何種I/O操作,是讀呢?是寫呢? 還是接受新的連接; ??使用Selector,它返回的結(jié)果只有兩種結(jié)果,一種是0,即在你調(diào)用的時(shí)刻沒有任何客戶端需要I/O操作,另一種結(jié)果是一組需要I/O操作的客戶端,這時(shí)你就根本不需要再檢查了,因?yàn)樗祷亟o你的肯定是你想要的。 這樣一種通知的方式比那種主動(dòng)輪詢的方式要高效得多!

??與Selector一起使用時(shí),Channel必須處于非阻塞模式下。這意味著不能將FileChannel與Selector一起使用, 因?yàn)镕ileChannel不能切換到非阻塞模式。而套接字通道都可以。

Selector

??異步網(wǎng)絡(luò)IO Selector運(yùn)行單線程處理多個(gè)Channel,如果應(yīng)用打開了多信道,單個(gè)連接流量很低,此時(shí)使用Selector就會(huì)很方便。向Selector注冊(cè)Channel,然后條用select()方法,這個(gè)方法會(huì)一直阻塞到有注冊(cè)的信道有事件就緒,例如連接打開或者數(shù)據(jù)到達(dá)。 ??要使用選擇器(Selector),需要?jiǎng)?chuàng)建一個(gè)Selector實(shí)例(使用靜態(tài)工廠方法open())并將其注冊(cè)(register)到想要監(jiān)控的信道上(注意,這要通過channel的方法實(shí)現(xiàn),而不是使用selector的方法)。最后,調(diào)用選擇器的select()方法。該方法會(huì)阻塞等待,直到有一個(gè)或更多的信道準(zhǔn)備好了I/O操作或等待超時(shí)。select()方法將返回可進(jìn)行I/O操作的信道數(shù)量?,F(xiàn)在,在一個(gè)單獨(dú)的線程中, 通過調(diào)用select()方法就能檢查多個(gè)信道是否準(zhǔn)備好進(jìn)行I/O操作。如果經(jīng)過一段時(shí)間后仍然沒有信道準(zhǔn)備好,select()方法就會(huì)返回0, 并允許程序繼續(xù)執(zhí)行其他任務(wù)。

Buffer

Buffer中有四個(gè)個(gè)重要的參數(shù):位置(position)、容量(capactiy)、上限(limit)和標(biāo)記(mark)

參數(shù)寫模式寫模式
位置(position)當(dāng)前緩沖區(qū)的位置,將從position的下一個(gè)位置開始寫數(shù)據(jù)當(dāng)前緩沖區(qū)讀取的位置,將從position下一個(gè)位置
容量(capactiy)緩沖區(qū)的總?cè)萘可舷?/td>緩沖區(qū)的總?cè)萘可舷?/td>
上限(limit)緩沖區(qū)的時(shí)機(jī)上限,limit<=capactiy代表可讀取的總?cè)萘?,和上次寫入的?shù)據(jù)量相等
標(biāo)記(mark)用于記錄position前一個(gè)位置用于記錄position前一個(gè)位置

使用步驟

  1. 分配空間(ByteBuffer buf = ByteBuffer.allocate(1024); 或者allocateDirector)

  2. 寫入數(shù)據(jù)到Buffer(int bytesRead = fileChannel.read(buf);)

  3. 調(diào)用filp()方法( buf.flip();)

  4. 從Buffer中讀取數(shù)據(jù)(System.out.print((char)buf.get());)

  5. 調(diào)用clear()方法或者compact()方法 Buffer顧名思義:緩沖區(qū),實(shí)際上是一個(gè)容器,一個(gè)連續(xù)數(shù)組。Channel提供從文件、網(wǎng)絡(luò)讀取數(shù)據(jù)的渠道,但是讀寫的數(shù)據(jù)都必須經(jīng)過Buffer。 從Channel寫到Buffer (fileChannel.read(buf))通過Buffer的put()方法 (buf.put(…)) 從Buffer讀取到Channel (channel.write(buf))使用get()方法從Buffer中讀取數(shù)據(jù) (buf.get())

操作示例

1、ByteBuffer.allocate(10)方法創(chuàng)建了一個(gè)10個(gè)byte的數(shù)組緩沖區(qū),position的位置為0,capacity和limit默認(rèn)都是數(shù)組長(zhǎng)度 2、當(dāng)我們寫入5個(gè)字節(jié)時(shí),position變?yōu)?,limit和capacity不變 3、將緩沖區(qū)中的5個(gè)字節(jié)數(shù)據(jù)寫入Channel的通信信道,調(diào)用ByteBuffer.flip()方法,position變?yōu)?,limit變?yōu)?,capactiy不變 4、下一次寫入數(shù)據(jù)前調(diào)用clear()方法 -- 調(diào)用clear()方法:position將被設(shè)回0,limit設(shè)置成capacity(Buffer中的數(shù)據(jù)并未被清除) -- 調(diào)用compact()方法。compact()方法將所有未讀的數(shù)據(jù)拷貝到Buffer起始處。然后將position設(shè)到最后一個(gè)未讀元素正后面。 limit屬性依然像clear()方法一樣,設(shè)置成capacity。不會(huì)覆蓋未讀的數(shù)據(jù)。 5、調(diào)用Buffer.mark()方法,可以標(biāo)記Buffer中的一個(gè)特定的position,之后可以通過調(diào)用Buffer.reset()方法恢復(fù)到這個(gè)position。 Buffer.rewind()方法將position設(shè)回0,并清除標(biāo)記位,所以可以重讀Buffer中的所有數(shù)據(jù)。limit保持不變, 仍然表示能從Buffer中讀取多少個(gè)元素 代碼示例

/**
     * Buffer操作過程  參數(shù)變化
     */
    public static void bufferParams(){
        //15個(gè)字節(jié)大小的緩沖區(qū)
        ByteBuffer b=ByteBuffer.allocate(15);
        System.out.println("########創(chuàng)建15個(gè)字節(jié)的數(shù)組緩沖區(qū)########");
        System.out.println("limit="+b.limit()+" capacity="+b.capacity()+" position="+b.position());
        //存入10個(gè)字節(jié)數(shù)據(jù)
        System.out.println("########開始存入十個(gè)字節(jié)數(shù)據(jù)########");
        for(int i=0;i<10;i++){
            b.put((byte)i);
            System.out.println("########存入-->"+i+"########");
        }
        System.out.println("########存入十個(gè)字節(jié)數(shù)據(jù)完成########");
        System.out.println("limit="+b.limit()+" capacity="+b.capacity()+" position="+b.position());
        //重置position
        System.out.println("########調(diào)用flip()方法########");
        b.flip();
        System.out.println("########調(diào)用完flip()方法后########");
        System.out.println("limit="+b.limit()+" capacity="+b.capacity()+" position="+b.position());
        System.out.println("########開始讀取五個(gè)字節(jié)數(shù)據(jù)########");
        for(int i=0;i<5;i++){
            byte b1 = b.get();
            System.out.print(b1);
            System.out.println("########讀取字節(jié)數(shù)據(jù)-->"+b1+"########");
        }
        System.out.println("########讀取五個(gè)字節(jié)數(shù)據(jù)完成########");
        System.out.println(); System.out.println("limit="+b.limit()+" capacity="+b.capacity()+" position="+b.position());
        System.out.println("########調(diào)用flip()方法########");
        b.flip();
        System.out.println("########調(diào)用完flip()方法后########");
        System.out.println("limit="+b.limit()+" capacity="+b.capacity()+" position="+b.position());
    }

打印結(jié)果

########創(chuàng)建15個(gè)字節(jié)的數(shù)組緩沖區(qū)########
limit=15 capacity=15 position=0
########開始存入十個(gè)字節(jié)數(shù)據(jù)########
########存入-->0########
########存入-->1########
########存入-->2########
########存入-->3########
########存入-->4########
########存入-->5########
########存入-->6########
########存入-->7########
########存入-->8########
########存入-->9########
########存入十個(gè)字節(jié)數(shù)據(jù)完成########
limit=15 capacity=15 position=10
########調(diào)用flip()方法########
########調(diào)用完flip()方法后########
limit=10 capacity=15 position=0
########開始讀取五個(gè)字節(jié)數(shù)據(jù)########
0########讀取字節(jié)數(shù)據(jù)-->0########
1########讀取字節(jié)數(shù)據(jù)-->1########
2########讀取字節(jié)數(shù)據(jù)-->2########
3########讀取字節(jié)數(shù)據(jù)-->3########
4########讀取字節(jié)數(shù)據(jù)-->4########
########讀取五個(gè)字節(jié)數(shù)據(jù)完成########

limit=10 capacity=15 position=5
########調(diào)用flip()方法########
########調(diào)用完flip()方法后########
limit=5 capacity=15 position=0

三個(gè)重要的方法

1、rewind() – 將position置零,并清除標(biāo)志位(mark 2、clear() – 將position置零,同時(shí)將limit設(shè)置為capacity的大小,并清除了標(biāo)志mark 3、flip() – 先將limit設(shè)置到position所在位置,然后將position置零,并清除標(biāo)志位mark – 通常在讀寫轉(zhuǎn)換時(shí)使用

文件映射到內(nèi)存

示例:

/**
     * 文件映射到內(nèi)存
     */
    public static void mapperMemory(){
        RandomAccessFile randomAccessFile = null;
        try{
            randomAccessFile = new RandomAccessFile(
                    "src\\main\\java\\top\\qrainly\\demo\\nio\\NIO.txt","rw");
            FileChannel fileChannel = randomAccessFile.getChannel();
            //將文件映射到內(nèi)存中
            MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE,
                    0,randomAccessFile.length());
            while (mappedByteBuffer.hasRemaining()){
                System.out.println((char) mappedByteBuffer.get());
            }
            //修改文件
            mappedByteBuffer.put(0,(byte)98);
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try{
                if(randomAccessFile != null){
                    randomAccessFile.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

    }

到此,關(guān)于“Java中的NIO是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

分享文章:Java中的NIO是什么
文章位置:http://aaarwkj.com/article42/gjopec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站排名、網(wǎng)站建設(shè)品牌網(wǎng)站制作、網(wǎng)站制作靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
精品视频一区二区三区在线观看 | 日本国产一区二区在线观看| 国产精品久久久毛片av| 欧美国产日本日韩在线黄| 欧美日韩国产一下老妇| 欧美看黄网站在线观看| 久久热在线视频精品视频| 亚洲成人爱情动作片在线观看| 69国产精品久久久久久人| 99亚洲伊人久久精品影院| 高清不卡日本一区二区三区久久| 精品在线中文字幕不卡| 亚洲一区二区精品91眼镜| 韩日av一区二区三区| 亚洲综合偷拍日韩av| 国产三级国产精品三级| 日韩欧美一区亚洲一区| 国产999精品免费国产| 人妻免费精品久久一区| 国产精品一级自拍视频| 免费国产成人高清在线视频| 日韩在线欧美在线一区二区| 日本精品在线一区二区| 麻豆久久精品国产亚洲精品超碰热 | 日韩中文字幕一二一二区| 麻豆av久久一区二区| 亚洲成av在线免费不卡| 国产亚洲视频一区二区观看| 亚洲激情中文字幕av网| 欧美亚洲综合日韩精品区| 91欧美一区二区在线视频| 久久人妻一区二区三区免费密臀| 少妇被按摩高潮在线观看| 国产精品青青草原在线| 日韩一区二区偷拍视频| 日韩久久精品国产亚洲av成人| 国外男女性生活在线视频| 蜜臀午夜精品视频在线观看| 有码不卡中文字幕在线视频| 91老熟女露脸嗷嗷叫| 哪里可以看黄色片日韩|