IO:Java数据的 输入\输出
数据流:根据流向分为输入流(InputStream\Reader)和输出流(OutputStream\Writer);也可以根据操作的数据单元分为字符流(Reader\Writer)和字节流(Stream)。以适应不同的场景。
字节流(Stream):一般用来处理图像、视频、PPT、Word等类型的文件。
InputStream:基于字节的输入操作,定义了所有输入流都具有的共同特征,是所有输入字节流的父类。(输入到内存)
OutputStream:基于字节的输出操作,定义了所有输出流都具有的共同特征,是所有输出字节流的父类。(输出到文件等)
字符流(Reader\Writer):一般用于处理txt、文本数据等文本类型的文件
Reader:基于字符的输入操作,是所有输入字符流的父类。
Writer:基于字符的输出操作,是所有输出字符流的父类。
字符提供readline()方法能够一行一行读,字符只能一个字节一个字节读 ;且对中文有区别(英文占1个字节、中文最少占2个字节,中文占一个字符)看上面的是不是晕了。
我们在在流的使用过程之中常常是嵌套处理的,这是一种装饰模式。
拿字节流来说:DataOutputStream就是装饰FileOutputStream,FileOutputStream就是装饰OutputStream.他们是一种继承修饰拓展的关系。如DataOutputStream是用于修饰流的类型属性,BufferedOutputStream是用于修饰流读取时采用一块一块读的方式(否则字节流读取时一个字节一个字节读取,非常消耗性能),FileOutputStream是用于把文件转换为字节流。这样理解就便于使用众多类型的装饰类。
ByteArray修饰:从字节数组(byte[])中进行以字节为单位的读取
Piped修饰:用于多线程的管道通信
File修饰:跟文件相关的比如从文件输入或者输出到文件。
Filter修饰:一个过渡的过滤类,没有实际作用,供其他类装饰(Data、Buffered等)。
Buffered修饰:内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,让流一块一块的读取。而不再是一个一个的读取。优化性能和读取速度。
Data:用于修饰读取基本 Java 数据类型(把数据修饰为),可以为Boolean、Int、String、Char等一系列类型。
void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
void close() :关闭输出流,释放和这个流相关的系统资源。
字节流
Buffered:BufferedReader 拥有readline()方法可以读一行的字符。
InputStreamReader:将字节流以字符流输入。
OutputStreamWrite: 将字节流以字符流输出。
void close() :关闭输出流,释放和这个流相关的系统资源。
RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。在文件里移动用的seek(int dex ){可以将指针移动到某个位置开始读写},setLength(long len){给写入文件预留空间}。
构造方法:RandomAccessFile randomAccessFile = new RandomAccessFile(File file, String mode);
其中mode 的值可选 "r":可读 ; "w" :可写;"rw":可读写;
应用场景:文件的多线程下载,多个线程对整个文件进行拆分,每个线程下载其中一部分数据流,最终拼接得到完整的文件。
网友评论