IO总体框架介绍二
IO流的体系结构
在学习IO流这里,我们将会接触到40多个不同的类,这些类看上去很杂乱,但实际上很有规则,如下图,是已经划分好的框架图:
主要的流的体系图:每个输入流都有相应的输出流
输入/输出流体系中常用的流的分类表:
注:表中粗体字所标出的类代表节点流,必须直接与指定的物理节点关联:斜体字标出的类代表抽象基类,无法直接创建实例。
四大基类流介绍
InputStream,Reader,OutputStream以及Writer,这四大抽象基类,本身并不能创建实例来执行输入/输出,但它们将成为所有输入/输出流的模版,所以它们的方法是所有输入/输出流都可以使用的方法
1.InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类,主要包含三个方法:
//读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;//读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1。
int read(byte[] buffer) ;
//读取length个字节并存储到一个字节数组buffer,从off位置开始存,最多len,返回实际读取的字节数,如果读取前以到输入流的末尾返回-1。
int read(byte[] buffer, int off, int len) ;
2.Reader
Reader 是所有的输入字符流的父类,它是一个抽象类,主要包含三个方法:
//读取一个字符并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;
//读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入流的末尾返回-1。
int read(char[] cbuf) ;
//读取length个字符,并存储到一个数组buffer,从off位置开始存,最多读取len,返回实际读取的字符数,如果读取前以到输入流的末尾返回-1。
int read(char[] cbuf, int off, int len)
//对比InputStream和Reader所提供的方法,就不难发现两个基类的功能基本一样的,
//只不过读取的数据单元不同。在执行完流操作后,要调用close()方法来关系输入流,
//因为程序里打开的IO资源不属于内存资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源。
//除此之外,InputStream和Reader还支持如下方法来移动流中的指针位置:
//在此输入流中标记当前的位置
//readlimit - 在标记位置失效前可以读取字节的最大限制。
void mark(int readlimit)
// 测试此输入流是否支持 mark 方法
boolean markSupported()
// 跳过和丢弃此输入流中数据的 n 个字节/字符
long skip(long n)
//将此流重新定位到最后一次对此输入流调用 mark 方法时的位置
3.OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类,主要包含如下四个方法:
//向输出流中写入一个字节数据,该字节数据为参数b的低8位。
void write(int b) ;
//将一个字节类型的数组中的数据写入输出流。
void write(byte[] b);
//将一个字节类型的数组中的从指定位置(off)开始的,len个字节写入到输出流。
void write(byte[] b, int off, int len);
//将输出流中缓冲的数据全部写出到目的地。
void flush();
4.Writer
Writer 是所有的输出字符流的父类,它是一个抽象类,主要包含如下六个方法:
//向输出流中写入一个字符数据,该字节数据为参数b的低16位。
void write(int c);
//将一个字符类型的数组中的数据写入输出流,
void write(char[] cbuf)
//将一个字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流。
void write(char[] cbuf, int offset, int length);
//将一个字符串中的字符写入到输出流。
void write(String string);
//将一个字符串从offset开始的length个字符写入到输出流。
void write(String string, int offset, int length);
//将输出流中缓冲的数据全部写出到目的地。
void flush()
可以看出,Writer比OutputStream多出两个方法,主要是支持写入字符和字符串类型的数据。
flush方法和close方法区别
A: flush方法和close方法区别
a: flush()方法
用来刷新缓冲区的,刷新后可以再次写出,只有字符流才需要刷新
b: close()方法
用来关闭流释放资源的,如果是带缓冲区的流对象的close()方法,
不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
使用Java的IO流执行输出时,不要忘记关闭输出流,关闭输出流除了可以保证流的物理资源被回收之外,还能将输出流缓冲区的数据flush到物理节点里(因为在执行close()方法之前,自动执行输出流的flush()方法)
应用
import java.io.*;
/**
* 描述:IO四大基础流应用
*
* @Author administrator{GINO ZHANG}
* @Date2018/12/4
*/
public class IOTest {
public static void main(String[] args) {
String path = "F:\\tulun java\\Test1\\IO.txt";
String str = "Hello World";
outputStream(path,str);
inputSream(path);
Writer(path,str);
Reader(path);
}
private static void Writer(String path, String str) {
try{
FileWriter fileWriter = new FileWriter(path);
fileWriter.write(str);
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void Reader(String path) {
try{
FileReader fileReader = new FileReader(path);
char[] chars = new char[11];
fileReader.read(chars);
String string = new String(chars);
System.out.println(string);
fileReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void outputStream(String path, String str) {
try{
FileOutputStream fileOutputStream = new FileOutputStream(path);
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void inputSream(String path) {
try{
FileInputStream fileInputStream = new FileInputStream(path);
byte[] bytes = new byte[11];
fileInputStream.read(bytes);
String string = new String(bytes);
System.out.println(string);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
打印结果:
C:\java\java7\jdk1.7.0_80\bin\java.exe -javaagent:D:\ideaIU-2018.1.5.win\lib\idea_rt.jar=14545:D:\ideaIU-2018.1.5.win\bin -
Hello World
Hello World
Process finished with exit code 0