Java NIO Selector
Selector (选择器) 是一个 Java NIO 组件,它可以检查一个或多个 NIO 通道,并确定哪些通道已经准备好了相应的操作 (例如,读写操作)。 这就是单个线程可以管理多个通道,从而管理多个连接的原因。
为什么要用 Selector单个线程能够处理多个通道的优势在于你只需要少数的线程就可以处理许多的通道。 实际上,你只需使用一个线程就可以处理所有通道。对于操作系统而言,在线程之间切换是非常消耗资源的,并且每个线程也占用操作系统中的一些资源(例如:内存)。 因此,使用的线程越少越好。
但是有一点要记住,现代操作系统和多核 CPU 在多任务处理方面表现的越来越好了,因此随着时间的推移,多线程的开销会变得越来越小。 实际上,如果 CPU 有多个内核,如果不使用任务处理机制,就会导致 CPU 资源的浪费。不管怎么说,有关程序设计的讨论属于另外的范畴了,但在我们这里可以确切地说,你可以通过 Selector 使用单个线程来处理多个 Channels。示意图:
要使用选择器,我们不需要任何特殊设置。 我们需要的所有类都是核心的 java.nio 包,我们只需要导入我们需要 ...
Java NIO Buffer
Java NIO Buffer(缓冲区)通常与 NIO Channels(通道)一起使用。如我们 前面 所提到的那样,数据从 channel 中读取到 buffer 中,也可以从 buffer 写入到 channel 中。
Buffer 本质上是一个可以写入数据的内存块,并且之后你又可以从中再次读取数据。 此内存块包含在 NIO Buffer 对象中,该对象提供了一组方法,可以更轻松地使用内存块。
Buffer 基本用法使用 Buffer 去读取和写入数据时,通常要遵循以下 4 个步骤:
写入数据到 Buffer 中
调用 buffer.flip()
从 Buffer 中读取数据
调用 buffer.clear() 或 buffer.compact() 方法
将数据写入缓冲区时,缓冲区会跟踪你写入的数据量。一旦你需要从中读取数据时,你需要调用 flip() 方法,将缓冲区从写入模式切换成读取模式。在读取模式下,你可以读取到所有写入到缓冲区的数据。
一旦你读取到了所有的数据,你需要对缓冲区做一次清理(clear),让其为下一次写入数据做好准备。你可以采用以下两种方式:一是 ...
开发环境搭建清单
工欲善其事,必先利其器!
国外有位 工程师 在 Github 上整理了一份 Mac 上各种工具的安装指南,很是不错,强烈推荐:
https://github.com/sb2nov/mac-setup
环境
macOS High Sierra
version 10.13.6
适用人群
程序员
VPN 配置
翻墙,是每一位有追求的程序员的必备技能
指南:https://wangwei.one/posts/build-your-own-vpn-by-shadowsocks-or-rixcloud.html
开发环境Java
指南:https://github.com/sb2nov/mac-setup/tree/master/Java
Scala
指南:https://github.com/sb2nov/mac-setup/tree/master/Scala
Python
指南:https://github.com/sb2nov/mac-setup/tree/master/Python
Go
指南:https://github.com/sb2nov/mac-setup/tr ...
Java NIO Channel
Java NIO(New IO)是 Java 的替代 IO API(来自 Java 1.4),意味着替代标准 Java IO 和 Java Networking API。 Java NIO 提供了与标准 IO API 不同的使用 IO 的方式。
概述Java NIO 主要有以下三个核心组件:
Channels
Buffers
Selectors
除此之外,Java NIO 还有许多类和组件,但是 NIO 的核心 API 主要还是由 channel,buffer 和 selector 构成。其余的组件,如 Pipe 和 FileLock,只是与这三个核心组件一起使用的实用程序类,本篇文章先来来介绍 Channel。
通常,NIO 中的所有 IO 都以 Channel 开始,Channel(通道)有点像 Stream(流),但是它又有一些区别:
你既可以从 Channle 中读取数据,也可以向其写入数据。而 Stream 通常只能单向操作,要么读,要么写;
Channel 支持异步读取或写入数据;
数据从 Channel 中读取到 Buffer 中,从 Buffer 写入 ...
Linux、Mac 命令清单
整理一下自己平时用的比较多的一些工具和命令,便于后期查阅。
Linux 系统强烈推荐一个网站:http://cheat.sh/,能够查询所有 linux 系统相关的命令。
磁盘类12345# 查询系统磁盘剩余空间df -h# 查看当前空间文件的大小du -h
文件操作类本地操作
查询 path1 目录中的 java 文件:
1$ find path1 -type f -name "*.java"
从 path1 目录同步 java 文件到 path2 中,并且: 1) 同步目录结构;2) 删除源文件;3) 删除 path2 中的空文件夹
1$ rsync -arv --prune-empty-dirs --remove-source-files --include='*/' --include='*.java' --exclude='*' path1 path2
删除 path1 目录中所有的空文件夹:
1$ find path1 -type d -depth -empty -exec rmdir "{}" \;
远程操作
同步远程服务器上的文件到本地
1$ r ...
运维资料整理
收集整理一些有关运维相关的操作指南
Linux
Linux 逆向相关的学习资料:SEED LABs
cyberciti
Linux 私房菜
CentOS
防火墙配置
端口运行检查
Nginx
Nginx 安装
Let’s Encrypt 安装
Nginx 安全设置
Nginx 性能优化
Git 常用命令
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
Kindle 电子书转 Epub
趁着五一小长期,把自己的电子书库整理了一番,最主要的工作是将 Kindle 电子书合并到了 iBooks,实现了电子书的统一管理,方便 Spotlight 检索。用过 Kindle 和 iBooks 的同学,都应该清楚,这两者在阅读体验上没多大差别,但 iBooks 在做读书笔记,文字检索,终端数据同步等方面甩 Kindle 好几条街。
试想一下,如果没有检索功能,想要在几百本甚至是上千本书中,找到自己想要的信息,堪比大海捞针,信息检索俨然已成为我们这个时代的刚性需求,快速定位自己想要的知识和素材,将更多的注意力、更多的时间留给大脑去思考、去写作,才是最重要的事情。
今天这篇文章主要教你如何通过 Calibre 将 Kindle for Mac 中的电子书自动导入到 iBooks 中去。
使用 Kindle for Mac 将你在 amazon 上购买的电子书同步到本地目录(暂且命名为 path);
使用 Mac 自带的 Automator 自动 Copy 上一步 path 下的电子书到另外一个文件夹(暂且命名为 forder);
使用 Calibre 自动加载上一步 ...
Docker 化 Java 应用程序
当你对 Java 应用程序进行容器化操作时,Dockerfile 文件是你要用到的基础组件。
Dockerfile 指令介绍这部分内容请查看官方文档:https://docs.docker.com/engine/reference/builder/
为简单的 Java 工程编写 Dockerfile由于 官方 已经有了 OpenJDK 镜像,因此我们不需要为 OpenJDK 再写一个 Dockerfile。
我们这里来为 OracleJDK 创建一个 Dockerfile,这个官方并未提供。
编写 Dockerfile新建一个文件夹,并在其中新建一个名为 Dockerfile 的文件,里面内容如下:
12345678910111213141516171819202122232425262728293031# DockerfileFROM phusion/baseimage:0.9.17MAINTAINER Author Name <[email protected]>RUN echo "deb http://archive.ubuntu.com/ubuntu ...
Docker 常用命令整理
收集整理常用的 Docker 命令。
容器类查看 Docker 基础信息1234# 查看docker版本$ docker version# 显示docker系统的信息$ docker info
容器操作123456789101112131415161718192021222324252627# 查询运行中的容器$ docker ps # 查看所有的容器$ docker ps -a# 启动|停止|重启|杀死容器 anyesu-container$ docker start | stop | restart | kill anyesu-container# - docker rm [OPTIONS] CONTAINER [CONTAINER...]# 删除Id为c6e7471292e0的容器$ docker rm c6e7471292e0# - docker inspect [OPTIONS] NAME|ID [NAME|ID...]# 检视Id为97763bd57c69的容器$ docker inspect 97763bd57c69# - docker top CONTAI ...
个人博客搭建系列指南
说明本系列文章主要用来记录自己搭建博客的过程,分享出来给需要的朋友。有几点说明需要注意:
如果你是开发者或者说是对编程熟悉的朋友,可以直接忽略此声明;
如果是非开发者或是对命令行毫无概念,但是又想搭建自己博客的朋友,在依照此系列文章搭建博客时,务必保证一点:不要一上来就问这些命令行是干什么的,请先直接按照文章的引导一步一步去执行,直到把目标达成,建立起成就感。之后,再回过头去 Google 一下这些命令行是干什么的,先模仿再深究,才是正确的学习方式,否则很容易从入门到放弃。
此文章只适用于 Mac 环境。
虽说网上的有了很多关于如何通过 Hexo 搭建博客的指南,但我还是想用更加清晰明了的方式再做一遍梳理,希望我的文章能够给你简单、清晰的感觉。
准备
命令行工具 terminal 熟悉
前往 GitHub 注册一个账号,后面有用
打开 Terminal,下面的命令,安装后续要用到各种工具及环境。
1$ bash <(curl -s https://raw.githubusercontent.com/monfresh/laptop/master/laptop ...