I/O 即输入 / 输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出 。
这句话换到编程中就是 CPU 与外部存储器的输入输出,包括 CPU 本身的一,二,三级的缓存,内存,硬盘,网络,Usb 设备等等
在调用IO函数时,如果需要等待IO事件准备就绪才返回执行结果就是阻塞的IO调用,如果调用IO函数时,不需要IO事件准备就绪就可以返回结果就是非阻塞。
同步是指在非阻塞的前提下每次调用IO函数不一定会返回准备就绪的IO事件,所以需要不断地去调用IO函数查看是否有IO事件准备就绪。异步是指在非阻塞的前提下每次调用IO函数后,本线程不在接管IO事件的处理,会告诉程序如果你有准备就绪的IO事件你就去把你的IO事件交给其他线程的函数处理。
在早期的网络服务器中为了处理多个连接请求往往需要开辟多个线程,每个线程负责一个连接的处理,但是多线程需要进行CPU的上下文切换。而上下文切换需要处理文件句柄,这些操作是十分繁琐的,所以多线程并不是很好的解决方案。
一般软件都会有数据库,不论是 web 软件还是移动,桌面端软件,如果数据库是保存在硬盘的话,那么对数据库的增,删,改,查都是对硬盘 I/O 的操作
$result = query(select/insert/update.....);
query(select/insert/update.....,(err,result)=>{
if(err)return err;
// use result
});
你的应用也可能会使用缓存,比如 Redis,Memcached 意味你需要内存进行操作,即内存 I/O
$result = redis.set('test');
redis.set('test',(err,result)=>{
if(err)return err;
// use result
});
使用远程的数据需要用到网络 I/O
$result = request.post('url');
request.post('url',(err,result)=>{
if(err)return err;
// use result
});
编写 Node.js 的人理解 I/O 尤为重要,你对 Node.js 的理解更为深刻,Node.js 的接口都是很低级别的,比如 stream,buffer,process,但 PHP 不需要理解那么多底层
读取文件
public static void readByteFromFile() throws IOException{
File file= new File( "/tmp/rumenz.txt");
byte[] byteArray= new byte[( int) file.length()];
//因为是用字节流来读媒介,所以对应的是InputStream
//又因为媒介对象是文件,所以用到子类是FileInputStream
InputStream is= new FileInputStream( file);
int size= is.read( byteArray);
System. out.println( "大小:"+size +";内容:" +new String(byteArray));
is.close();
}