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

来源:互联网 发布:风管套料软件 编辑:程序博客网 时间:2024/06/16 11:14

处理流类型

这里写图片描述

缓冲流

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

  • 缓冲输入流支持其父类的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接口自己控制序列化。
原创粉丝点击