欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO流

程序员文章站 2022-04-08 22:16:58
...

IO流

字符流

Reader--InputStreamReader-FileReader
Witer--OutputStreamWriter-FileWriter

字节流

InputStream--FileInputStream-BufferedInputStream
OutputStream--FileOutputStream-BufferedOutputStream

流的关闭顺序

    writer.close();
    // 关闭写入流,同时会把缓冲区内容写入文件

    fop.close();
    // 关闭输出流,释放系统资源

    reader.close();
    // 关闭读取流

    fip.close();
    // 关闭输入流,释放系统资源

IO与NIO

  1. 面向数据流和面向缓冲区
Java NIO和IO之间最大的区别是IO是面向流(Stream)的,NIO是面向块(buffer)的,所以,这意味着什么?

面向流意味着从流中一次可以读取一个或多个字节,拿到读取的这些做什么你说了算,这里没有任何缓存(这里指的是
使用流没有任何缓存,接收或者发送的数据是缓存到操作系统中的,流就像一根水管从操作系统的缓存中读取数据)
而且只能顺序从流中读取数据,如果需要跳过一些字节或者再读取已经读过的字节,你必须将从流中读取的数据先缓存起来。

面向块的处理方式有些不同,数据是先被 读/写到buffer中的,根据需要你可以控制读取什么位置的数据。这在处理的过程中
给用户多了一些灵活性,然而,你需要额外做的工作是检查你需要的数据是否已经全部到了buffer中,你还需要保证当有
更多的数据进入buffer中时,buffer中未处理的数据不会被覆盖
  1. 阻塞IO和非阻塞IO
所有的Java IO流都是阻塞的,这意味着,当一条线程执行read()或者write()方法时,这条线程会一直阻塞知道读取到了
一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情

java NIO的非阻塞模式(Java NIO有阻塞模式和非阻塞模式,阻塞模式的NIO除了使用Buffer存储数据外和IO基本没有区别)
允许一条线程从channel中读取数据,通过返回值来判断buffer中是否有数据,如果没有数据,NIO不会阻塞,因为不阻塞
这条线程就可以去做其他的事情,过一段时间再回来判断一下有没有数据

NIO的写也是一样的,一条线程将buffer中的数据写入channel,它不会等待数据全部写完才会返回,而是调用完
write()方法就会继续向下执行
  1. 选择
Java NIO的selectors允许一条线程去监控多个channels的输入,你可以向一个selector上注册多个channel,
然后调用selectorselect()方法判断是否有新的连接进来或者已经在selector上注册时channel是否有数据进入。
selector的机制让一个线程管理多个channel变得简单。
  1. NIO和IO对应用的设计有何影响
选择使用NIO还是IO做你的IO工具对应用主要有以下几个方面的影响

1、使用IO和NIO的API是不同的(废话)

2、处理数据的方式

3、处理数据所用到的线程数

相关标签: