*IO(2)

1.节点流与处理流

IO流根据封装类型不同可以分为节点流与处理流/包装流

⑴节点流:流对象直接对数据操作,构造方法(文件)

⑵处理流/包装流:流对象包含的是另一个流,提供一些额外数据处理

2.包装流

BufferedInputStream  &&  BufferedOutputStream

⑴普通方法进行包装,效率不高

 public static void main(String[] args) throws IOException {


        //普通方法进行实现,效率不高
        FileInputStream in = new FileInputStream("D:/show.txt");
        FileOutputStream out = new FileOutputStream("D:/show1.txt");
        BufferedInputStream bin = new BufferedInputStream(in);//对数据进行包装处理
        BufferedOutputStream bout = new BufferedOutputStream(out);
        int b = 0;
        while ((b = bin.read()) != -1) {
            bout.write(b);
        }
        bout.flush();//关闭之前,刷新缓冲区
        bin.close();
        bout.close();
    }
}

⑵用数组进行进行实现,效率较高

 public static void main(String[] args) throws IOException {

        //数组进行包装实现,效率较高
        FileInputStream in=new FileInputStream("D:\\show.txt");
        FileOutputStream out =new FileOutputStream("D:\\show1.txt");
        BufferedInputStream bin=new BufferedInputStream(in);
        BufferedOutputStream bout=new BufferedOutputStream(out,2048);


              int size=0;
              byte b[]=new byte[1024];
              while((size=bin.read(b))!=-1){
                      bout.write(b);
              }
              bout.flush();
              bin.close();
              bout.close();
    }

缓存原理:read时,会把读入数据缓存到底层数组中。write时,并不是每一次write时,就向磁盘去写数据,而是等到内部缓冲数组写满时,再向磁盘进行输出操作 。当自己的数组长度大于数组缓冲区,则直接写出,反之则先读到数组缓冲区中。

3.字符流(只能读取纯文本文件)

Reader  是字符输入流的基类 FileReader

Writer    是字符输出流的基类 FileWriter

 public static void main(String[] args) throws IOException {

        FileReader fr = new FileReader("D:/show.txt");
        FileWriter fw = new FileWriter("D:/show2.txt", true);//写入数据时,留之前的内容,向后面追加内容
        BufferedReader bfr = new BufferedReader(fr);
        BufferedWriter bfw = new BufferedWriter(fw);
        String line = null;
        while ((line = bfr.readLine()) != null) {
            bfw.write(line);
            bfw.newLine();//进行换行
        }
        bfw.flush();
        bfr.close();
        bfw.close();
    }
  }

4.打印流(字节打印流PrintStream和字符打印流PrintWriter) 

含义:单向从程序中向目标输出数据

5.ObjectStream

   ⑴对象存储在内存中,程序中止运行,内存数据清空,有时需要保存内存中的数据,需要用流对象,将对象数据存到文件中,做对象数据持久化(长久保存)

ObjectInputStream   ObjectOutputStream都属于处理流

此过程为I对象的序列化和反序列化,其中反序列也是一种创建对象的方法。

   ⑵序列化与反序列化

package com.ffyc.javaIo;

import java.io.*;
import java.util.Date;

public class Object {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //序列化
        /*FileOutputStream fos=new FileOutputStream("D:/show.txt");
        ObjectOutputStream obj=new ObjectOutputStream(fos);
        Date date=new Date();
        Car c= new Car("丰田",200);
        String s="ajbkc";
        obj.writeObject(date);
        obj.writeObject(s);*/

        
        //反序列化
        FileInputStream fin=new FileInputStream("D:/show.txt");
        ObjectInputStream ois=new ObjectInputStream(fin);
        Date date=(Date)ois.readObject();
        String s=(String)ois.readObject();
        System.out.println(date);
        System.out.println(s);
        

    }
}

6.Serializable   序列化接口 

如果需要某类对象进行序列化,那么此类必须实现Serializable 接口 ,会为类生成一个版本号,会自动默认生成,但会有一个问题,每个类改变了,版本号则重新生成。

7.transient关键字
        transient关键字修饰的内容不能生成或输出,修饰的属性在序列化中不会保存在文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值