Java BIO
BIO 全称Block-IO 是一种同步且阻塞的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。
Java NIO
Java NIO,全程 Non-Block IO ,是Java SE 1.4版以后,针对网络传输效能优化的新功能。是一种非阻塞同步的通信模式。
NIO 与原来的 I/O 有同样的作用和目的, 他们之间最重要的区别是数据打包和传输的方式。原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。
面向流的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。
面向块的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。
辛星2018年nio教程第一篇:初识channel和buffer
辛星2018年nio教程第二篇:详细了解Buffer
辛星2018年nio教程第三篇:通过nio进行文件拷贝实例
辛星2018年nio教程第四篇:ByteBuffer的加速技术
辛星2018年nio教程第五篇:Scatter与Gather
辛星2018年nio教程第六篇:FileChanne梳理
辛星2018年nio教程第七篇:SocketChannel与ServerSocketChannel
辛星2018年nio教程第八篇:初识Selector
Java AIO
Java AIO,全程 Asynchronous IO,是异步非阻塞的IO。是一种非阻塞异步的通信模式。
在NIO的基础上引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。
三种IO的区别
首先,我们站在宏观的角度,重新画一下重点:
BIO (Blocking I/O):同步阻塞I/O模式。
NIO (New I/O):同步非阻塞模式。
AIO (Asynchronous I/O):异步非阻塞I/O模型。
同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。
阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。
所以说,阻塞非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。
同步阻塞模式:这种模式下,我们的工作模式是先来到厨房,开始烧水,并坐在水壶面前一直等着水烧开。
同步非阻塞模式:这种模式下,我们的工作模式是先来到厨房,开始烧水,但是我们不一直坐在水壶前面等,而是回到客厅看电视,然后每隔几分钟到厨房看一下水有没有烧开。
异步非阻塞I/O模型:这种模式下,我们的工作模式是先来到厨房,开始烧水,我们不一一直坐在水壶前面等,也不隔一段时间去看一下,而是在客厅看电视,水壶上面有个开关,水烧开之后他会通知我。
阻塞VS非阻塞:人是否坐在水壶前面一直等。
同步VS异步:水壶是不是在水烧开之后主动通知人。
commons.io-2.6 closeQuietly()已过时的个人见解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package io_compared;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import java.io.*;public class BIODemo { public static void main (String[] args) { User1 user = new User1(); user.setName("hollis" ); user.setAge(23 ); System.out.println(user); ObjectOutputStream oos = null ; try { oos = new ObjectOutputStream(new FileOutputStream("tempFile" )); oos.writeObject(user); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(oos); } File file = new File("tempFile" ); ObjectInputStream ois = null ; try { ois = new ObjectInputStream(new FileInputStream(file)); User1 newUser = (User1) ois.readObject(); System.out.println(newUser); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(ois); try { FileUtils.forceDelete(file); } catch (IOException e) { e.printStackTrace(); } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 package io_compared;import java.io.*;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.charset.Charset;public class NIODemo { public static void main (String args[]) { String pathname = "/Users/xuehaoyun/javawork/java-demo-project/out.txt" ; FileInputStream fin = null ; try { fin = new FileInputStream(new File(pathname)); FileChannel channel = fin.getChannel(); int capacity = 100 ; ByteBuffer bf = ByteBuffer.allocate(capacity); int length = -1 ; while ((length = channel.read(bf)) != -1 ) { byte [] bytes = bf.array(); System.out.write(bytes, 0 , length); System.out.println(); } channel.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fin != null ) { try { fin.close(); } catch (IOException e) { e.printStackTrace(); } } } String filename = "/Users/xuehaoyun/javawork/java-demo-project/out.txt" ; FileOutputStream fos = null ; try { fos = new FileOutputStream(new File(filename)); FileChannel channel = fos.getChannel(); ByteBuffer src = Charset.forName("utf8" ).encode("你好你好你好你好你好你好" ); int length = 0 ; while ((length = channel.write(src)) != 0 ) { System.out.println("写入长度:" + length); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null ) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package io_compared;import java.nio.ByteBuffer;import java.nio.channels.AsynchronousFileChannel;import java.nio.channels.CompletionHandler;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.StandardOpenOption;import java.util.concurrent.Future;public class AIODemo { public static void main (String[] args) throws Exception { Path file = Paths.get("/Users/xuehaoyun/javawork/java-demo-project/out.txt" ); AsynchronousFileChannel channel = AsynchronousFileChannel.open(file); ByteBuffer buffer = ByteBuffer.allocate(100_000 ); Future<Integer> result = channel.read(buffer, 0 ); while (!result.isDone()) { ProfitCalculator.calculateTax(); } Integer bytesRead = result.get(); System.out.println("Bytes read [" + bytesRead + "]" ); AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open( Paths.get("/Users/xuehaoyun/javawork/java-demo-project/out.txt" ), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE); CompletionHandler<Integer, Object> handler = new CompletionHandler<Integer, Object>() { @Override public void completed (Integer result, Object attachment) { System.out.println("Attachment: " + attachment + " " + result + " bytes written" ); System.out.println("CompletionHandler Thread ID: " + Thread.currentThread().getId()); } @Override public void failed (Throwable e, Object attachment) { System.err.println("Attachment: " + attachment + " failed with:" ); e.printStackTrace(); } }; System.out.println("Main Thread ID: " + Thread.currentThread().getId()); fileChannel.write(ByteBuffer.wrap("Sample" .getBytes()), 0 , "First Write" , handler); fileChannel.write(ByteBuffer.wrap("Box" .getBytes()), 0 , "Second Write" , handler); } } class ProfitCalculator { public ProfitCalculator () { } public static void calculateTax () { } }
关注【憨才好运】微信公众号,了解更多精彩内容⬇️⬇️⬇️