Java IO 的知识体系
2019-05-14 本文已影响0人
爱学习的蹭蹭
1、IO难题
- 对程序语言设计者来说,设计一个令人满意的I/O(输入/输出)系统,是件极艰巨的任务
2、Stream 流
- Stream 流是构成Java核心底层的体系
-
流有3分构成 (源 Source 、零个或多个中间操作、终止操作)
Stream
3、从功能分两大类
- 输入流和输出流
4、 结构上分:字节流和字符流
- 字节流:以字节为处理单位或称面向字节(最底层)
- 字符流:以字符为处理单位或称面向字符
- 在最底层所有输入/输出都是以字节形式,基于字符流,职位处理字符提供方便有效的方法
5、读与写
- InputStream 读, OutputStream 写
- Byte Stream —> Character Streams
6、 输入流(重点)
- 读数据的逻辑为
- open a Stream -> while more information -> read information -> close the stream
7、 输出流(重点)
- 写数据的逻辑为
- open a Stream -> while more information -> write information -> close the stream
8、 节点流和过滤流
- 节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域,凡是从InputStream继承下来的都是 节点流,除了FilterInputStream是过滤流
- 过滤流:使用节点流作为输入/输出,过滤流是使用一个已经存在的输入流或输出流连接创建的。
9、 I/O 流的连接
- 1、文件 => 从文件获取输入字节(FileInputStream) => 增加了缓存功能(BufferedInputStream) => 读取Java基本数据类型的功能(DataInputStream) => 数据
- 2、数据 => 可以往输出流写入Java基本数据类型(DataOutputStream) => 提供数据写入到缓冲区的功能(BufferedOutputStream) => 将数据写入到文件中(FileOutputStream) => 文件
- 3、Java的I/O库提供了一个称作链接的机制,可以将一个流与另外一个流首层相接,形成一个流管道的链接,称为
Decorator装饰设计模式的应用
- 4、通过流动链接可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取
Decorator装饰设计模式代码体现
// `Decorator装饰设计模式代码体现1`
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File(formPath)));
// `Decorator装饰设计模式代码体现2`
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(formPath));
// `Decorator装饰设计模式代码体现3`
BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(new File(formPath))));
10、 Decorator装饰设计模式的运用提供的实现的灵活性
- 1、装饰模式又称为包装模式(wrapper)
- 2、装饰模式以对客户端透明的方式进行扩展对象的功能是继承关系的一个替代方案
- 3、装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任,换言之客户不会觉得对象在装饰前和装饰后有什么不同
- 4、装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展
- 5、装饰模式把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展完全是透明的
- 6、装饰模式是在不必改变原类文件和使用继承的情况下动态的扩展一个对象的功能,它通过创建一个包装对象,也就是装饰来包裹真实的对象
- 7、装饰模式构建I/O最底层实现核心内容减少类的设计的数量过多
11、字节流与字符流的
- 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
- 字符流和字节流是根据处理数据的不同来区分的。字节流按照8位传输,字符流按照16位传输
- 由于字符流使用Unicode字符集,支持多国文字,因此若流要跨越多种平台传输,应使用字符流。
字节流输出--->>程序-->>字节流---->文件(直接操作文件)
字符流输出--->>程序-->>字符流---->>缓存--->>文件(数据线放在缓存,之后再从缓存写入文件)
基础数据类型的数值范围
数据类型 | 字节 | 范围 |
---|---|---|
boolean | 1 | true或false |
char | 2 | 从字符型对应的整型数来划分,其表示范围是0~65535 |
byte | 1 | -128~127 |
short | 2 | -32768~32767 |
int | 4 | -2147483648~2147483647 (-2^31 ~ 2^31-1) |
long | 8 | -9223372036854775808 ~ 9223372036854775807 |
float | 4 | -3.4E38~3.4E38 |
double | 8 | -1.7E308~1.7E308 |
字节流
与InputStream 有关的流 | 与OutputStream 有关的流 |
---|---|
FileInputStream | FileOutputStream |
FilterInputStream, | FilterOutputStream, |
BufferedInputStream | BufferedOutputStream |
CheckedInputStream | CheckedOutputStream |
CipherInputStream | CipherOutputStream |
DataInputStream | DataOutputStream |
DeflaterInputStream | DeflaterOutputStream |
DigestInputStream | DigestOutputStream |
InflaterInputStream | InflaterOutputStream |
LineNumberInputStream | LineNumberOutputStream |
ProgressMonitorInputStream | ProgressMonitorOutputStream |
PushbackInputStream | PushbackOutputStream |
AudioInputStream | AudioOutputStream |
ByteArrayInputStream | ByteArrayOutputStream |
ObjectInputStream, | ObjectOutputStream, |
PipedInputStream | PipedOutputStream |
SequenceInputStream | SequenceOutputStream |
StringBufferInputStream | StringBufferOutputStream |
字符流
与Writer 有关字符流 | 与Reader 有关的字符流 |
---|---|
BufferedWriter, | BufferedReader |
CharArrayWriter, | CharArrayReader |
FilterWriter, | FilterReader |
OutputStreamWriter, | InputStreamReader |
PipedWriter, | PipedReader |
PrintWriter, | StringReader |
StringWriter | . |
java IO 文件流的读,文件流写
11、 volatile的作用
- volatile关键字可以做到内存可见性,一个线程修改自己工作内存值就离开别刷新到其他的线程工作内存当中,从而做到重派制