日常工作中,我们比较多的涉及到:读取和写入文件,比如自动化测试用例的读取,图片的上传和下载等,这篇文章主要巩固相关知识。

一、将序列化对象写入文件

/**
 * 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(字符输出流),其他相关类是根据文件的不同类型做出的衍生类,比较类似。对比的学习,有助于我们理解。