网站如何编辑,天津住房和城乡建设建造师网站,做网站代码编辑工具,怎样防止别人利用自己电脑做网站一、流的概念
“对语言设计人员来说#xff0c;创建好的输入#xff0f;输出系统是一项特别困难的任务。” ――《Think in Java》
无论是系统、还是语言的设计中IO的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素#xff0c;我们不仅仅要考虑文件、…一、流的概念
“对语言设计人员来说创建好的输入输出系统是一项特别困难的任务。” ――《Think in Java》
无论是系统、还是语言的设计中IO的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素我们不仅仅要考虑文件、控制台、网络、内存等不同的种类而且要处理大量的不同的读取方式如顺序读取、随机读取二进制读取、字符读取按行读取、按字符读取……
为了解决输入/输出问题创建了Java IO体系并且提出了流的概念。
如何理解流的概念联想一下现实生活中水流自来水公司通过管道将水送入千家万户数据相当于现实生活中的水JAVA中的流相当于现实生活中的管道。在Java中流代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象流的作用是数据传输根据数据传输特性将流抽象为各种类方便更直观的进行数据操作。
ps:当面试问到你对流的理解时可以拿生活中的自来水来做对比或者从面对对象的角度来讨论。
二、Java IO体系
1、基于字节的IO操作 2、基于字符的IO操作 从上图可以看到整个Java IO体系都是基于字节流(InputStream/OutputStream) 和字节流(Reader/Writer)作为基类根据不同的数据载体或功能派生出来的。
3、分类
按照数据单位来分字节流、字符流
按照方向分输入流、输出流
按照功能来分节点流、处理流直接与底层文件资源连接的称为节点流,对节点流进行包装从而完成更高级功能的称为处理流,处理流在构造时须为其指定一个节点流.
三、扩展
下面我们来看一下JDK1.8的源代码
3.1、源代码
3.1.1、InputStream public abstract int read() throws IOException;//从输入流中读取一个字节值0-255并返回子类必须提供此方法的实现如果到达了流的末尾则返回-1public int read(byte b[]) throws IOException {return read(b, 0, b.length);}/*** 实际上还是调用read()方法将读到的内容放到字节数组中b返回-1已读到流的末尾或者实际读取的字节数*/public int read(byte b[], int off, int len) throws IOException {if (b null) {throw new NullPointerException();} else if (off 0 || len 0 || len b.length - off) {throw new IndexOutOfBoundsException();} else if (len 0) {return 0;}int c read();if (c -1) {return -1;}b[off] (byte)c;int i 1;try {for (; i len ; i) {c read();if (c -1) {break;}b[off i] (byte)c;}} catch (IOException ee) {}return i;}/*** 跳过n个字节实际上还是调用read()方法所以read()方法很关键返回实际跳过的字节数*/public long skip(long n) throws IOException {long remaining n;int nr;if (n 0) {return 0;}int size (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);byte[] skipBuffer new byte[size];while (remaining 0) {nr read(skipBuffer, 0, (int)Math.min(size, remaining));if (nr 0) {break;}remaining - nr;}return n - remaining;}
上面的源码和注释分析了read方法和skip的作用。
3.1.2、OutputStream public abstract void write(int b) throws IOException;//将指定字节写入输出流只会写入低8位高的24位会被忽略因为一个字节只有8个bit位public void write(byte b[]) throws IOException {write(b, 0, b.length);}public void write(byte b[], int off, int len) throws IOException {if (b null) {throw new NullPointerException();} else if ((off 0) || (off b.length) || (len 0) ||((off len) b.length) || ((off len) 0)) {throw new IndexOutOfBoundsException();} else if (len 0) {return;}for (int i 0 ; i len ; i) {write(b[off i]);}}
3.1.3、Reader abstract public int read(char cbuf[], int off, int len) throws IOException;//将字符读入数组此方法可能会发生阻塞返回-1或者读入的字符数public int read(char cbuf[]) throws IOException {return read(cbuf, 0, cbuf.length);}/*** 将字符读入字符缓冲区*/public int read(java.nio.CharBuffer target) throws IOException {int len target.remaining();char[] cbuf new char[len];int n read(cbuf, 0, len);if (n 0)target.put(cbuf, 0, n);return n;}/*** 读取单个字符*/public int read() throws IOException {char cb[] new char[1];if (read(cb, 0, 1) -1)return -1;elsereturn cb[0];}3.1.4、Writer abstract public void write(char cbuf[], int off, int len) throws IOException;//将字符数组的一部分写入到输出流/*** 将指定字符写入到输出流*/public void write(int c) throws IOException {synchronized (lock) {if (writeBuffer null){writeBuffer new char[WRITE_BUFFER_SIZE];}writeBuffer[0] (char) c;write(writeBuffer, 0, 1);}}/*** 将字符数组的所有内容写入到输出流*/public void write(char cbuf[]) throws IOException {write(cbuf, 0, cbuf.length);}/*** 将字符串的所有内容写入到输出流*/public void write(String str) throws IOException {write(str, 0, str.length());}/*** 将字符串的部分内容写入到输出流*/public void write(String str, int off, int len) throws IOException {synchronized (lock) {char cbuf[];if (len WRITE_BUFFER_SIZE) {if (writeBuffer null) {writeBuffer new char[WRITE_BUFFER_SIZE];}cbuf writeBuffer;} else { // Dont permanently allocate very large buffers.cbuf new char[len];}str.getChars(off, (off len), cbuf, 0);write(cbuf, 0, len);}}
3.2、NIO
对IO的概念有基本的了解之后我们再来了解一下JAVA中类似的概念NIO。由于本文主要介绍IO的概念所以对NIO的介绍会很浅显后面会有专门的文章来介绍NIO。
NIO( New Input/ Output)一种同步非阻塞的IO模型。同步是指线程不断轮询IO事件是否就绪非阻塞是指线程在等待IO的时候可以继续其他任务。同步的核心是SelectorSelector替代了线程本身去轮询IO事件避免了阻塞的同时也减少了不必要的线程消耗非阻塞的核心是通道和缓冲区当IO事件就绪时可以通过写到缓冲区保证IO的成功而无需线程阻塞式的等待。
NIO和IO的主要区别
IONIO面向流面向缓冲阻塞IO非阻塞IO无选择器
关于通道、缓冲区和选择器的实现参考https://blog.csdn.net/forezp/article/details/88414741
参考
https://blog.csdn.net/qq_36962144/article/details/79815457https://www.cnblogs.com/ylspace/p/8128112.htmlhttps://www.cnblogs.com/fysola/p/6123947.html