JAVA学习笔记-----IO流

处理流类型

这里写图片描述

缓冲流

四种缓冲流常用的构造方法:
这里写图片描述

  • 缓冲输入流支持其父类的mark和reset方法;
  • BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔);
  • BufferedWriter提供了newLine用于写入一个行分隔符;
  • 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。

转换流

  • InputStreamReader和OutputStreamWriter用于字节数据到字符数据之间的转换。
  • InputStreamReader需要和InputStream”套接”。
  • OutputSreamWriter需要和OutputStream”套接”。
  • 转换流在构造时可以指定其编码集合,例如:InputStream isr=new InoutStreamReader(System.in,"ISO-8859-1")

数据流

DataInputStream和DataOutputStream直接把基础类型(比如long,float)存到内存(文件)中。

  • DataInputStream和DataOutputStream分别继承自InputStrean和OutputStream,它属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。
  • DataInputStream和DataOutputStream提供了可以存取与机器无关的JAVA原始类型数据(如:int,double等)的方法。
  • DataInputStream和DataOutputStream的构造方法为:
    DataInputStream(InputStream in)
    DataOutputStream(OutputStream out)
    举例如下:
    ByteArrayOutputStream baos = new ByteArrayOutputStream();// 分配一个字节数组内存,baos是通往内存的ByteArray的输出流
    DataOutputStream dos = new DataOutputStream(baos);// 包一个DataOutput的流
    try {
      dos.writeDouble(1.1111); // 直接写基础类型数据,占8个字节
      dos.writeBoolean(true); // 直接写基础类型数据,占1个字节

      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());// 通往内存的ByteArray的输入流
      System.out.println(bais.available());// 9个字节
      DataInputStream dis = new DataInputStream(bais);// 包一个DataInput的流
      System.out.println(dis.readDouble()); //先写的先读,要按顺序
      System.out.println(dis.readBoolean());

      dos.close();
      dis.close();
    } catch (Exception e) {
      e.printStackTrace();
    }

Print流

  • PrintWriter和PrintStream都属于输出流,分别针对于字符和字节。
  • PrintWriter和PrintStream提供了重载的print
  • Println方法用于多种数据类型的输出。
  • PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态检测错误信息。
  • PrintWriter和PrintStream有自动flush功能。
    这里写图片描述
/*测试PrintStream*/
  public static void main(String[] args) {
    PrintStream ps = null;
    try {
      FileOutputStream fos = new FileOutputStream("G:\\workplace\\learning-java\\src\\shen\\l8\\des.txt");// 指向文件的流
      ps = new PrintStream(fos);//流上包一个PrintStream
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (ps != null) {
      System.setOut(ps); // 默认指向System.out,现更改为指向ps流
    }
    int ln = 0;
    for (char c = 0; c <= 600; c++) {
      System.out.print(c + " ");
      if (ln++ >= 100) {
        System.out.println();
        ln = 0;
      }
    }
  }

Object流

  • transient关键字:不序列化
  • serializable接口:类必须实现该接口才能序列化
  • externalizable接口:外部化,需要重写readExternal(in)和writeExternal(out)方法,相当于自己实现序列化

总结

  • InputStream/OutputSream:基础抽象类
  • Reader/Writer:基础抽象类
  • FileInoutStream/FileOutputStream:文件读写字节流
  • FileReader/FileWriter:文件读写字符流
  • BufferedInputStream/BufferedOutputStream:带缓冲区的字节流
  • BufferedReader/BufferedWriter:带缓冲区的字符流
  • ByteArrayInputStream/ByteArrayOutputStream:内存里面的字节数组进行读写
  • InputStreamReader/OutputStreamWriter:转换流,字节转换成字符(没有字符转换成字节)
  • DataInutStream/DataOutputStream:直接读写基础类型数据或者UTF-8数据
  • PrintStream/PrintWriter:输出流(没有in)
  • ObjectInputStream/ObjectOutputStream:直接读写对象。transient使某变量不序列化、serializable是必须实现的接口、externalizable接口自己控制序列化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值