java中的NIO
概念
Nio:new I/O 流或者 non_bloking I/O ,
阻塞和非阻塞:(服务器)
阻塞:一直占有资源,不拿到资源不罢休
非阻塞:有一定灵活性,有再去拿
同步和异步的问题:(客户端)
同步:把事情都做完在提交
异步:边做边提交
1.核心的API类:
1.Channels:管道;
类似于传统的IO流,但是双向的结构
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
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:可以抛出很多类型的异常: