按数据流的方向分为 输入流、输出流
按处理数据单位不同分为 字节流、字符流
按功能不同分为 节点流、处理流
4个基本的抽象流类型,所有的流都继承这四个
输入流 | 输出流 | |
---|---|---|
字节流 | InputStream | outputStream |
字符流 | Reader | Writer |
inputStream:字节输入流
outputStream:字节输出流
Reader:字符输入流
Writer:字符输出流
总结流的分类
字符流的由来: Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表
在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
主要的类如下:
输入字节流InputStream
认识每个类的功能即作用
输出字节流OutputStream
字符输入流Reader
字符输出流Writer
字节流和字符流使用情况:(重要)
转换流的作用,文本文件在硬盘中以字节流的形式存储时,通过InputStreamReader读取后转化为字符流给程序处理,程序处理的字符流通过OutputStreamWriter转换为字节流保存
转换流的特点:
何时使用转换流?
具体的对象体现
字节流和字符流的区别:
针对一些频繁的设备交互,Java语言系统预定了3个可以直接使用的流对象,分别是:
标准I/O
用我自己的话来说,就是往一个添加更多的功能,而我们首先想到的是继承,继承就很好的符合了我们的要求,不管你想加多少层的功能,都可以使用继承一层层的实现,但是这带来了一个问题,一旦我需要改变我的需求,那么我就需要往源码中改东西,再就是在这个继承链中某个类做一些修改,这不符合我们的设计模式思想,所以就有了装饰者模式,装饰者中拥有被装饰者的实例,然后有什么具体的装饰我们都另写一个类来继承该装饰者,当我们需要该装饰时,就new出该类来,然后将其被装饰者当作参数传递进去
现在来看看一个具体的实例。比如,我们需要制作一份鸡腿堡,流程是怎样的呢
其实处理流就是一个具体的装饰者,而节点流就是被装饰者
Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器
Scanner套接字节流或字符流:
将保存在内存中的对象数据转化为二进制数据流进行传输,任何对象都可以序列化
实现方法:实现java.io.Serializable接口
作用:把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java的序列化的概念。在Java的OutputStream类下面的子类ObjectOutput-Stream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接口
在使用tomcat开发JavaEE相关项目的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的时候能够从tomcat上面读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作,还有jdbc加载驱动用的就是反序列化,将字符串变为对象
将二进制数据换回原对象
构造:
方法:
以上序列化和反序列化实现了的对象序列化,但是可以发现,操作时是将整个对象的所有属性序列化,那么transient关键字可以将某些内容不需要保存,就可以通过transient关键字来定义
private transient string title;
此时title属性无法被序列化
原文:https://www.cnblogs.com/xzl168com/p/14687096.html