IO体系结构和基础应用
1、什么是流(Stream)?
将输入和输出抽象为叫做流的概念。流是程序和外界进行数据交换的通道在OOP中的实现。
简单来说,可以把流比作水管,从一个地方流出,在流入另一个地方。
2、流的分类:
①按方向分:
I、输入流
II、输出流
②按性质分:
I、基础字节流:InputStream和OutputStream流
II、过滤流:用来包装基础流以提供更好的特性,BufferedInputStream和BufferedOutputStream流
III、基与具体数据类型的流:DataInputStream和DataOutputStream流
IV、基与对象读写:ObjectInputStream和ObjectOutputStream流
3、使用FileInputStream读取数据,使用FileOutputStream写入数据
代码如下:
/**
* 文件拷贝的方法(用File流)
* @param path 读取文件的路径
* @param path_2 写入文件的路径
*/
public void Filecopy_File(String path,String path_2){
try {
//实例化一个File输出流对象
InputStream is = new FileInputStream(path);
//实例化一个File输入流对象
OutputStream os = new FileOutputStream(path_2);
//获取文件的长度
int length = is.available();
//写入文件
int v;
for(int i = 0;i<length;i++){
v = is.read();
os.write(v);
}
//关闭流
System.out.println("拷贝成功");
is.close();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
4、使用BufferedInputStream和BufferedOutputStream流读取写入数据
代码如下:
/**
* 文件拷贝的方法(用Buffered流)
* @param path 读取文件的路径
* @param path_2 写入文件的路径
*/
public void Filecopy_Buffered(String path,String path_2){
try {
//实例化一个File输出流对象
InputStream is = new FileInputStream(path);
//实例化一个Buffered输出流对象
BufferedInputStream bis = new BufferedInputStream(is);
//实例化一个File输入流对象
OutputStream os = new FileOutputStream(path_2);
//实例化一个Buffered输入流对象
BufferedOutputStream bos = new BufferedOutputStream(os);
//获取文件的长度
int length = is.available();
//写入文件
int v;
for(int i = 0;i<length;i++){
v = bis.read();
bos.write(v);
}
System.out.println("拷贝成功");
//关闭流
bis.close();
is.close();
bos.close();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
5、使用DataInputStream和DataOutputStream流读取写入数据
画板的保存:
写入数据:
/**
* 保存的方法
* @param array 存储像素点的数组
* @param path 存储路径
* @return
*/
public boolean save(int[][] array,String path){
boolean x = false;
try {
// 实例化File输出流的对象
OutputStream os = new FileOutputStream(path);
//实例化Buffered输出流对象
BufferedOutputStream bos = new BufferedOutputStream(os);
//实例化Data输出流对象
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(array.length);// 写入图片的宽度,写入类型为整形
dos.writeInt(array[0].length);// 写入图片的高度,写入类型为整形
// 写文件内容
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
//把像素点写入文件
dos.writeInt(array[i][j]);
}
}
//关掉输出流
dos.close();
bos.close();
os.close();
x = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
读取数据
/**
* 读取的方法
* @param array 存储像素点的数组
* @param path 存储路径
* @return
*/
public int[][] open(String path){
try {
// 实例化File输入流的对象
InputStream os = new FileInputStream(path);
//实例化Buffered输入流对象
BufferedInputStream bos = new BufferedInputStream(os);
//实例化Data输入流对象
DataInputStream dos = new DataInputStream(bos);
int wigth =dos.readInt();// 读取图片的宽度,写入类型为整形
int length = dos.readInt();// 读取图片的高度,写入类型为整形
int[][] array = new int[wigth][length];
// 写文件内容
for (int i = 0; i < wigth; i++) {
for (int j = 0; j < length; j++) {
//把像素点读取文件
array[i][j] =dos.readInt();
}
}
//关掉输出流
dos.close();
bos.close();
os.close();
return array;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int[][] a = null;
return a;
}
!File流和Buffered流的区别:File流是写入一个字节就读取一个字节,而Buffered流会申请一个缓冲区,当这个缓冲区被写满后才会被读取,这样就大大的加快了运行速度,这也是File流和 Buffered流最主要的区别。
!也许会有人说为什么有了Buffered流还要用File流?
因为Buffered流是建立在File流的基础上的,如果没有File流就没有Buffered流,在使用Buffered流的时候必须实例化一个File流。