# 概念

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

主要的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);
实例
FileInputStream实例
// 读取 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)
实例
FileOutputStream实例
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)

BufferedInputStream类
// 实例说明 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

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 类

FileWriter
// 传递一个 true 参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
FileWriter fw = new FileWriter("test.txt",true);
// 调用 writer 方法,向 text
fw.write("abcd");
// 关闭流
fw.flush();
fw.close();
// 此时的 test 文件内容就是:ABCDabcd

# FileReader 类

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
要注意异常处理!!