Day18 IO
1 概念
NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。
在Java API中提供了两套NIO,
一套是针对标准输入输出NIO
另一套就是网络编程NIO
1.1 NIO和IO的主要区别
1、面向流与面向缓冲
Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
2、阻塞与非阻塞IO
Java IO的各种流是阻塞的。这意味着,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,非阻塞读:使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
3、选择器(Selectors)
Java NIO 的选择器 允许一个 单独的线程 来监视 多个输入通道,你可以注册多个通道使用一个选择器,然后使用 一个单独的线程 来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
1.2 NIO和IO如何影响应用程序的设计
无论您选择IO或NIO工具箱,可能会影响您应用程序设计的以下几个方面:
对NIO或IO类的API调用。
数据处理。
用来处理数据的线程数。
1、API调用
当然,使用NIO的API调用时看起来与使用IO时有所不同,但这并不意外,因为并不是仅从一个InputStream逐字节读取,而是数据必须先读入缓冲区再处理。
2、数据处理
使用纯粹的NIO设计相较IO设计,数据处理也受到影响。
1.3 分类
按处理数据类型不同,分为字节流和字符流
按数流向的不同,分为输入流和输出流。(入和出师相对于内存来讲的)
按功能不同,分为节点流和处理流
节点流:直接对数据源操作
处理流:对其他流进行处理
2 抽象类
四大抽象类如下
**3 文件流 **
3.1 InputStream
字节输入流如下
操作:先找到文件的地址
1.相对地址:以当前文件所在目录开始
2.绝对地址:当前文件系统的根目录为准
./表示当前目录 …/表示是上级目录
方法重载:
read():读取下一个字节的值,并返回,如果到达文件末尾返回-1
read(byte[]bytes):可以传入一个字节数组,返回当前次读取到的字节个数如果到达文件未尾,返回-1
不能直接把字节数值转换为字符串;因为如果字节数组最后一次存储时小于剩余文件总的字节数就会把上次保存的也输出,如果字节数组第一次就大于剩余文件字节数就会把后面的0也输出,所以应该读多少就输出多少
String string1=new String(要转化的字符数组,开始的位置,转多少)
3.2 OutputStream
输出流如果目标文件不存在会自动创建该文件,注意不会创建目录,如果目录不存在就会报错
输出流的步骤:1打开流 2写出(追加写入/覆盖写入)3刷缓存(清除没有的数据)4关闭
构造方法:
FileOutputStream(String):只传递需要写出的文件路径,默认覆盖写出FileOutputStream(String,boolean):只传递需要写出的文件路径第二个参数如果为true 就是追加写出,false是覆盖写出。
写出方法:
write(int b)写出一个字节
write(byte[]bytes):把一个数组内容都写出write(bytel]bytes,int off,int length):写出数组中一部分,起始值,个数
3.3 Reader
FileReader:字符输入流,可以解决输入数据汉字的乱码问题
一般用于纯文本文件,像压缩包,图片,视频音乐等还是要使用字节,使用字符会出现问题
3.4 Writer
writer是字符输出流
用法和字节输出流一样,不过字符输出流写出的是字符数组和字符串如