NIO篇

java中的NIO

概念
Nio:new I/O 流或者 non_bloking I/O ,

阻塞和非阻塞:(服务器)
阻塞:一直占有资源,不拿到资源不罢休
非阻塞:有一定灵活性,有再去拿

同步和异步的问题:(客户端)

同步:把事情都做完在提交
异步:边做边提交

1.核心的API类:

1.Channels:管道;
类似于传统的IO流,但是双向的结构

FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel

正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

  1. Buffers:缓冲

    ByteBuffer
    CharBuffer
    DoubleBuffer
    FloatBuffer
    IntBuffer
    LongBuffer
    ShortBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。

3 .Selectors:选择器

(非阻塞的方式)
Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

4.传统的代码演示:

package com.test.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
*
* 功能:java1.4版本中,基于非阻塞的方式的的读取数据;核心的API:Chanel,buffer, seletors
*
*
* @author Lw
* 2017年8月20日
*
*/
public class Test {
public static void main(String[] args) {

   Thread th=new Thread();
   th.setName("测试阻塞的线程");   
    String path="C:\\Users\\Administrator\\Desktop\\a.txt";
    File file=new File(path);
    FileInputStream in=null;
    FileOutputStream out=null;


    try {
        in  = new FileInputStream(file);
        out =new  FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\b.txt"));
        } catch (FileNotFoundException e2) {
        e2.printStackTrace();
        }
    try {       
    byte [] buff=new  byte[1024*1024];
    int len;
    try {
     while((len=in.read(buff))!=-1){

// 传统的方法中:IO调用的read()或者write()的方法,会一直线程处于激活想状态,不会被挂起
out.write(buff, 0, len);
System.out.println(“线程在占用数据”);

        }
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    } catch (Exception e) {
    e.printStackTrace();
    }finally{

    try {
        System.out.println("获取当前做写入的线程的名字:"+th.getName());
        in.close();
        out.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}
}

5.NIO的代码演示:
package com.test.nio;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
*
* 功能:使用NIO的方式:学习核心的API的开发:Channels:
* NIO:核心思想是:面向缓冲流进新操作;
*
* @author Lw
* 2017年8月20日
*
*/
public class Test_Channels {
public static void main(String[] args) throws Exception {
// 获取单前的线程;

// 向文本中写入数据
String outpath=”C:\Users\Administrator\Desktop\a.txt”;
// 向文本写入的数据有
String str=”Hello JAVA NIO 我爱你”;
File file=new File(outpath);
FileOutputStream out=new FileOutputStream(file);
// 使用的管道的方式 ,获取的流的管道
FileChannel channel=out.getChannel();
// 使用缓冲流:面向缓冲流进行开发;
ByteBuffer buff=ByteBuffer.allocate(1024);
// 向缓冲流put数据
buff.put(str.getBytes());
// 官方:反转缓冲区,把指针的重新调整到为0;
buff.flip();
channel.write(buff);
System.out.println( “写入成功”);
channel.close();
out.close();

}

}

6.异常处理

Throws:抛出的类的方法
throw :在抛出的一个在方法体
s:可以抛出很多类型的异常:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值