- 流
[外链图片转存失败(img-CYWK5Fw9-1563958434835)(查漏-javaIO_files/1.jpg)]
输入流 InputStream类字节输入流 Unicode 双字节
public abstract class InputStream implements Closeable
[外链图片转存失败(img-im0VHuSw-1563958434842)(查漏-javaIO_files/2.jpg)]
[外链图片转存失败(img-4KEAUopA-1563958434848)(查漏-javaIO_files/3.jpg)]
输入流 Reader类 字符输出流
public abstract class Reader implements Readable, Closeable {
[外链图片转存失败(img-32TgqVGg-1563958434849)(查漏-javaIO_files/4.jpg)]
[外链图片转存失败(img-3UNT8hpF-1563958434850)(查漏-javaIO_files/5.jpg)]
输出流 OutputStream类字节输出流 Unicode 双字节
public abstract class OutputStream implements Closeable, Flushable {
[外链图片转存失败(img-pdoSsCg0-1563958434852)(查漏-javaIO_files/6.jpg)]
[外链图片转存失败(img-RqNofP6p-1563958434853)(查漏-javaIO_files/7.jpg)]
输出流 Writer 字符输出流
[外链图片转存失败(img-TRovgiaJ-1563958434855)(查漏-javaIO_files/9.jpg)]
[外链图片转存失败(img-CFARdxtB-1563958434856)(查漏-javaIO_files/8.jpg)] - File
-
public File(File parent, String child)
public File(File parent, String child) {
if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.path.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
this.path = fs.resolve(parent.path,
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
} -
public File(String pathname)
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
} -
public File(String parent, String child)
public File(String parent, String child) {
if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
this.path = fs.resolve(fs.normalize(parent),
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
} -
public File(URI uri)
public File(URI uri) {// Check our many preconditions
if (!uri.isAbsolute())
throw new IllegalArgumentException(“URI is not absolute”);
if (uri.isOpaque())
throw new IllegalArgumentException(“URI is not hierarchical”);
String scheme = uri.getScheme();
if ((scheme == null) || !scheme.equalsIgnoreCase(“file”))
throw new IllegalArgumentException(“URI scheme is not “file””);
if (uri.getAuthority() != null)
throw new IllegalArgumentException(“URI has an authority component”);
if (uri.getFragment() != null)
throw new IllegalArgumentException(“URI has a fragment component”);
if (uri.getQuery() != null)
throw new IllegalArgumentException(“URI has a query component”);
String p = uri.getPath();
if (p.equals(""))
throw new IllegalArgumentException(“URI path component is empty”);// Okay, now initialize
p = fs.fromURIPath§;
if (File.separatorChar != ‘/’)
p = p.replace(’/’, File.separatorChar);
this.path = fs.normalize§;
this.prefixLength = fs.prefixLength(this.path);
}
[外链图片转存失败(img-i8IWiRsL-1563958434858)(查漏-javaIO_files/10.jpg)]
[外链图片转存失败(img-MIbzepBH-1563958434860)(查漏-javaIO_files/11.jpg)]
=======输入输出是以程序为主语说的=
1.程序输出到文件
2.文件输入到程序
3.字节读取可能产生乱码 ===中文
4.字符读取避免乱码 ===中文
缓存是IO的一种性能优化 增加了IO流的内存缓存区 使skip()、mark()、reset()成为可能
***读取文件过程
[外链图片转存失败(img-GiZkaRQp-1563958434862)(查漏-javaIO_files/12.jpg)]
网络IO(tomcat)
/*
1.阻塞:在调用结果返回前,当前线程会被挂起,并在得到结果后返回
2.非阻塞:如不能立刻得到结果,该调用不会阻塞当前线程。因此对于非阻塞情况,调用者需要定时轮询查看结果
3.同步:通信机制 调用者等待返回结果
4.非同步:通信机制 被调用者通过回调等形式通知调用者
*/
BIO ===》阻塞式IO
NIO ===》
NIO2 ===》支持AIO(异步IO)
ARP ===》 Apache可移植运行库
- BIO
在网络通信中(TCP/IP),需要通过Socket在客户端和服务端建立双向链接以实现通信
tomcat 异步处理
JDK1.4之后BIO的API已经以NIO为基础重新实现,因此即使采用流的方式进行读写,性能较之旧版也有很大的提升 - NIO
高速、面向块的I/O。 不编写本地代码的情况下利用底层优化,这是BIO所无法做到的。
与BIO相比,NIO有几个新概念
1.通道
通道(Channel)是对BIO的模拟,到任何目的地(或来自。。。)的所有地方的所有数据都必须通过一个通道对象。
通道与流的不同之处在于通道是双向的。流只是在一个方向上移动(要么读,要么写)。通道双向(用于读写或同时用于读写)。因为通道是双向的,所以它可以比流更好地反映底层操作系统的真实情况
2.缓存区
尽管通道用于读写数据,但是我们却并不直接操作通道进行读写。而是通过缓冲区(Buffer)完成。缓冲区实质上是一个容器对象。发送给通道的所有对象都必须先放到缓冲区中,同样从通道中读取的任何数据都要先读到缓冲区中。
缓冲区体现了NIO与BIO的一个重要区别。在BIO中,读写可以直接操作流对象。 ===
缓冲区通常是一个字节数组,也可以使用其他类型的数组。但是缓冲区又不仅仅是一个数组,它提供了对数据的结构访问,而且还可以跟踪系统的读写进程。
3.选择器
Java NIO提供了选择器组件(Selector)用于同时检测多个通道的事件以实现异步I/O。我们将感兴趣的事件注册到Selector上,当事件发生时可以通过Selector获得事件发生的通道,并进行相关操作。
异步I/O的一个优势在于,它允许你同时根据大量的输入、输出执行I/O操作。同步I/O一般要借助于轮询,或者创建许许多多的线程以处理大量的链接。使用异步I/O,你可以监听任意数量的通道事件,不必轮询,也不必启动额外的线程。 - NIO2 对异步IO的支持(AIO)
1.通道 JDK7提高三个通道实现类用于网络IO。
2.缓冲区同上
3.Future与CompletionHandler - ARP
的链接。使用异步I/O,你可以监听任意数量的通道事件,不必轮询,也不必启动额外的线程。 - NIO2 对异步IO的支持(AIO)
1.通道 JDK7提高三个通道实现类用于网络IO。
2.缓冲区同上
3.Future与CompletionHandler - ARP
主要功能模块:内存分配及内存池、原子操作、文件I/O、锁、内存映射、哈希表、网络I/O、轮询、进程及线程操作