# 概念
IO 流是用来处理设备之间的数据传输,上传文件和下载文件,Java 用于操作流的对象都在 IO 包中,有字节流和字符流之分,字节流可以处理任何文件数据,字符流只能处理纯文本文件。

字节流的抽象基类:
InputStream,OutputStream
字符流的抽象基类:
Reader,Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,如 InputStream 的子类 FileInputStream,Reader 的子类 FileReader。
# 字节流
# InputStream 类
InputStream 类是字节输入流的抽象类,是所有字节输入流的父类,InputStream 类具有层次结构

常用方法 (其子类的常用方法大致一样):
返回值 方法名字 (参数) 说明
int available() :返回从此输入流中可以读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
void close() :关闭此输入流并释放与流相关联的任何系统资源。
void mark(int readlimit) :标记此输入流中的当前位置。
boolean markSupported() :测试此输入流是否支持 mark 和 reset 方法。
abstract int read() :从输入流读取数据的下一个字节。
int read(byte[] b) :从输入流中读取一些字节数,并将它们存储到缓冲器阵列 b 。
int read(byte[] b, int off, int len) :从输入流读取最多 len 个字节的数据到字节数组。
byte[] readAllBytes() :从输入流读取所有剩余字节。
int readNBytes(byte[] b, int off, int len) :将所请求的字节数从输入流读入给定的字节数组。
void reset() :将此流重新定位到最后在此输入流上调用 mark 方法时的位置。
long skip(long n) :跳过并丢弃来自此输入流的 n 字节的数据。
long transferTo(OutputStream out) :从该输入流中读取所有字节,并按读取的顺序将字节写入给定的输出流。
# OutputStream 类
OutputStream 类,字节输出流的抽象类,下图所示层次结构:

常用方法:
.close() 关闭此输出流并释放与此流相关联的任何系统资源。
.flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
.write(int b) :将指定的字节写入此输出流。
.write(byte[] b) :将 b.length 字节从指定的字节数组写入此输出流。
.write(byte[] b, int off, int len) :从指定的字节数组写入 len 字节,从偏移量 off 开始输出到此输出流。
# FileInputStream
FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。
FileInputStream 的构造方法
// 使用给定的文件名 name 创建一个 FileInputStream 对象 | |
FileInputStream 变量名=new FileInputStream(String name); | |
// 用 File 对象来创建 FileInputStream 对象 | |
FileInputStream 变量名 = new FileInputStream(File file); |
实例
// 读取 D 盘下的 test.txt 文件 test.txt 的内容是 ABCD | |
InputStream inputStream = new FileInputStream("D://test.txt"); | |
// 或者: InputStream inputStream = new FileInputStream (new File ("D://test.txt")) | |
int i = 0; | |
while ((i = inputStream.read()) != -1) { | |
System.out.print(i+" ");// 控制台输出的是:65 66 67 68 | |
// 原因是因为字符在底层存储的时候就是存储的数值。即字符对应的 ASCII 码。 | |
System.out.print((char)i+" ");// 控制台输出:A B C D | |
} | |
// 关闭 IO 流 | |
inputStream.close(); |
# FileOutputStream
FileOutputStream:字节文件输出流,字节文件输出流是用于将数据写入到 File,从程序中写入到其他位置。
构造方法:
// 创建一个 FileOutputStream 对象,表示的文件 file 中写入数据的文件输出流 | |
FileOutputStream out = new FileOutputStream(File file) | |
// 创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。 | |
FileOutputStream out = new FileOutputStream(File file, boolean append) | |
// 创建一个向具有指定名称的文件中写入数据的输出文件流 | |
FileOutputStream out = new FileOutputStream(String name) | |
// 创建一个向具有指定 name 的文件中写入数据的输出文件流 | |
FileOutputStream out = new FileOutputStream(String name, boolean append) |
实例
OutputStream outputStream = new FileOutputStream(new File("test.txt")); | |
// 写出数据 | |
outputStream.write("ABCD".getBytes()); | |
// 关闭 IO 流 | |
outputStream.close(); | |
// 内容追加写入 | |
OutputStream outputStream2 = new FileOutputStream("test.txt", true); | |
// 输出换行符 | |
outputStream2.write("\r\n".getBytes()); | |
// 输出追加内容 | |
outputStream2.write("hello".getBytes()); | |
// 关闭 IO 流 | |
outputStream2.close(); |
# BufferedInputStream 类
BufferedInputStream 类:字节缓冲输入流,提高了读取效率。可以对所有的 InputStream 的子类进行带缓冲区的包装。
构造方法:
// 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 | |
// 默认大小是 32 个字节 | |
BufferedInputStream(InputStream in) | |
// 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in 以便将来使用 | |
BufferedInputStream(InputStream in, int size) |
// 实例说明 test 内容还是:ABCD | |
InputStream in = new FileInputStream("test.txt"); | |
// 字节缓存流 | |
BufferedInputStream bis = new BufferedInputStream(in); | |
byte[] bs = new byte[20]; | |
int len = 0; | |
while ((len = bis.read(bs)) != -1) { | |
System.out.print(new String(bs, 0, len)); | |
// ABCD | |
// hello | |
} | |
// 关闭流 | |
bis.close(); |
# BufferedOutputStream 类
构造方法:
// 创建一个有 32 个字节的缓冲输出流 | |
BufferedOutputStream(OutputStream in); | |
// 创建一个指定大小的缓冲输出流 | |
BufferedOutputStream(OutputStream in , int Number); |
# 字符流
Writer:是字符输出流的抽象类,是所有字符输出流的父类
Reader:是字符输入流的抽象类,也是所有字符输入流的父类


# Writer 类
常用的方法:
.append(char c) :指定字符添加到此 writer。
.apprnd(CharSequenec csq) :将指定字符序列添加到此 writer。
.append(CharSequenec csq,int start,int end) :将指定字符序列的子序列添加到此 writer.Appendable。
.colse() :关闭流,但是要先刷新它。
flush :刷新该流的缓冲。
.write(char[] cbuf) :写入一个字符数组。
.write(char[] cbuf,int off , int len) :写入字符的某一个部分。
.write(int c) :写入一个字符。
.write(String str) :写入字符串。
.write(String str,int off , int len) :写入字符串的某一个部分。
# Reader 类
常用的方法:
返回值 方法名 (参数名) 解释说明
abstract void close() :关闭流并释放与之相关联的任何系统资源。
void mark(int readAheadLimit) : 标记流中的当前位置。
boolean markSupported() :告诉这个流是否支持 mark()操作。
int read() :读一个字符 。
int read(char[] cbuf) :将字符读入数组。
abstract int read(char[] cbuf, int off, int len) :将字符读入数组的一部分。
int read(CharBuffer target) :尝试将字符读入指定的字符缓冲区。
boolean ready() :告诉这个流是否准备好被读取。
void reset() :重置流。
long skip(long n) :跳过字符。
# FileWriter 类
// 传递一个 true 参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。 | |
FileWriter fw = new FileWriter("test.txt",true); | |
// 调用 writer 方法,向 text | |
fw.write("abcd"); | |
// 关闭流 | |
fw.flush(); | |
fw.close(); | |
// 此时的 test 文件内容就是:ABCDabcd |
# FileReader 类
FileReader fr = new FileReader("test.txt"); | |
// 调用读取流对象的 read 方法。 | |
//read (): 一次读一个字符。而且会自动往下读。 | |
int ch = 0; | |
while((ch=fr.read())!=-1){ | |
System.out.print("ch="+(char)ch+" "); | |
} | |
// 关闭流 | |
fr.close(); | |
// 控制台输出 ch=A ch=B ch=C ch=D ch=a ch=b ch=c ch=d |