详细解析IO流中的数据传输,深入分析字节输入流和字节输出流

Java中的IO流

Java IO流基本概念

  • 流的基本概念:
    • 流是一组有顺序的,有起点和终点字节集合,是对数据传输的总称或抽象
    • 数据在设备间的传输称为流
  • 流的本质是数据传输:
    • 根据数据传输的特性将流抽象为各种类,方便更直观地进行数据操作

Java IO流结构

  • Java中的IO流结构:
    -
  • Java中的常用的IO流操作相关的类:
描述
File 文件类
RandomAccessFile 随机存取文件类
InputStream 字节输入流
OutputStream 字节输入流
Reader 字符输入流
Writer 字符输出流

Java IO流分类

  • 根据处理数据类型的不同分为:
    • 字符流
    • 字节流
  • 根据数据流向的不同分为:
    • 输入流
    • 输出流

字节流和字符流

  • 字符流: 根据数据编码的不同,对字符进行高效操作的流对象
  • 字符流的本质: 基于字节流读取时,查询指定的码表
  • 字节流和字符流的区别:
    • 读写单位不同:
      • 字节流以8 bit的字节为单位
      • 字符流以字符为单位,根据码表映射字符,一次可能读多个字节
    • 处理对象不同:
      • 字节流可以处理所有类型的数据
      • 字符流只能处理字符流类型的数据
  • ==结论:==
    • 只要处理纯文本数据,优先考虑使用字符流
    • 处理纯文本以外的数据使用字节流

输入流和输出流

  • 要根据待传输数据的不同特性使用不同的流:
    • 输入流只能进行读操作
    • 输出流只能进行写操作

Java IO流对象

输入字节流-InputStream

  • InputStream:
    • 是一个抽象类
    • 所有的输入字节流的父类
  • InputStream三种基本的介质流:
    • ByteArrayInputStream: 从Byte数组中读取数据
    • StringBufferInputStream: 从StringBuffer中读取数据
    • FileInputStream: 从本地文件中读取数据
  • PipedInputStream: 从与其余线程共用的管道中读取数据
  • 装饰流: 装饰器模式中的重要角色
    • ObjectInputStream和所有FileInputStream的子类都是装饰流

输出字节流-OutputStream

  • OutputStream:
    • 是一个抽象类
    • 是所有输出字节流的父类
  • OutputStream两种基本的介质流:
    • ByteArrayOutputStream: 向Byte数组中写入数据
    • FileOutputStream: 向本地文件中写入数据
  • PipedOutputStream: 向其余线程共用的管道中写入数据
  • 装饰流: 装饰模式中的重要角色
    • ObjectOutputStream和所有FileOutputStream的子类都是装饰流

字节流的输入和输出的对应关系

在这里插入图片描述

蓝色的为主要的对应部分
红色的为不对应部分
紫色的虚线部分代表这些流一般要搭配使用

  • Java中的IO流是极其对称的,特殊的几个类如下:
    • LineNumberInputStream:
      • 主要完成从流中读取数据时,会得到相应的行号
      • 分行的时机以及分行的位置是由该类主动确定的,并不是在原始中有这样一个行号
      • 在输出部分没有对应的部分,可以自定义建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号
    • PushbackInputStream:
      • 主要完成查看最后一个字节,如果不符合要求就放入缓冲区
      • 主要应用在编译器的语法,词法分析部分
      • 输出部分的BufferedOutputStream几乎实现相近的功能
    • SequenceInputStream:
      • 一个工具类.将两个或者多个输入流当成一个输入流一次读取
      • 完全可以从IO包中去除,完全不会影响IO包结构,基于装饰器Decorator模式
    • PrintStream:
      • 一个辅助工具.主要可以向其余输出流或者FileInputStream写入数据
      • 本身内部实现是带缓冲的
      • 本质上是对其余流的综合运用的一个工具

字符输入流-Reader

  • Reader:
    • 是一个抽象类
    • 所有输入字符流的父类
  • Reader两种基本的介质流:
    • CharReader: 从Char数组中读取数据
    • StringReader: 从String中读取数据
  • BufferedReader: 是一个装饰器,和本身的子类负责装饰Reader对象,提供缓冲功能
  • FilterReader:
    • 所有自定义具体装饰流的父类
    • 子类PushbackReader对Reader对象进行装饰,会增加一个行号
  • InputStreamReader:
    • 是一个连接字节流和字符流的桥梁,将字节流转变为字符流
    • 子类FileReader是一个连接字节流和字符流,将字节流转变为字符流常用的工具类.使用了将FileInputStream转变为Reader的方法
  • Reader中的各个类的用途和使用方法基本和InputStream中的类使用一致

字符输出流-Writer

  • Writer:
    • 是一个抽象类
    • 所有输出字符流的父类
  • Writer两种基本的介质流:
    • CharArrayWriter: 向Char数组中写入数据
    • StringArrayWriter: 向String中写入数据
  • PipedWriter: 向其余线程共用的管道中写入数据
  • BufferedWriter: 是一个装饰器,为Writer提供缓冲功能
  • PrintWriter:
    • PrintWriter和PrintStream极其相似
    • 一个辅助工具.主要可以向其余输出流或者FileReader写入数据
    • 内部实现是带缓冲的
    • 本质上是对其余流的综合运用的一个工具
  • OutputStreamWriter:
    • 是OutputStream到Writer转换的桥梁
    • 子类FileWriter就是一个实现该功能的具体类
  • Writer的各个类的用途和使用方法基本和OutputStream中的类使用一致

字符流的输入和输出的对应关系

在这里插入图片描述

字符流和字节流的转换

  • 转换流的特点:
    • 转换流是字符流和字节流之间的桥梁
    • 转换流可以对读取到的字节数据经过指定编码转换成字符
    • 转换流可以对读取到的字符数据经过指定编码转换成字节
  • 转换流的使用场景:
    • 当字节和字符之间有转换动作时
    • 流操作的数据需要编码或者解码时
  • 转换流的具体对象体现:
    • InputStreamReader: 字节到字符的桥梁
    • OutputStreamWriter: 字符到字节的桥梁
      • 这两个流对象是字符体系中的成员,具有转换作用
      • 这两个流对象本身又是字符流,所以在构造时需要传入字节流对象

File类

  • File类:
    • 对文件系统中的文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹
    • File类保存文件或目录的各种元数据信息:
      • 文件名
      • 文件长度
      • 最后修改时间
      • 是否可读
    • File类中包括对文件和文件夹的操作方法:
      • 获取当前文件的路径名
      • 判断指定文件是否存在
      • 获取当前目录中的文件列表
      • 创建,删除文件和目录

RandomAccessFile类

  • RandomAccessFile:
    • RandomAccessFile类并不是流体系的组成部分
    • RandomAccessFile封装了字节流,同时还封装了一个缓冲区,缓冲区是一个字符数组,通过内部指针来操作字符数组中的数据
  • RandomAccessFile类的特点:
    • 只能操作文件. 所以构造函数接收两种类型的参数:
      • 字符串文件路径
      • File对象
    • 既可以对文件进行读操作, 也可以进行写操作. 在进行对象实例化时可指定操作模式
      • r
      • rw
  • RandomAccessFile实例化:
    • 实例化时,如果操作的文件不存在,会自动创建
    • 如果文件存在,写数据未指定位置,默认会从头开始写,这样就会覆盖原有的内容
    • 可用于多线程下多个线程同时写数据到文件
      [图片上传中...(86edb345a33443b8842604f883351a96~tplv-k3u1fbpfcp-zoom-crop-mark-1304-1304-1304-734.image.jpg-92a196-1630760267224-0)]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容