2018 年 05 月 18 日
由于内容比较多, 我下面放的一部分是我更新在我的微信公众号上的链接, 微信排版比较好看, 更加利于阅读. 每一篇文章下面我都把文章的主要内容给列出来了, 便于大家学习与回顾.
Java 面试通关手册 (Java 学习指南) Github 地址: https://github.com/Snailclimb/Java_Guide
IO 流学习总结
一Java IO, 硬骨头也能变软 https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247483981&idx=1&sn=6e5c682d76972c8d2cf271a85dcf09e2&chksm=fd98542ccaefdd3a70428e9549bc33e8165836855edaa748928d16c1ebde9648579d3acaac10#rd
主要内容:
(1) 按操作方式分类结构图:
(2) 按操作对象分类结构图
二java IO 体系的学习总结 https://blog.csdn.net/nightcurtis/article/details/51324105
IO 流的分类:
按照流的流向分, 可以分为输入流和输出流;
按照操作单元划分, 可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流.
流的原理浅析:
java Io 流共涉及 40 多个类, 这些类看上去很杂乱, 但实际上很有规则, 而且彼此之间存在非常紧密的联系, Java Io 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的.
InputStream/Reader: 所有的输入流的基类, 前者是字节输入流, 后者是字符输入流.
OutputStream/Writer: 所有输出流的基类, 前者是字节输出流, 后者是字符输出流.
常用的 io 流的用法
三Java IO 面试题 http://www.imooc.com/article/details/id/24305
NIO 学习总结
一Java NIO 概览 https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247483956&idx=1&sn=57692bc5b7c2c6dfb812489baadc29c9&chksm=fd985455caefdd4331d828d8e89b22f19b304aa87d6da73c5d8c66fcef16e4c0b448b1a6f791#rd
主要内容:
NIO 简介:
Java NIO 是 java 1.4, 之后新出的一套 IO 接口 NIO 中的 N 可以理解为 Non-blocking, 不单纯是 New.
NIO 的特性 / NIO 与 IO 区别:
1)IO 是面向流的, NIO 是面向缓冲区的;
2)IO 流是阻塞的, NIO 流是不阻塞的;
3)NIO 有选择器, 而 IO 没有.
读数据和写数据方式:
从通道进行数据读取 : 创建一个缓冲区, 然后请求通道读取数据.
从通道进行数据写入 : 创建一个缓冲区, 填充数据, 并要求通道写入数据.
NIO 核心组件简单介绍
- Channels
- Buffers
- Selectors
二Java NIO 之 Buffer(缓冲区) https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247483961&idx=1&sn=f67bef4c279e78043ff649b6b03fdcbc&chksm=fd985458caefdd4e3317ccbdb2d0a5a70a5024d3255eebf38183919ed9c25ade536017c0a6ba#rd
主要内容:
Buffer(缓冲区) 介绍:
Java NIO Buffers 用于和 NIO Channel 交互. 我们从 Channel 中读取数据到 buffers 里, 从 Buffer 把数据写入到 Channels;
Buffer 本质上就是一块内存区;
一个 Buffer 有三个属性是必须掌握的, 分别是: capacity 容量, position 位置, limit 限制.
Buffer 的常见方法
- Buffer clear()
- Buffer flip()
- Buffer rewind()
- Buffer position(int newPosition)
Buffer 的使用方式 / 方法介绍:
分配缓冲区 (Allocating a Buffer):
ByteBuffer buf = ByteBuffer.allocate(28);// 以 ByteBuffer 为例子
写入数据到缓冲区 (Writing Data to a Buffer)
写数据到 Buffer 有两种方法:
1. 从 Channel 中写数据到 Buffer
int bytesRead = inChannel.read(buf); //read into buffer.
2. 通过 put 写数据:
buf.put(127);
Buffer 常用方法测试
说实话, NIO 编程真的难, 通过后面这个测试例子, 你可能才能勉强理解前面说的 Buffer 方法的作用.
三Java NIO 之 Channel(通道) https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247483966&idx=1&sn=d5cf18c69f5f9ec2aff149270422731f&chksm=fd98545fcaefdd49296e2c78000ce5da277435b90ba3c03b92b7cf54c6ccc71d61d13efbce63#rd
主要内容:
Channel(通道) 介绍
通常来说 NIO 中的所有 IO 都是从 Channel(通道) 开始的.
NIO Channel 通道和流的区别:
FileChannel 的使用
SocketChannel 和 ServerSocketChannel 的使用
DatagramChannel 的使用
Scatter / Gather
Scatter: 从一个 Channel 读取的信息分散到 N 个缓冲区中 (Buufer).
Gather: 将 N 个 Buffer 里面内容按照顺序发送到一个 Channel.
通道之间的数据传输
在 Java NIO 中如果一个 channel 是 FileChannel 类型的, 那么他可以直接把数据传输到另一个 channel.
transferFrom() :transferFrom 方法把数据从通道源传输到 FileChannel
transferTo() :transferTo 方法把 FileChannel 数据传输到另一个 channel
四Java NIO 之 Selector(选择器) https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247483970&idx=1&sn=d5e2b133313b1d0f32872d54fbdf0aa7&chksm=fd985423caefdd354b587e57ce6cf5f5a7bec48b9ab7554f39a8d13af47660cae793956e0f46#rd
主要内容:
Selector(选择器) 介绍
Selector 一般称 为选择器 , 当然你也可以翻译为 多路复用器 . 它是 Java NIO 核心组件中的一个, 用于检查一个或多个 NIO Channel(通道) 的状态是否处于可读, 可写. 如此可以实现单线程管理多个 channels, 也就是可以管理多个网络链接.
使用 Selector 的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程, 避免了线程上下文切换带来的开销.
Selector(选择器) 的使用方法介绍
Selector 的创建
Selector selector = Selector.open();
注册 Channel 到 Selector(Channel 必须是非阻塞的)
- channel.configureBlocking(false);
- SelectionKey key = channel.register(selector, Selectionkey.OP_READ);
SelectionKey 介绍
一个 SelectionKey 键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系.
从 Selector 中选择 channel(Selecting Channels via a Selector)
选择器维护注册过的通道的集合, 并且这种注册关系都被封装在 SelectionKey 当中.
停止选择的方法
wakeup() 方法 和 close() 方法.
模板代码
有了模板代码我们在编写程序时, 大多数时间都是在模板代码中添加相应的业务代码.
客户端与服务端简单交互实例
五 Java NIO 之拥抱 Path 和 Files https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&tempkey=OTU3X2k5RHFXbjA4MHhzcC9DN0F6TU1OdlgzVno5ZkhYV29GSEZURmktTWJRUkFib2FKNnRwZGE2RHdPTDJMUXl5cVVwMVJWUUVodU4zWlg4YUw1ZURPVXRXakJLcXhDN0VaenkyYjdJdm9uRVJrcWROcGh3d2c2NWNsQjFNWld5N2lNNmxVUWJ1enlad1dUNVoyNFBPaEJyU05KMmpaZEJCLVFSUWllbGd+fg==&chksm=7d9854254aefdd33a40a4bad918bdc54cc64450bc3d4597ee53151fdedcdbd2ce722fc8aca4d#rd
主要内容
一 文件 I/O 基石: Path:
创建一个 Path
File 和 Path 之间的转换, File 和 URI 之间的转换
获取 Path 的相关信息
移除 Path 中的冗余项
二 拥抱 Files 类:
Files.exists() 检测文件路径是否存在
Files.createFile() 创建文件
Files.createDirectories() 和 Files.createDirectory() 创建文件夹
Files.delete() 方法 可以删除一个文件或目录
Files.copy() 方法可以吧一个文件从一个地址复制到另一个位置
获取文件属性
遍历一个文件夹
Files.walkFileTree() 遍历整个目录
来源: https://juejin.im/post/5af79bcc51882542ad771546