日常工作中,我们比较多的涉及到:读取和写入文件,比如自动化测试用例的读取,图片的上传和下载等,这篇文章主要巩固相关知识。
一、将序列化对象写入文件
/**
* Des:1、创建FileOutputStream
* 2、如果文件不存在,会自动创建
* 3、创建存取文件的对象
*/
FileOutputStream fileOutputStream = new FileOutputStream("YokaTest.txt");
/**
* Des: 1、创建ObjectOutputStream
* 2、该方法可以写入对象,需要传入文件对象
*/
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//将对象写入文件
objectOutputStream.writeObject(characterOne);
objectOutputStream.writeObject(characterTwo);
//关闭ObjectOutputStream
objectOutputStream.close();
注:1、当对象被序列化时,该对象引用的实例变量和其他对象均被序列化
二、序列化(Serializable)
序列化比较简单,Serializable接口是一个标记接口,唯一的作用就是声明实现它的类能被序列化,也就是说,此类型的对象可以通过序列化的机制进行保存,如果某个类可以被序列化,那么它的子类也可以被序列化。
当序列化一个类时,发现调用的一个对象(实例变量)未实现Serializable接口,支持使用transient(瞬时)做标记,当序列化时,则将该实例变量跳过。
三、File操作
File指文件存储的路径,并不是文件的内容,我们可以通过该类提供的方法判断文件是否存在或者路径是否正确,然后将对象传给FileWriter或者FileInputStream。
//1、创建磁盘上的文件
File file = new File("YokaTest.txt");
//2、文件下创建目录
File shiGuang = new File("ShiGuang");
shiGuang.mkdir();
//3、列出目录下的内容
if (shiGuang.isDirectory()){
String[] list = shiGuang.list();
for (int i = 0;i < list.length;i++){
System.out.println("/n"+list[i]);
}
}
//4、获取目录的绝对路径
System.out.println(shiGuang.getAbsolutePath());
//5、删除目录,返回true/false
boolean res = shiGuang.delete();
四、缓冲区
当我们去超市买东西,选中一个商品就去结账一次,会显得很麻烦,当把商品放到购物车中一起去结账,就会大大提高购物效率,缓冲区就是购物车。
当然,我们可以使用FileWrite中的Write方法向文件中写内容,但是会出现多次写入磁盘的操作。
将内容先写入缓冲区,当缓冲区满了,会自动写入磁盘,减少对磁盘的操作次数,提高写入的效率。缓冲区未满,若想将内容写入磁盘,可以使用write.flush()强制写入。
try {
File file1 = new File("YokaTest.txt");
//连接文件
FileReader fileReader = new FileReader(file1);
//使用BufferReader进行读取,提高读取效率
BufferedReader bufferedReader = new BufferedReader(fileReader);
//用line接收读取的结果
String line = null;
while ((line = bufferedReader.readLine()) != null){
//读一行写一行
System.out.println(line);
}
//关闭bufferReader
bufferedReader.close();
}catch (Exception e){
e.printStackTrace();
}
五、总结
关于IO流主要分为5个类,File(文件类),InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流),其他相关类是根据文件的不同类型做出的衍生类,比较类似。对比的学习,有助于我们理解。