解释一下java.io.Serializable接口java
类经过实现 Java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将没法使其任何状态序列化或反序列化。编程
使用有缓冲的IO类,不要单独读取字节或字符设计模式
使用NIO和NIO 2或者AIO,而非BIO缓存
在finally中关闭流服务器
使用内存映射文件获取更快的IO多线程
Java BIO: 同步并阻塞,服务器实现模式为一个链接一个线程,即客户端有链接请求时服务器端就须要启动一个线程进行处理,若是这个链接不作任何事情会形成没必要要的线程开销,固然能够经过线程池机制改善。架构
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即当一个链接建立后,不须要对应一个线程,这个链接会被注册到多路复用器上面,因此全部的链接只须要一个线程就能够搞定,当这个线程中的多路复用器进行轮询的时候,发现链接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。BIO与NIO一个比较重要的不一样,是咱们使用BIO的时候每每会引入多线程,每一个链接一个单独的线程;而NIO则是使用单线程或者只使用少许的多线程,每一个链接共用一个线程。并发
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。app
IO 对 Java 应用的性能很是重要。理想状况下,你不该该在你应用的关键路径上避免 IO 操做。下面是一些你应该遵循的 Java IO 最佳实践:异步
使用有缓冲区的 IO 类,而不要单独读取字节或字符。
使用 NIO 和 NIO2
在 finally 块中关闭流,或者使用 try-with-resource 语句。
使用内存映射文件获取更快的 IO。
BIO(同步并阻塞)方式适用于链接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4之前的惟一选择,但程序直观简单易理解。
NIO(同步非阻塞)方式适用于链接数目多且链接比较短(轻操做)的架构,好比聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO( 异步非阻塞)方式使用于链接数目多且链接比较长(重操做)的架构,好比相册服务器,充分调用OS参与并发操做,编程比较复杂,JDK7开始支持。
面向流与面向缓冲. Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。Java IO面向流意味着每次从流中读一个或多个字节,直至读取全部字节,它们没有被缓存在任何地方。此外,它不能先后移动流中的数据。若是须要先后移动从流中读取的数据,须要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不一样。数据读取到一个它稍后处理的缓冲区,须要时可在缓冲区中先后移动。这就增长了处理过程当中的灵活性。
阻塞与非阻塞IO Java IO的各类流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据彻底写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,可是它仅能获得目前可用的数据,若是目前没有数据可用时,该线程能够继续作其余的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不须要等待它彻底写入,这个线程同时能够去作别的事情。线程一般将非阻塞IO的空闲时间用于在其它通道上执行IO操做,因此一个单独的线程如今能够管理多个输入和输出通道(channel)。
选择器(Selectors) Java NIO的选择器容许一个单独的线程来监视多个输入通道,你能够注册多个通道使用一个选择器,而后使用一个单独的线程来“选择”通道:这些通道里已经有能够处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
Java I/O库的整体设计是符合装饰模式和适配器模式的。如前所述,这个库中处理流的类叫流类。
装饰模式(Decorator):在由InputStream、OutputStream、Reader和Writer表明的等级结构内部,有一些流处理器能够对另外一些流处理器起到装饰做用,造成新的、具备改善了的功能的流处理器。
适配器模式(Adapter):在由InputStream、OutputStream、Reader和Writer表明的等级结构内部,有一些流处理器是对其余类型的流处理器的适配。这就是适配器的应用。