IO流

流(stream):一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,对文件中的内容读和写的操作。

及时关闭不使用的流,避免造成资源流失,可能会导致内存溢出

1、数据流向

输入流: 负责数据的读取

例:从服务器读取数据,下载

InputStream抽象类(子类:FileInputStream/BufferedInputStream)

Reader抽象类(子类:InputStreamReader/BufferedReader)

输入流: 数据的写入

例:上传文件

OutputStream抽象类(子类:FileOutStream/BufferedOutputStream)

Writer抽象类(子类:OutputStreamWriter/BufferedWriter)

2、数据类型

字符流: 处理字符,根据码表映射字符,一次可能读多个字节 一次读入或读出16位二进制

Reader / Writer

字节流: 处理字节 一次读入或读出8位二进制

InputStream / OutputStream

总结

IO采用的是装饰模式,即采用处理流包装节点流的方式来达到代码通用性

处理流和节点流的区分方法:

节点流在新建时需要一个数据源(文件、网络)作为参数

作用:提高代码通用性,编写代码的便捷性,提高性能

处理流需要一个节点流作为参数

作用:对应抽象基类的实现类,他们都实现了抽象基类的基础读写方法Read()方法,若返回-1,代表已经读到数据源末尾

1、常用流

对文件进行操作:FileInputStream(字节输入流)

FileOutputStrean(字节输出流)

FileReader(字符输入流)

FileWriter(字符输出流)

对管道进行操作:PipedInputStream(字节输入流)

PipedOutStream(字节输出流)

PipedReader(字符输入流)

PipedWriter(字符输出流)

字节/字符数组:ByteArrayInputStream

ByteArrayOutputStream

CharArrayReader

CharArrayWriter是带缓冲区的处理流

作用:避免每次和硬盘打交道,提高数据访问的效率

数据流:DataInputStream

DataOutputStream

作用:可以直接输出float类型和long类型,提高了数据读写的效率

随机访问文件:RandomAccessFile

Buffered缓冲流:BufferedInputStream

BufferedOutputStream

CharArrayReader

CharArrayWriter实在内存中开辟了一个字节或字符数组

场景

文件传输(复制文件,删除文件或文件夹,文件改名等)

网络传输(从服务器进行数据读取,上传下载等)

硬盘数据的存储

NIO流

由来

传统的IO流有很多缺陷,尤其阻塞性加上磁盘写本来就慢,会导致cpu使用效率大大降低

所以,JDK1.4发布了NIO包,采用通道+缓冲区,使得新式的IO操作直接面向缓存区,并非阻塞的,提高程序的性能,提升cpu的利用率

例:计算机的处理速度和用户按键盘的速度

NIO的简述

主要有三大核心部分:

通道(Channel,是一个对象,可以通过他来读取和写入数据)

缓冲区(Buffer,是一个对象,包含一些要写入或者刚读出的数据)

选择区(Selector能检测到多个NIO通道,并能够知晓通道是否为读写事件做好准备,这样一个单独的线程可以管理多个channel,从而管理多个网络连接)

数据从通道读取到缓冲区中,或者缓冲区写入到通道中。

选择区用于监听多个通道事件(例:连接打开,数据到达),因此单个线程可以监听多个数据通道

为所有的原始类型(boolean类除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络,主要解决了多线程的问题

特性:分散与聚焦读取

文件锁定功能

网络异步IO

注意事项

SelectionKey用完一定要移除

SelectionKey.open()不是线程安全的,可能会抛出NullPointerException

如果一个selection thread已经在select方法上等待,那么这个时候如果有另一个线程调用channal.register方法的话,那么他将被blocking

selectionKay.cancel() BUG导致CPU占用100%

!!!使用JDK6 U4以上版本不会出现以上BUG(除SelectionKey.open()不是线程安全以外)

场景

用于管理线程的并发数 读取大文件速度快

1

IO/NIO区别

IONIO

面向流面向缓冲

阻塞IO非阻塞IO

使用流处理数据使用块处理数据

选择器

面向流与面向缓冲区

IO是面向流的,直至读取所有字节,他们没有被缓存在任何地方。此外,他不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将他缓存到一个缓冲区

阻塞与非阻塞IO

IO的各种流是阻塞的。意味着,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情

NIO是非阻塞模式的,当一个线程从某通道发送请求读取数据时,他仅能得到目前可用数据,如果目前没有数据可用,就什么都不做。而不是保持线程阻塞,所以直至数据可以读取之前,该线程可以继续做其他事情

选择器

IO没有选择器

NIO的选择器允许一个单独的线程来监视多个输入通道,可以注册多个通道使用一个选择器,然后使用一个单独的线程来”选择”通道

原文:https://blog.csdn.net/weixin_43517312/article/details/84026443

java当中各种流的应用场景_Java中有哪些流,常用流有哪些并有何特点和使用场景 NIO流,特性及使用时注意的事项 IO与NIO区别...相关推荐

  1. Java Review - 并发组件ConcurrentHashMap使用时的注意事项及源码分析

    文章目录 概述 案例 原因分析 修复 小结 概述 ConcurrentHashMap虽然为并发安全的组件,但是使用不当仍然会导致程序错误.我们这里通过一个简单的案例来复现这些问题,并给出开发时如何避免 ...

  2. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  3. java io和nio的区别_Java中IO和NIO的本质和区别

    导读热词 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1 ...

  4. Java与汽车_Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  5. java中io流实现哪个接口_第55节:Java当中的IO流-时间api(下)-上

    标题图 Java当中的IO流(下)-上日期和时间日期类:java.util.Date 系统时间:long time = System.currentTimeMillis();public class  ...

  6. Java中IO和NIO的本质和区别

    文章目录 简介 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序 ...

  7. dma和通道的区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是http://java.io包中的所有类,他们是从jav ...

  8. Java当中的IO流-时间api(下)-上

    Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...

  9. Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

最新文章

  1. 如何写新的Python OP
  2. Java基础5:final
  3. Velocity引擎导致jvm内存外内存泄露
  4. 阿里云AIoT全新工业和农业云端一体机深度产品,全链路数据化实现效率提升
  5. Windows下批量删除svn配置文件夹.svn
  6. TensorFlow(九)eval函数
  7. .NET中常见的内存泄露问题——GC、委托事件和弱引用
  8. DataGridView分页
  9. 通过模板生成Excel表格——XLSTransformer
  10. 使用135编辑器HTML样式,135编辑器滑动样式全教程!
  11. Activity获得焦点----onWindowFocusChanged
  12. Python 根据AIC准则定义向前逐步回归进行变量筛选(二)
  13. ERL(evolutionary reinforcement learning)
  14. UE4第三人称多人联机游戏开发02
  15. kali 安装volatility_volatility的使用
  16. java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP
  17. 路径中 / ./ ../ ../../ ../../../ 的含义
  18. Mysql给一个大表加一列_MySQL 大表添加一列的实现
  19. 日志分析篇---MSSQL日志分析
  20. 新版同城婚恋交友网源码

热门文章

  1. SAP 电商云 Spartacus UI CI 脚本分析
  2. SAP ABAP和Linux系统里如何检查网络传输的数据量
  3. 如何关掉Eclipse里对于Maven下载包的校验值检查
  4. campaign read in WebUI - Fiori is correct!
  5. /UI2/CL_NWBC_RUNTIME35 - GET_ROLES
  6. SAP UI5 Manifest fill logic
  7. 如何安装最新版本的ABAP Development tools
  8. Even for transaction data request, metadata is still needed as prerequisite
  9. SAP Marketing Cloud里的contact main facet是什么意思
  10. WordPress的cookie处理