学习Java IO,不得不提到的就是JavaIO流。

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

IO流的分类

根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

Java流操作有关的类或接口:

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

1.缓冲流

缓冲字节流
BufferedInputStream
BufferedOutputStream
缓冲字符流
BufferedReader
BufferedWriter
处理流内部包含了节点流,节点流决定了与其沟通的外部设备,而处理流则增加了其功能。
缓冲流的好处:
缓冲流内部包含一个缓冲区域,默认8kb,每一次程序调用read方法其实都是从缓冲区域当中读取内容,如果读取失败
就说明缓冲区域当中没有内容,那么就从数据源当中读取内容,然后会尽可能读取更多的字节放入到缓冲区域当中,
最后缓冲区域当中的内容,会全部返回给程序。
从缓冲区读取数据会比直接从数据源读取数据的速度快,效率也更高,性能更好。
简单说:
没有缓存区,那么每read一次,就会发送一次IO操作;有缓存区,第一次read时,会一下读取x个字节放入缓存区,
然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。
处理流处理数据和节点流处理数据的方法基本上完全相同。
2,转换流:

转换流作用:把字节流转换成字符流,可以解决出现的因为编码集和解码集造成的乱码问题。
* InputStreamReader:
* OutputStreamWriter:
* 编码:字符—–编码字符集——–》二进制
* 解码:二进制—解码字符集———》字符
* 在处理文件时,如果文件的字符格式和编译器处理格式不一样时,会出现乱码问题。比如文件字符格式GBK,
* 而编译器是UTF-8格式,那么就会产生该问题。
*
* 出现乱码问题的原因:
* 1.编码和解码字符集不一致造成了乱码
* 2.字节的缺失,长度的丢失
*
* 大部分情况下,出现乱码问题是因为中国汉字,因为中国汉字在不同的字符编码当中占据的字节数不相同,但是都占据多个字节。
* 而英文字母没有这个问题,因为英文字母在所有的字符编码当中都占据一个字节。
InputStreamReader :转换输入流–》将字节输入流转换成字符输入流
作用:为了防止文件使用字符输入流处理时出现乱码问题。

节点流:

字节数组流(内存流)
ByteArrayInputStream
ByteArrayOutputStream
因为内存输出流当中又新增的方法,不能使用多态,不能够让父类的引用指向之类的对象。
作用:可以在循环当中把所有的数据存放到统一的容器当中,然后在循环结束之后可以把容器当中所有的内容一起取出来。
注意事项:
内存流属于内存当中的资源,所以数据量不要过大,如果太大,会造成内存溢出的错误。

数据处理流:

DataOutputStream
DataInputStream
特点: 既能够保存数据本身,又能够保存数据类型(基本数据类型+String)

序列化流:

将对象转换成字节序列的过程,就是对象序列化过程。
* 将字节序列恢复为对象的过程称之为对象的反序列化。
*
* 作用:保留对象(引用数据类型数据的)类型+数据。
*
* 序列化流 :输出流 ObjectOutputStream writeObject()
* 反序列化流: 输入流 ObjectInputStream readObject()
*
* 注意事项:
* 1。先序列化然后在反序列化,而且反序列化的顺序必须和序列化的顺序保持一致。
* 2.并不是所有的对象都能够被序列化。只有实现了Serializable接口的类的对象才能够被序列化。
* 对象当中并不是所有的属性都能够被序列化。
*
* 对象序列化的主要用途:
* 1.把对象转换成字节序列,保存到硬盘当中,持久化存储,通常保存为文件。
* 2.在网络上传递的是对象的字节序列
*
* 对象序列化的步骤:
* 1.创建对象输出流,在构造方法当中可以包含其他输出节点流,如文件输出流。
* 2.把对象通过writeObject的方式写入。
*
* 对象反序列化的步骤:
* 1.创建对象输入流,在构造方法当中可以包含其他的输入节点流,如文件输入流
* 2.通过readObject()方法读取对象。

serialVersionUID :序列化版本id
* 作用:从字面角度看,就是序列化版本号。凡是实现了Serializable接口的类,
* 都会有一个默认的静态的序列化标识。
*
* 1.类在不同的版本之间,可以解决序列化兼容问题,如果之前版本当中在文件中保存对象,
* 那么版本升级后,如果序列化id一致,我们可以认为文件中的对象依然是此类的对象。
*
* 2.如果类在不同的版本之间不希望兼容,但是还希望类的对象能够序列,那么就在不同版本中
* 使用不同的序列化id。
*
* transient :当类中有属性不想被序列化,那么就使用这个修饰符修饰。

