学习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基础知识回顾之六 ----- IO流
前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...
Java基础知识强化之IO流笔记71:NIO之 NIO的(New IO流)介绍
1. I/O 简介 I/O ( 输入/输出 ):指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的. ...
Java基础知识强化之IO流笔记68:Properties和IO流集合使用
1. Properties和IO流集合使用 这里的集合必须是Properties集合: public void load(Reader reader):把文件中的数据读取到集合中 public v ...
Java基础知识强化之IO流笔记66:Properties的概述 和 使用(作为Map集合使用)
1. Properties的概述 Properties:属性集合类.是一个可以和IO流相结合使用的集合类. 该类主要用于读取以项目的配置文件(以.properties结尾的文件 和 xml文件). ...
Java基础知识强化之IO流笔记64:合并流SequenceInputStream
1. SequenceInputStream合并流的概述: SequenceInputStream类可以将多个输入流串联在一起,合并为一个输入流,因此,该流也被称为合并流. 2. Sequence ...
Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1
1. 使用字节流FileInputStream / FileOutputStream 复制文本文件案例: 分析: (1)数据源:从哪里来 a.txt -- 读取数据 -- FileInpu ...
Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用
1. 可以参照之前写的笔记: Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...
Java基础知识强化之IO流笔记16:IO流的概述和分类
1. IO流的分类 流向: (1)输入流:读取数据到内存 (2)输出流:写入数据到硬盘(磁盘) 操作的数据类型: (1)字节流:操作的数据是字节 ...
Java基础知识强化之IO流笔记01:异常的概述和分类
IO流操作的时候会出现很多问题,java中叫作异常,所以我们先介绍一下异常: 1. 程序的异常:Throwable(Throwable类是java中所有异常或错误的超类) (1)严重问题:Error ...
Java基础知识总结之IO流
理解Java的IO流 流(Stream)的概念:程序与数据来源之间的桥梁 流的分类 按流的方向来分(从程序所在的内存的角度来看): 输入流:把外部输入读入当前程序所在内. 输出流:把当前程序所在内存的 ...
随机推荐
Uninstall from GAC In C# code
How do I uninstall the GAC from my C# application. I am not able to uninstall, the particular exe an ...
Python Day2
一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 新建一个列表 name = ['ShaoLin','Tom','Kimi','Rain','A ...
【使用 DOM】使用 Window 对象
1. 获取 Window 对象 可以用两种方式获得Window对象.正规的HTML5方式是在Document对象上使用defaultView属性.另一种是使用所有浏览器都支持的全局变量window . ...
DevExpress的所有功能介绍
https://www.devexpress.com/Subscriptions/New-2016-2.xml?utm_source=AnnounceTry&utm_medium=WhatsN ...
sharepoint:拥有完全控制权限的用户依然“拒绝访问”
//来源 http://www.cnblogs.com/jindahao/archive/2012/04/25/2468714.html 遇到问题: 拥有完全控制权限的用户依然拒绝访问. 可能的原因: ...
win10 uwp 保存用户选择文件夹
如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp ...
【转载】通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
本文转载自:http://www.cnblogs.com/1996V/p/9037603.html [尊重作者原创,转载说明出处!感谢作者“小曾看世界”分享! ] 什么是.NET?什么是.NET Fr ...
liunx_second_day
liunx-基本权限 1.文件和目录权限的区别 A.文件的权限:所有者,所属组,其他人 rwx,读,写,执行,没有权限就是- 第一组rwx:文件所有者的权限 第二组rwx:文件所属组的权限 第三组rw ...
sass 的安装 编译 使用
1.使用node 的command 运行命令: gem install sass2.cmd检查是否安装成功 sass -v 如果成功了 可以看见版本信息Sass 3.5.5 ...3. 创建.scss ...
Java 反射机制(包括组成、结构、示例说明等内容)
第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...