(1)Java.io中最为核心的一个概念是流(stream),面向流的编程。流是信息的载体。Java中一个流要么是输入流,要么是输出流,不可能同时既是输入流又是输出流。
(2)Java.nio中拥有3个核心概念:selector,channel,buffer。在java.nio中是面向块(block)或是缓冲区(buffer)编程的。Buffer本身就是一块内存,底层实现上,它实际上是个数组。数据的读、写都是通过Buffer来实现的(既能读又能写)。除了数组之外,Buffer还提供了对于数据的结构化访问方式,并且可以追踪到系统的读写过程。
(3)Java中的7个原生数据类型都有各自对应的Buffer类型,如IntBuffer,LongBuffer,ByteBuffer等,没有BooleanBuffer类型。
(4)Channel指的是可以向其写入数据或从中读取数据的对象,它类似于java.io中的Stream。所有数据的读写都是通过Buffer来进行的,永远不会出现直接channel写入数据的情况,或是直接从Channel读取数据的情况。不同的是,java.io中的一个流只能是OutputStream或是InputStream。由于Channel是双向的,因此它能更好地反映出底层操作系统的真实情况:在linux系统中,底层操作系统的通道就是双向的。
public class nioTest1 {//随机数输出
public static void main(String[] args) {
IntBuffer buffer = IntBuffer.allocate(10);
for(int i = 0; i<buffer.capacity();++i){
int randomNumber = new SecureRandom().nextInt(20);
buffer.put(randomNumber);
}
buffer.flip();//翻转;实现读写的切换
while(buffer.hasRemaining()){
System.out.println(buffer.get());
}
}
}
//操作文件
public class nioTest2 {
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("nioTest2.txt");
//从文件中得到输入流
FileChannel fileChannel = fileInputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
fileChannel.read(byteBuffer);//读取输入流数据到buffer中
byteBuffer.flip();
while(byteBuffer.remaining() > 0){
byte b = byteBuffer.get();
System.out.println("Character: " + (char)b);
}
fileInputStream.close();
}
@Test
public void TestOutputNio() throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("nioOutput.txt");
FileChannel fileChannel = fileOutputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
byte[] message = "Hello world".getBytes();//要写的信息定义到数组中
for(int i = 0; i<message.length;++i){
byteBuffer.put(message[i]);//信息给到buffer
}
byteBuffer.flip();
fileChannel.write(byteBuffer);//将buffer中数据写到channel
fileOutputStream.close();
}
}