zoukankan      html  css  js  c++  java
  • Java中IO

    Java中IO

    什么是IO

    这里这个I指的是input,而这个O指的则是output,对于IO的认识就是输入输出。在讨论IO的时候,流则是关键中的关键

    • 按数据流向分类
      输入流和输出流

    • 按处理的数据类型分类
      字节流和字符流

      • 字节流

        对于字节流,它是用来操作我们的二进制文件的,因为字节流可以操作的数据是8位,也就是一字节,我们知道1 byte = 8bit,而像一些数字和字母等都是占一个字节,包括平常见到的图片,音视频等,这就可以使用字节流来操作,但是对于中文的话就不能使用字节流了

      • 字符流

        因为一个汉字是占两个字节,那么就是16位,字节流是操作不了的,而字符流则可以操作16位,所以对于文本文件则常用字符流操作了

    IO流的分类

    • 输入流和输出流
      按照流的流向来分,可以分为输入流和输出流。输入,输出都是从程序运行所在内存的角度来划分的。
      输入流:只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类。
      输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类

    • 字节流和字符流
      字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
      字节流操作的数据单元是8位字节,由InputStream和OutputStream作为基类。
      字符流操作的数据单元是16为的字符,由Reader和Writer作为基类(提供了转换流)

    • 节点流和处理流
      按照流的角色来分,可以分为节点流和处理流。
      节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
      处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流

    AIO/NIO/BIO

    AIO 是彻底的异步非阻塞。NIO 是同步非阻塞通信。BIO 是同步阻塞。

    假设有这么一个场景,有一排水壶(客户)在烧水。同步说的是线程同步,阻塞说的是水壶阻塞。

    AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
    NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
    BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。

    BIO、NIO、AIO适用场景分析:

    • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
    • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
    • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

    NIO 同步非阻塞

    NIO将多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下处理多个客户端请求。

    NIO三个核心对象:通道(Channel)、缓冲区(Buffer)和选择器(Selector)

    具体说就是Selector会不断轮询注册在其上的Channel,如果某个Channel上有新的TCP连接,读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectorKey可以获取就绪Channel的集合,进行后续I/O操作。

    序列化

    序列化的原本意图是希望对一个Java对象作一下“变换”,变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变换成字节序列也更便于网络运输和传播,所以概念上很好理解:

    • 序列化:把Java对象转换为字节序列。
    • 反序列化:把字节序列恢复为原先的Java对象。

    什么时候进行序列化

    • 当你想把内存中的对象写入到硬盘时
    • 当你想用套接字在网络上传输对象时
    • 当你想通过RMI调用对象时(RMI是什么东西?):RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象。

    序列化需要注意的事项

    • 序列化只保存对象的状态,而不管对象的方法。被static修饰的字段是不会被序列化的
    • 凡是被transient修饰符修饰的字段也是不会被序列化的
    • 当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。
    • 当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化,利用对象序列化可以进行对象的"深复制"。

    参考资料

  • 相关阅读:
    最小生成树与Prim算法
    图的存储——链式前向星
    *转载 Tarjan有向图详解
    图的连通性算法-Kosaraju
    最小花费8597
    PDF提取图片(错误纠正)
    字符串删除指定符号(不限位置)
    python迭代有限制,突破限制
    storm资源冲突
    storm单节点问题(转载)
  • 原文地址:https://www.cnblogs.com/renxiuxing/p/15177929.html
Copyright © 2011-2022 走看看