IO流
1、字符流
Reader--InputStreamReader-FileReader
Witer--OutputStreamWriter-FileWriter
2、 字节流
InputStream--FileInputStream-BufferedInputStream
OutputStream--FileOutputStream-BufferedOutputStream
3、流的关闭顺序
writer.close();
// 关闭写入流,同时会把缓冲区内容写入文件
fop.close();
// 关闭输出流,释放系统资源
reader.close();
// 关闭读取流
fip.close();
// 关闭输入流,释放系统资源
4、IO与NIO
- 面向Stream和面向Buffer
Java NIO和IO之间最大的区别是IO是面向流(Stream)的,NIO是面向块(buffer)的,所以,这意味着什么?
面向流意味着从流中一次可以读取一个或多个字节,拿到读取的这些做什么你说了算,这里没有任何缓存(这里指的是
使用流没有任何缓存,接收或者发送的数据是缓存到操作系统中的,流就像一根水管从操作系统的缓存中读取数据)
而且只能顺序从流中读取数据,如果需要跳过一些字节或者再读取已经读过的字节,你必须将从流中读取的数据先缓存起来。
面向块的处理方式有些不同,数据是先被 读/写到buffer中的,根据需要你可以控制读取什么位置的数据。这在处理的过程中
给用户多了一些灵活性,然而,你需要额外做的工作是检查你需要的数据是否已经全部到了buffer中,你还需要保证当有
更多的数据进入buffer中时,buffer中未处理的数据不会被覆盖
- 阻塞IO和非阻塞IO
所有的Java IO流都是阻塞的,这意味着,当一条线程执行read()或者write()方法时,这条线程会一直阻塞知道读取到了
一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情
java NIO的非阻塞模式(Java NIO有阻塞模式和非阻塞模式,阻塞模式的NIO除了使用Buffer存储数据外和IO基本没有区别)
允许一条线程从channel中读取数据,通过返回值来判断buffer中是否有数据,如果没有数据,NIO不会阻塞,因为不阻塞
这条线程就可以去做其他的事情,过一段时间再回来判断一下有没有数据
NIO的写也是一样的,一条线程将buffer中的数据写入channel,它不会等待数据全部写完才会返回,而是调用完
write()方法就会继续向下执行
- Selectors
Java NIO的selectors允许一条线程去监控多个channels的输入,你可以向一个selector上注册多个channel,
然后调用selector的select()方法判断是否有新的连接进来或者已经在selector上注册时channel是否有数据进入。
selector的机制让一个线程管理多个channel变得简单。
- NIO和IO对应用的设计有何影响
选择使用NIO还是IO做你的IO工具对应用主要有以下几个方面的影响
1、使用IO和NIO的API是不同的(废话)
2、处理数据的方式
3、处理数据所用到的线程数