O流概述
将通过不同输入/输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”
程序允许通过流的方式与输入/输出设备进行数据传输
Java中的“流”都位于java.io包中,称为IO(输入/输出)流
按操作数据的不同,分为字节流和字符流。
按数据传输方向的不同,分为输入流和输出流
程序从输入流中读取数据(只能读不能写)
程序向输出流中写入数据(只能写不能读)
字节流:java.io.InputStream java.io.OutputStream
字符流: java.io.Reader java.io.Writer
字节流的概念
文本、图片、音频、视频等所有文件都以二进制(字节)形式存储
IO流针对字节的输入输出提供了一系列的流,统称为字节流
InputStream 所有的字节输入流继承自InputStream
OutputStream 所有的字节输出流都继承自OutputStream
InputStream提供的与读数据相关的方法
OutputStream提供的与写数据相关的方法
InputStream的子类
OutputStream的子类
字节流读写文件
FileInputStream专门用于读取文件中的数据
FileOutputStream专门用于向文件中写数据
文件不存在会自动创建。
向已经存在的文件中写入数据,该文件中的数据首先会被清空,再写入新的数据。
在存在的文件内容之后追加新内容,创建文件输出流对象时使用如下构造函数:
FileOutputStream(String fileName, boolean append
append 参数的值设置为true
字节流读写文件示例:文件的拷贝
字节流的缓冲区
逐个字节读写,频繁操作文件,效率非常低。
为提高效率也可以定义一个字节数组作为缓冲区,拷贝文件时,一次性读取多个字节数据,并保存在字节数组中,然后将字节数组中的数据一次性写入文件
字节缓冲流
BufferedInputStream
BufferedOutputStream
这两个流都使用了装饰设计模式
构造方法分别接收InputStream和OutputStream类型的参数作为被包装对象
应用程序、缓冲流和底层字节流之间的关系
流内部都定义了一个大小为8192的字节数组作为缓冲区
字符流
Reader字符输入流,从某个源设备读取n符
Reader常用方法
Writer字符输出流,向某个目标设备写字符
Writer常用方法
字符流子类
FileReader从文本文件中读取数据
FileWriter向文文本件中写入数据
BufferedReader用于对字符输入流进行包装
BufferedWriter用于对字符输出流进行包装
LineNumberReader可以跟踪行号的输入流
转换流
OutputStreamWriter将一个字节流输出流包装成字符输出流,方便直接写入字符。
InputStreamReader将一个字节输入流包装成字符输入流,方便直接读取字符
将字节流转为字符流
可以通过BufferedReader和BufferedWriter对转换流进行包装
其它IO流
DataInputStream和DatOutputStream
两个与平台无关的数据操作流
提供读写各种基本类型数据的方法
提供readUTF()和writeUTF()方法
PrintStream类
被称作打印流
提供了用于打印数据的print()和println()方法
将基本数据类型的数据或引用数据类型的对象格式化成字符串后再输出
标准输入输出流
System类中的三个常量:in、out和err。
in为InputStream类型,它是标准输入流,默认情况下用于读取键盘输入的数据。
out为PrintStream类型,它是标准输出流,默认将数据输出到命令行窗口。
err 也是 PrintStream 类型,它是标准错误流,它和 out 一样也是将数据输出到控制台 ,它输出的是 应用程序运行时的错误信息
PipedInputStream 和 pipedOutputStream
ByteArrayInputStream 和 ByteArrayOutputStream
CharArrayReader 和 CharArrayWriter
SequenceInputStream