7.Nio代碼學(xué)習(xí)

1

public class NioTest01 {
    public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);

        for (int i = 0, j = buffer.capacity(); i < j; i++) {
            int random = new SecureRandom().nextInt(20);
            buffer.put(random);
        }

        buffer.flip();

        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }
    }
}

2

public class NioTest02 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("NioTest02.txt");
        FileChannel channel = fileInputStream.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(512);
        channel.read(buffer);

        buffer.flip();

        while (buffer.hasRemaining()) {
            byte b = buffer.get();
            System.out.printf("%c", b);
        }

        // 一定不要忘記
        fileInputStream.close();
    }
}

3

public class NioTest03 {
    public static void main(String[] args) throws Exception {
        FileOutputStream fileOutputStream = new FileOutputStream("nioTest03.txt");
        FileChannel fileChannel = fileOutputStream.getChannel();

        ByteBuffer byteBuffer = ByteBuffer.allocate(512);

        byte[] message = "hello world, welcome sumi~".getBytes();

        for (int i = 0; i < message.length; i++) {
            byteBuffer.put(message[i]);
        }

        byteBuffer.flip();

        fileChannel.write(byteBuffer);
        fileOutputStream.close();

    }
}

4

public class NioTest04 {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream("input.txt");
        FileOutputStream outputStream = new FileOutputStream("output.txt");
        FileChannel inputChannel = inputStream.getChannel();
        FileChannel outputChannel = outputStream.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(4);

        while (true) {
            //very very important 此代碼注釋掉力崇,會(huì)造成死循環(huán)的寫(xiě)入
            buffer.clear();

            int read = inputChannel.read(buffer);
            System.out.println(read);
            if (read == -1) {
                break;
            }

            //important
            buffer.flip();

            outputChannel.write(buffer);
        }

        inputStream.close();
        outputStream.close();
    }
}

5

public class NioTest05 {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(64);

        buffer.putInt(20);
        buffer.putChar('韓');
        buffer.putLong(380380380L);
        buffer.putDouble(20.4d);
        buffer.put((byte) 13);
        buffer.putFloat(11.1f);
        buffer.putShort((short) 10);

        buffer.flip();
        System.out.println(buffer.getInt());
        System.out.println(buffer.getChar());
        System.out.println(buffer.getLong());
        System.out.println(buffer.getDouble());
        System.out.println(buffer.get());
        System.out.println(buffer.getFloat());
        System.out.println(buffer.getShort());
    }
}

6

/**
 * @author sm121
 * @date 2018/12/20.
 * slice 與原有的 buffer共享相同的底層數(shù)組
 * shift + esc 關(guān)閉Terminal窗口
 * tab鍵厅贪,用于更新后面的代碼 buffer.position(2);  buffer.limit tab
 */
public class NioTest06 {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte) i);
        }

        // [2,5)
        buffer.position(2);
        buffer.limit(5);

        ByteBuffer slice = buffer.slice();

        for (int i = 0; i < slice.capacity(); i++) {
            byte b = slice.get(i);
            b *= 2;
            slice.put(i, b);
        }

        buffer.position(0);
        buffer.limit(buffer.capacity());

        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }
    }
}

7

/**
 * @author sm121
 * @date 2018/12/20.
 * 普通buffer 可以轉(zhuǎn)為 只讀buffer赛蔫,反過(guò)來(lái)不行。為什么
 */
public class NioTest07 {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        System.out.println(buffer.getClass());

        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte) i);
        }

        ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();

        System.out.println(readOnlyBuffer.getClass());

        readOnlyBuffer.flip();

        while (readOnlyBuffer.hasRemaining()) {
            System.out.println(readOnlyBuffer.get());
        }
    }
}

8

public class NioTest08 {
    public static void main(String[] args) throws Exception {
        ByteBuffer buffer = ByteBuffer.allocateDirect(10);
    }
}

9

/**
 * @author sm121
 * @date 2018/12/21.
 * 內(nèi)存映射文件蛙埂,位于堆外內(nèi)存
 */
public class NioTest09 {
    public static void main(String[] args) throws Exception {
        RandomAccessFile file = new RandomAccessFile("neicunyingshe.txt", "rw");

        FileChannel channel = file.getChannel();

        MappedByteBuffer map = channel.map(FileChannel.MapMode.READ_WRITE, 0, 10);
        map.putChar(0, 'c');
        map.putChar(2, 'z');

    }
}

10

public class NioTest10 {
    public static void main(String[] args) throws Exception {
        RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
        FileChannel channel = file.getChannel();
        FileLock lock = channel.lock(0, 10, true);

        System.out.println("shared:" + lock.isShared());
        System.out.println("valid:" + lock.isValid());
    }
}

