一、输入输出流
流的概念:Java中流相当于一个通道,其流的作用就是用来进行数据的传输的。
流的工作原理:Java中所有I/O机制都是通过流来进行输入输出的,流表示数据以有序的序列流动,相当于一条小溪一样流着,并且具有方向性:输入流、输出流。
流的实现方法:现实中数据是多种形式的,有字节、有字符等。所以发明了用不同的类来实现不同的数据进行输入和输出流,这些类被存放在java.io包中。
流的两大类型和四大类:
1、以字节为单位读取和写入文件的字节流
- InputStream: 向内输入数据,数据单位都是字节(8位)。
- OutputSteam:向外输出数据,数据单位都是字节(8位)。
2、以字符为单位读取和写入文件的字符流
- Reader:向程序中输入数据,数据单位都是字符(16位)。
- Writer:向外输出数据,数据单位都是字符(16位)。
二、写入(输出)文本OutputStream
当我们需要把数据写入到磁盘某文件文本中时使用OutputStream类,此文章以对象为基本单位输入输出(这就需要使用增强类ObjectOutputStream)。
1、首先使用OutputStream的子类FileOutputStream实例化一个对象fos
2、接着使用增强类ObjectOutputStream实例化一个对象oos(ObjectOutputStream类必须要fos作为参数传入)
3、使用增强类ObjectOutputStream实例化的对象oos调用方法 writeObject(obj)进行写入(输出)对象数据
4、关闭流通道close()
代码演示:
public void WriteObj(Student stu) {//写输出对象函数,参数是学生对象
FileOutputStream fos = new FileOutputStream(path, true);//指定输出流的目的地路径path,true代表不会刷新原文件只是从末尾继续写入数据
ObjectOutputStream oos = new ObjectOutputStream(fos);//因为FileOutputStream功能不强不能直接对一个对象写。所以使用ObjectOutputStream类创建一个对象调用其写对象的方法来加强。但是真正写入的功能还是FileOutputStream来完成的
oos.writeObject(stu);//输出,写入对象数据到文件
fos.close();//关闭流
}
三、读取(输入)文本InputStream
当我们需要把数据从磁盘某文件文本中读出时使用InputStream类,此文章以对象为基本单位输入输出(这就需要使用增强类ObjectInputStream)。
public List<Student> ReadAllObj() {//返回类型为List,输入读取对象函数
List<Student> lstStus = new ArrayList<Student>();//List接口对象lstStus,把ArryList类创建的对象赋值给接口对象
Student stu = null;//声明一个学生对象,还未创建
FileInputStream fis = new FileInputStream(path);//创建字节输入流读取对象,并指定目标路径path
ObjectInputStream ois;//ObjectInputStream增强功能
while (fis.available() > 0) {//判断文件是否已经读到最后一个
ois = new ObjectInputStream(fis);//创建增强版读取输入流对象ois,下面使用该对象的增强版函数可读取整个对象
stu = (Student) ois.readObject();//直接调用readObject函数,一读取读整个对象出来
lstStus.add(stu);//读取到的对象存放到数组对象lstStus
}
fis.close();
return lstStus;
}
四、优化整合FileHelper
package DB;
import core.Student;
import java.util.List;
import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class FileHelper {
final String path = "E:\\OTHER\\JAVA\\obj.data";//文本的路径
public void WriteObj(Student stu) {//写 输出对象函数,参数是学生对象
FileOutputStream fos = null;//定义一个字节输出流对象
try {
fos = new FileOutputStream(path, true);//指定输出流的目的地路径,true代表不会刷新原文件只是从末尾继续写入数据
ObjectOutputStream oos = new ObjectOutputStream(fos);//因为FileOutputStream功能不强不能直接对一个对象写
//所以使用ObjectOutputStream类创建一个对象调用其写对象的方法来加强。但是真正写入的功能还是FileOutputStream来完成的
oos.writeObject(stu);//输出,写入对象数据到文件
} catch (FileNotFoundException ex) {
Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
fos.close();
} catch (IOException ex) {
Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public List<Student> ReadAllObj() {//返回类型为List,输入 读取对象函数
List<Student> lstStus = new ArrayList<Student>();//List接口对象lstStus,把ArryList类创建的对象赋值给接口对象
try {
Student stu = null;//声明一个学生对象,还未创建
FileInputStream fis = new FileInputStream(path);//创建字节输入流读取对象,并指定目标路径path
ObjectInputStream ois;//ObjectInputStream增强功能
while (fis.available() > 0) {//判断文件是否已经读到最后一个
ois = new ObjectInputStream(fis);//创建增强版读取输入流对象ois,下面使用该对象的增强版函数可读取整个对象
stu = (Student) ois.readObject();//直接调用readObject函数,一读取读整个对象出来
lstStus.add(stu);//读取到的对象存放到数组对象lstStus
}
fis.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(FileHelper.class.getName()).log(Level.SEVERE, null, ex);
}
return lstStus;
}
}