【Java学习】Java IO-流概念理解和知识点总结

来源:互联网 发布:净水器推荐知乎 编辑:程序博客网 时间:2024/05/29 10:39

流概念的理解

分类:

  1. 输入流
    从磁盘或者设备中的文件中读取数据到内存中 -其中的数据就是流

  2. 输出流
    从内存将数据读到文件中
    看下图:
    这里写图片描述

流的分类

  1. 按输入输出
    上面说过:流分为输入流和输出流

  2. 按传输单位
    字节流:8位二进制文件:mp3 mp4等多媒体文件
    字符流:16位二进制文件 :一般 txt文件

  3. 按功能
    节点流:直接操作数据源(磁盘 或 文件)
    过滤流:直接操作节点流的流,为节点流添加新的功能,使得节点流更加灵活

InputStream和OutputStream

这两个类是IO操作中最顶层的抽象类,提供一些基本的方法InputStream【又叫做字节输入流]】-read()
OutputStream【又叫做字节输出流】-write();
close()-IO操作属于操作系统底层的操作,所以字节流使用完毕需要关闭

FileInputStream和FileOutputStream

InputStream和OutputStream的子类,可以对磁盘文件,网络连接,甚至于内存缓冲区

  1. FIleInputStream可以理解为:从文件读取字节的字节输入流
    构造方法:
    FileInputStream(File file)
    FileInputStream(String path)
    一般方法:
    int read()-返回读到的下一个字节,若是到达文件末尾,返回-1;;<效率太低>
    int read(Byte[] b)-将文件中的b.length个字节读入byte[] b中·,返回读入的字节数,读不到的时候返回-1;相当于添加了一个缓冲区;

  2. FIleOutputStream可以理解为:向文件写入字节的字节输出流
    构造方法:
    FIleOutputStream(File file)
    FIleOutputStream(String path)
    FIleOutputStream(String path,boolean append)//append为true时,追加到最后一个字节的后面,否则覆盖整个文件内容
    一般方法:
    int write()-返回写入的下一个字节,若是到达文件末尾,返回-1;<效率太低>
    int write(Byte[] b)-)-将内存中的b.length个字节写入入byte[] b中·,返回写入的字节数,写不到的时候返回-1;相当于添加了一个缓冲区;
    int write(Byte[] b,int off,int len)和上面的类似,只是截取b中从off开始长为len的数据,比较常用,防止读入不需要的数据。
    测试代码如下

public class demoStream {    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        FileInputStream fis=new FileInputStream("D:/wuhuan/java.txt");        FileOutputStream fos=new FileOutputStream("D:/javanew.txt");        //使用read() write(int i)方法//      int data;//      while((data=fis.read())!=-1)//      {//          fos.write(data);//      }        //使用read(byte[] b) write(byte b,int off ,int len)和 write(byte[] b)方法        byte[] b=new byte[1024*1024];        int len=0;        while((len=fis.read(b))!=-1)        {//          fos.write(b, 0, len);            fos.write(b);        }    }}

最后通过测试,第一种方式使用了32300毫秒 第二种方式使用了16毫秒,明显单字节传输效率太低。

ByteArrayInputStream和ByteArrayOutputStream

内存到内存的流的操作

  • ByteArrayInputStream:字节数组输入流
    将字节数组作为输入流
    可以这样简单的理解:将内存中的字符串转化为字节数组,然后将字节数组中的元素一个个取出。(感觉好多余)
  • ByteArrayOutputStream:字节数组输出流 将字节数组作为输出流 但使用默认的构造函数时,会初始化一个32位的字节缓冲区,
    • 一般的方法:
      write(byte b)添加一个字节
      write(byte[] b) 添加一个字节数组
      writeTo(FileInputStream fis) 将字节数组输出流的数据输出到文件输出流中去 <个人理解:还是觉得很多余,完全可以替代,直接将字节数组byte[] b,使用 文件输出流的write(byte[] b)写入即可>

过滤流

字节过滤流-为底层的字节流提供扩展功能,对其进行封装

  • 过滤输入字节流 FilterInputStream

  • 过滤输出字节流 FilterOutputStream

  • 常用的过滤流
    • BufferInputStream/BufferOutputStream—缓冲区的处理
      相当于为文件输入输出流包装了一个byte缓冲区,直接操作缓冲流对象就可以了
      代码如下:
public class demoStream {    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        FileInputStream fis=new FileInputStream("D:/KuGou/Animals - Maroon 5.mp3");        FileOutputStream fos=new FileOutputStream("D:/javanew.mp3");        //缓冲输入输出流初始化        BufferedInputStream bis=new BufferedInputStream(fis);        BufferedOutputStream bos=new BufferedOutputStream(fos);        long time1=System.currentTimeMillis();        int data;        while((data=bis.read())!=-1)        {            bos.write(data);//等待输入缓冲流中数据填满或数据填完,就写到输出流        }        long time2=System.currentTimeMillis();        //缓冲流的close方法中包括了文件输入输出流的close方法        bis.close();        bos.close();        System.out.println(time2-time1);    }}
 - DataInputStream/DataOutputStream---基本数据的处理将基本数据类型写入到文件流中去,代码如下:
public class DemoDataStream {    public static void main(String[] args) throws IOException {        String name="liukang";        char s='K';        int age=22;        double weight=65;        boolean flag=true;        //写进去        DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:/vari.txt"));        dos.writeUTF(name);        dos.writeInt(age);        dos.writeDouble(weight);        dos.writeBoolean(flag);        dos.close();        //读出来        DataInputStream dis=new DataInputStream(new FileInputStream("D:/vari.txt"));        //读的顺序要和写的顺序一样        System.out.println( dis.readUTF());        System.out.println(dis.readInt());        System.out.println(dis.readDouble());        System.out.println(dis.readBoolean());        dis.close();    }}
0 0