11

public class NioTest11 {
    public static void main(String[] args) throws Exception {
        int[] ports = new int[]{6666, 6667, 6668, 6669};

        Selector selector = Selector.open();

        for (int i = 0; i < ports.length; i++) {
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.configureBlocking(false);

            ServerSocket serverSocket = serverSocketChannel.socket();
            InetSocketAddress inetAddress = new InetSocketAddress(ports[i]);
            // bind
            serverSocket.bind(inetAddress);

            //register
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            System.out.println("監(jiān)聽(tīng)端口:" + ports[i]);
        }

        while (true) {
            int numbers = selector.select();
            System.out.println("numbers: " + numbers);

            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            System.out.println("selected keys: " + selectionKeys);

            Iterator<SelectionKey> iterator = selectionKeys.iterator();

            while (iterator.hasNext()) {
                SelectionKey selectionKey = iterator.next();

                if (selectionKey.isAcceptable()) {
                    ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);

                    socketChannel.register(selector, SelectionKey.OP_READ);

                    //一定要注意移除
                    iterator.remove();
                    System.out.println("獲得客戶(hù)端連接:" + socketChannel);
                } else if (selectionKey.isReadable()) {
                    SocketChannel socketChannel = (SocketChannel) selectionKey.channel();

                    int bytesRead = 0;

                    while (true) {
                        ByteBuffer buffer = ByteBuffer.allocate(512);
                        buffer.clear();

                        int read = socketChannel.read(buffer);
                        if (read <= 0) {
                            break;
                        }
                        buffer.flip();
                        socketChannel.write(buffer);

                        bytesRead += read;
                    }
                    System.out.println("讀热迸啊:" + bytesRead + ",來(lái)自于" + socketChannel);

                    //一定要注意移除
                    iterator.remove();
                }

            }

        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抽诉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吐绵,更是在濱河造成了極大的恐慌迹淌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件己单,死亡現(xiàn)場(chǎng)離奇詭異唉窃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纹笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)纹份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人廷痘,你說(shuō)我怎么就攤上這事蔓涧。” “怎么了笋额?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵元暴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我兄猩,道長(zhǎng)茉盏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任枢冤,我火速辦了婚禮鸠姨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淹真。我一直安慰自己讶迁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布趟咆。 她就那樣靜靜地躺著添瓷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪值纱。 梳的紋絲不亂的頭發(fā)上鳞贷,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音虐唠,去河邊找鬼搀愧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咱筛。 我是一名探鬼主播搓幌,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迅箩!你這毒婦竟也來(lái)了溉愁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饲趋,失蹤者是張志新(化名)和其女友劉穎拐揭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奕塑,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堂污,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龄砰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盟猖。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡特恬,死狀恐怖森篷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肯骇,我是刑警寧澤圃泡,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布碟案,位于F島的核電站,受9級(jí)特大地震影響颇蜡,放射性物質(zhì)發(fā)生泄漏价说。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一风秤、第九天 我趴在偏房一處隱蔽的房頂上張望鳖目。 院中可真熱鬧,春花似錦缤弦、人聲如沸领迈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狸捅。三九已至,卻和暖如春累提,著一層夾襖步出監(jiān)牢的瞬間尘喝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工斋陪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朽褪,地道東北人置吓。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缔赠,于是被迫代替她去往敵國(guó)和親衍锚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海帶_4bbc閱讀 767評(píng)論 1 2
  • 【1】7嗤堰,9戴质,-1,5梁棠,( ) A置森、4;B符糊、2;C呛凶、-1男娄;D、-3 分析:選D漾稀,7+9=16模闲;9+(-1)=8;(...
    Alex_bingo閱讀 18,911評(píng)論 1 19
  • 目錄: Android:Android 0.*Android 1.*Android 2.*Android 3.*A...
    敲代碼的令狐蔥閱讀 3,853評(píng)論 0 2
  • 今天早上小組會(huì)崭捍,文健卻沒(méi)有出現(xiàn)尸折,鳳凰隊(duì)小組會(huì)己有三次沒(méi)有開(kāi)了,卡在文健這兒了殷蛇。昨天晚上還好好的实夹,他叮囑我做會(huì)議記錄...
    好心情2816閱讀 87評(píng)論 0 0
  • 春節(jié)回老家過(guò)年,短短幾天粒梦,在小地方最厲害的地方是回到家里足不出戶(hù)不需半天亮航,整條街的哥哥姐姐叔叔甚至他們的小孩娘家女...
    請(qǐng)堅(jiān)持2017閱讀 315評(píng)論 0 0