---------------------
作者:yangm_1111
来源:CSDN
原文:https://blog.csdn.net/eternal1d/article/details/77189482
版权声明:本文为博主原创文章,转载请附上博文链接!

Java基础知识(JAVA之IO流)的更多相关文章

  1. Java基础知识回顾之六 ----- IO流

    前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...

  2. Java基础知识强化之IO流笔记71:NIO之 NIO的(New IO流)介绍

    1. I/O 简介 I/O ( 输入/输出  ):指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的. ...

  3. Java基础知识强化之IO流笔记68:Properties和IO流集合使用

    1. Properties和IO流集合使用 这里的集合必须是Properties集合:  public void load(Reader reader):把文件中的数据读取到集合中  public v ...

  4. Java基础知识强化之IO流笔记66:Properties的概述 和 使用(作为Map集合使用)

    1. Properties的概述  Properties:属性集合类.是一个可以和IO流相结合使用的集合类. 该类主要用于读取以项目的配置文件(以.properties结尾的文件 和 xml文件). ...

  5. Java基础知识强化之IO流笔记64:合并流SequenceInputStream

    1. SequenceInputStream合并流的概述: SequenceInputStream类可以将多个输入流串联在一起,合并为一个输入流,因此,该流也被称为合并流.   2. Sequence ...

  6. Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1

    1. 使用字节流FileInputStream / FileOutputStream 复制文本文件案例: 分析: (1)数据源:从哪里来 a.txt   --   读取数据  --  FileInpu ...

  7. Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用

    1. 可以参照之前写的笔记:   Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...

  8. Java基础知识强化之IO流笔记16:IO流的概述和分类

    1. IO流的分类   流向:     (1)输入流:读取数据到内存     (2)输出流:写入数据到硬盘(磁盘)   操作的数据类型:    (1)字节流:操作的数据是字节             ...

  9. Java基础知识强化之IO流笔记01:异常的概述和分类

     IO流操作的时候会出现很多问题,java中叫作异常,所以我们先介绍一下异常: 1. 程序的异常:Throwable(Throwable类是java中所有异常或错误的超类) (1)严重问题:Error ...

  10. Java基础知识总结之IO流

    理解Java的IO流 流(Stream)的概念:程序与数据来源之间的桥梁 流的分类 按流的方向来分(从程序所在的内存的角度来看): 输入流:把外部输入读入当前程序所在内. 输出流:把当前程序所在内存的 ...

随机推荐

  1. [UFLDL] ConvNet

    二十三(Convolution和Pooling练习)  三十八(Stacked CNN简单介绍) 三十六(关于构建深度卷积SAE网络的一点困惑) 五十(Deconvolution Network简单理 ...

  2. [Laravel] 10 - WEB API : wrapper

    前言 一.常用的解决方案 React 前端 + PHP (Laravel) 后端 Such as "some exposure to WEB API’s and/or RESTful“. 使 ...

  3. vue图片放大镜效果

    原作者地址:https://github.com/lemontree2000/vue-magnify 经测试,原插件在使用时有bug,即在预览时进行鼠标滚动,导致遮罩层计算错误.我已修复该bug,特分 ...

  4. 浅谈JavaScript对象数组根据某属性sort升降序排序

    1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16, s ...

  5. 使用Eclipse的坑

    1.运行Eclipse时突然出现找不到或者无法加载主类,这个问题不解决,下面的学习就无从做起,查了网上的一些资料,无法解决,所以还是有点烦人.如果在解决问题的过程中能够学到点什么,也是很值得的,但是就 ...

  6. day_6.14py网络编程

    被动套接字和新建出套接字的区别 单任务,单线程,非阻塞!!!!服务器! #2018-6-14 16:51:25 #!--*--coding:utf-8 --*-- ''' 单进程,单任务 少的可以,多 ...

  7. G - 看病要排队

    看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能根据简单的先来先服 ...

  8. okvis源码解读

    为相机图像提取brisk特征点,并设置描述子的提取方向为重力加速度在世界坐标系中的方向(0,0,1)

  9. 解决ubuntu系统“XXX is not in the sudoers file”错误

    用adduser新建的用户,当时只输入了一个用户名,没做其它操作,这样就建立了一个normal用户.在执行sudo vim hadoop-env.sh时,报“*** is not in the sud ...

  10. tensorflow如何正确加载预训练词向量

    使用预训练词向量和随机初始化词向量的差异还是挺大的,现在说一说我使用预训练词向量的流程. 一.构建本语料的词汇表,作为我的基础词汇 二.遍历该词汇表,从预训练词向量中提取出该词对应的词向量 三.初始化 ...