注意:

此文侧重讲解Java的IO主要体系,至于具体API功能会在后面的文章详细讲解。

I/O以及I/O流的定义:

  1. I/O实际上是Input/Output,也就是输入/输出,输入指的是从存储设备中读取数据,比如从磁盘读取数据到内存中;输出指的是把数据回写到存储设备中,比如把内存中的数据回写到磁盘中。
  2. 流是一种抽象概念,可以类比成水流,而数据类比成水,数据流的传递可以类比成水流的传输,是一种无结构化的数据传递。

Java中的I/O

I/O的数据来源有:磁盘、内存、网络、键盘等。

  1. 输入流:Java的输入流是指从数据来源读取数据到内存的流。比如从磁盘读取数据到内存的流,从网络读取到内存的流,从内存读取到内存的流等都是输入流。
  2. 输出流:Java的输出流是指从内存回写到数据源的流。比如从内存输出到网络的流,从内存回写到磁盘的流等等都是输出流。

Java的I/O体系:

java中的IO流的类有很多,但是实际上核心的体系只有File、InputStream、OutputStream、Writer、Reader。

  1. File类:Java对文件的抽象,是为文件或者目录进行删除、重命名,移动、创建等很多操作而设计的一个类。

IO流的分类:
IO流按照操作的数据单元可以分为字节流跟字符流:字节流与字符流的区别

  1. 字节流:操作的数据单元是8位的字节。以InputStream(输入流)、OutputStream(输出流)作为抽象基类。这种流的API操作的数据单位是字节。适用于任何数据的传输。
  2. 字符流:操作的数据单元是字符,以Writer(输出)、Reader(输入)作为抽象类。这种流的API操作的数据单位是字符,会把若干个字节按照一定的编码规则编码成字符。只适用于文本类数据的传输,不能用于类似图片,音频等二进制数据的传输。
下图是一个JAVA I/O体系的脑图:

JAVA IO的原理:

文件读取原理图:(这是基于文件的IO,网络IO后面会有):

说明:
我们平时的应用进程是运行在用户态里面,对硬件的操作要在内核态中通过系统调用实现。而用户与内核态的切换要消耗系统资源。区分用户态和内核态主要是为了系统的安全性考虑。内核态会拥有用户态不具有的权限。

原理图说明:

  1. 用户进程调用输入流的read方法,然后尝试读取用户缓冲区的数据,如果能读取到数据,直接返回,如果读取不到就进入第二步。
  2. 如果用户缓冲区读取不到数据,就调用read0方法,从内核缓冲区读取数据到用户缓冲区。
  3. 调用read0方法后,切换到内核态,内核通过系统调用发送指令给磁盘控制器,要求读取磁盘的数据到内核缓冲区。
  4. 磁盘控制器调用DMA,从磁盘中读取数据到内核缓冲区。
  5. 数据读取完毕后,用户进程从内核缓冲区读取数据到用户缓冲区。
  6. 然后从用户缓冲区读取数据返回。

文件写入原理流程图:

体系的详解文章:

Java IO之File类详解

Java I/O体系之OutputStream和InputStream详细讲解

Java I/O体系之Writer和Reader详细讲解

Java I/O体系详细讲解相关推荐

  1. JAVA MemCache 史无前例的详细讲解 看完包精通MEMCACHE

    JAVA MemCache 史无前例的详细讲解!看完包精通MEMCACHE! 分类: 高并发_性能2012-08-22 09:15 5051人阅读 评论(0) 收藏 举报 javastringobje ...

  2. Java字节码的详细讲解-刘宇

    Java字节码的详细讲解-刘宇 一.字节码的整体结构 二.字节码范围解析 2.1.魔数 2.2.版本信息 2.3.常量池(constant pool) 2.4.描述符规则 2.5.访问标志(Acces ...

  3. java回忆录—输入输出流详细讲解(入门经典)

    今天我们开始进入学习 java 中比较让人头疼的事, 那就是 I/O 流.多线程.网络编程.这里对 I/O 流的一个详细讲解.希望对大家有点用吧.(不看后悔哦) 一.什么是IO Java中I/O操作主 ...

  4. java utl_java utl包详细讲解.doc

    java utl包详细讲解 java.util包 2006-05-30 10:06:02 来源: JR 网友评论0?条 论坛 ?? 本章介绍Java的实用工具类库java.util包.在这个包中,Ja ...

  5. Java类与对象详细讲解(上)

    目录 一.类与对象的概念 1.1  什么是面向对象 1.2  什么是对象 1.3  什么是类 二.类与对象的定义 2.1  类的创建 2.2  对象的创建 2.3  练习创建两个dog对象,定义其属性 ...

  6. JAVA继承和多态详细讲解

    面向对象编程的重要知识:继承和多态.通过类的继承机制,可以使用已有的类为基础派生出新类,无需编写重复的程序代码,很好地实现程序代码复用.多态是面向对象编程中继封装和继承之后的另一大特征,它具体是指同一 ...

  7. java高并发案例详细讲解

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研 ...

  8. JAVA MemCache 史无前例的详细讲解

    Memcach什么是Memcache Memcache集群环境下缓存解决方案 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式 ...

  9. JAVA MemCache 史无前例的详细讲解【转】

    Memcach什么是Memcache Memcache集群环境下缓存解决方案 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式 ...

最新文章

  1. java x00_有没有通过python反序列化java对象的方法
  2. c语言程序执行时无法输入字符串,C语言程序设计中键盘输入数据的方法分析
  3. 安卓上比较好的python开发软件-手机随时随地写Python,还可以开发安卓APP,太厉害了!...
  4. Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(持续更新)
  5. C++ Primer 5th笔记(chap 12 动态内存)unique_ptr
  6. 知道c语言单元测试答案西安工程大学免费,C语言程序设计(西安工程大学)知到章节测试题答案...
  7. 使用PyQT编写界面程序
  8. 有网友提问,关于本地XML转JSON的小工具
  9. 如何开发 Servlet 程序
  10. Mysql简单的存储过程怎么写
  11. atitit 用什么样的维度看问题.docx 如何了解 看待xxx
  12. xp系统计算机启动时灰色界面,windows xp系统下屏幕开始按钮变成灰色怎么处理
  13. intel服务器最新主板芯片组,英特尔服务器主板芯片组驱动程序
  14. GTX高速收发器Transceiver概述与收发共同特征(UG476)
  15. Redis远程连接不上解决办法
  16. python,给定任意列表lst和一个任意值item,返回item在lst中第一次出现的位置
  17. 【蓝桥杯专题】 贪心(C++ | 洛谷 | acwing | 蓝桥)
  18. 小学信息技术 用计算机画画 教学目标,三年级下册信息技术教学计划4篇
  19. APPNP:PREDICT THEN PROPAGATE: GRAPH NEURAL NETWORKS MEET PERSONALIZED PAGERANK
  20. CAN 常见错误排查

热门文章

  1. 数据库笔记10:创建与管理视图
  2. Java案例:汉诺塔问题
  3. 刚安装玩mysql如何登录不了_解决启用GTID binlog新安装完的MySQL提示无法登录
  4. qtablewidget固定一列滚动_简单易懂,最全滚动轴承基本知识汇总
  5. 2017.9.11 海拔 思考记录
  6. 【英语学习】【Daily English】U11 Work L01 Would you like a tour of the office?
  7. python标注工具_Python labelImg 图像标注工具安装及使用教程windows版(亲测有效)
  8. 回答一下这些游戏帧数有关的问题吗?
  9. g6-editor 使用
  10. JCreator 写applet