-
Notifications
You must be signed in to change notification settings - Fork 19
JavaIO
目录 start
目录 end|2020-04-27 23:42|
Java1.0 到 Java1.3
同步阻塞式IO 但是能基于 BIO 手动实现 伪异步IO
Java1.4 引入; 同步非阻塞式IO, 虽然官方名称为 New IO, 民间称为
No-blocking IO
这个NIO和是基于操作系统NIO相关函数实现的, 所以称为No-blocking IO
// 进入Selector.open(); 方法可以看到
public static Selector open() throws IOException {
return SelectorProvider.provider().openSelector();
}
// 进入 provider() 方法
// 然后看到 sun.nio.ch.DefaultSelectorProvider.create();
public static SelectorProvider create() {
String var0 = (String)AccessController.doPrivileged(new GetPropertyAction("os.name"));
if (var0.equals("SunOS")) {
return createProvider("sun.nio.ch.DevPollSelectorProvider");
} else {
return (SelectorProvider)(var0.equals("Linux") ?
createProvider("sun.nio.ch.EPollSelectorProvider") : new PollSelectorProvider());
}
}
在Linux上使用的是 epoll, Windows 则是 poll
实现模型和操作系统的NIO也是一致的, 一个 Selector 注册多个 SelectionKey, SelectionKey 具有多个状态并且和Channel绑定
事件名 | 对应值 |
---|---|
服务端接收客户端连接事件 | SelectionKey.OP_ACCEPT(16) |
客户端连接服务端事件 | SelectionKey.OP_CONNECT(8) |
读事件 | SelectionKey.OP_READ(1) |
写事件 | SelectionKey.OP_WRITE(4) |
类似的思想还有定时器
- 需求: 实现一个 10s 后调用一个方法的定时器
- 简单:
Thread.sleep(10000);
但是这种方式下, 定时器和任务是一一对应的 - 复用模式: 一个线程睡眠很短的时间, 不停去检查 方法的时间到了没有, 到了就执行, 这样就只要一个线程就能处理多个任务
Java1.7 引入; 真正的异步非阻塞IO, NIO2.0
- 引入了新的异步通道的概念, 以及异步文件通道和异步套接字通道的实现
OutputStream InputStream
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
- FilterInputStream
- DataInputStream
- BufferedInputStream
序列化以及反序列化一个对象
TargetObject targetObject = new TargetObject("name");
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
ObjectOutputStream output = new ObjectOutputStream(byteOutput);
output.writeObject(targetObject);
ByteArrayInputStream byteInput = new ByteArrayInputStream(byteOutput.toByteArray());
ObjectInputStream input = new ObjectInputStream(byteInput);
TargetObject result = (TargetObject) input.readObject();
assertThat(result.getName(), equalTo("name"));
Reader Writer
Reader类的核心就是read()这个方法,由于这里直接操作InputStream进行read(),因此可以读取出2个字节,java中每两个字节转成一个字符。 这就是Reader可以读取字符的原因,只不过是利用InputStream先将字节读取出来,再按照一定的编码方式转码.
- maven项目,从resources下获取文件 例如 /a.xml
InputStream is = this.getClass().getResourceAsStream("/a.xml");
- 读取properties文件 :
new Properties().load(is);
- 按行读取文件
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
- 读取properties文件 :
Properties properties = new Properties();
File file = new File("something.properties");
FileInputStream fis = new FileInputStream(file);
properties.load(fis);
System.out.println(properties.getProperty("v"));
fis.close();
- 只要配置文件和打包的jar同级即可
读取resource目录下配置文件
ClassLoader classLoader = MainConfig.class.getClassLoader();
URL resource = classLoader.getResource("excel.main.yml");
if(resource!=null){
String path = resource.getPath();
}
- 这样也可以, 但是会有诡异的问题, 打包后运行是正常的, idea中运行就不正常,
new File("src/main/resources/excel.main.yml")
参考: Java IO: 网络 当两个进程之间建立了网络连接之后,他们通信的方式如同操作文件一样:利用InputStream读取数据,利用OutputStream写入数据。换句话来说,Java网络API用来在不同进程之间建立网络连接,而Java IO则用来在建立了连接之后的进程之间交换数据。
-
Buffer的基本用法: 使用Buffer读写数据一般遵循以下四个步骤:
- 写入数据到Buffer
- 调用flip()方法
- 从Buffer中读取数据
- 调用clear()方法或者compact()方法
-
当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。
-
一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:
- 调用clear()或compact()方法。
-
clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
-
【 Algorithm 】
-
【 Blog 】
-
【 C 】
-
【 Database 】
-
【 Distributed 】
-
【 FrontEnd 】
- 【 FrontEnd/Frame 】
- 【 FrontEnd/Node 】
- Font
- Hexo
- JavaScript
- LearnPS
- ResponseCode
- SVG
- ViewSolution
- extjs学习笔记
-
【 Functional 】
-
【 Go 】
-
【 Groovy 】
-
【 Java 】
- 【 Java/AdvancedLearning 】
- 【 JavaBasic 】
- 【 JavaCache 】
- 【 JavaCollection 】
- 【 JavaConcurrency 】
- 【 JavaMap 】
- Annotation
- ClassFile
- Collection
- Concurrency
- Deploy
- Exception
- ExtendsAndInterface
- Generics
- IO
- JDBC
- JDKAndJRE
- JMX
- JVM
- Java11
- Java7
- Java8
- JavaNetwork
- JavaReleaseVersion
- JavaWeb
- JvmPerformance
- MQ
- MultipleLanguage
- Proxy
- Reflection
- Serialize
- SyntaxAndType
- Thread
- WebPerformance
- 【 Java/Android 】
- 【 Java/Ecosystem 】
- 【 Java/MSA 】
- 【 Java/Spring 】
- 【 Java/TemplateEngine 】
- 【 Java/Test 】
- 【 Java/Tool 】
- 【 Java/thread 】
- AlibabaJavaStandard
- DesignPattern
- HashMap解析
- Java-NIO
- Java虚拟机
- Log
- MIS
- Quartz
- RESTful
- WebSocket学习笔记
- ZooKeeper学习笔记
- android学习笔记
- 【 Java/AdvancedLearning 】
-
【 Kotlin 】
-
【 Linux 】
- 【 Linux/Alpine 】
- 【 Linux/Arch 】
- 【 Linux/Base 】
- 【 Linux/Centos 】
- 【 Linux/Container 】
- 【 Linux/Debian 】
- 【 Linux/Tool 】
- JavaDevInit
- Linux系统学习
-
【 MyBlog 】
-
【 Python 】
- 【 Python/Tool 】
- Python
- PythonConcurrent
- PythonGUI
- PythonGame
- PythonNet
- PythonOffices
- PythonWeb
- Python基础
- Python核心学习
-
【 Reactive 】
-
【 Rust 】
-
【 Scala 】
-
【 Script 】
-
【 Skills 】
- 【 Skills/Application 】
- 【 Skills/CS 】
- 【 Skills/Cache 】
- 【 Skills/Councurrency 】
- 【 Skills/DevOps 】
- 【 Skills/Document 】
- 【 Skills/Ecology 】
- 【 Skills/Network 】
- 【 Skills/Search 】
- 【 Skills/SoftwareEngineering 】
- 【 Skills/Spider 】
- 【 Skills/Test 】
- 【 Skills/Vcs 】
- 【 Skills/Work 】
- AppManual
- CelebrityQuotes
- Miscellaneous
- Platform
- Problem
- Protobuf
- RegularExpression
- SoftwareDesignEngineer
- Website
-
【 Windows 】