IO流知识点浅析

IO流

什么是流?

流就是一组有序的,有起点和终点的字节集合,是对数据传输的总称。客观一点就是数据在两设备间的传输称为流,流的本质就是数据传输,根据数据传输特性将流抽象为各种类,方便更直观进行数据操作。

IO流的分类:

1、按字节分:

  • 字节流 - InPutStream/OutPutStream
  • 字符流 - Reader/Writer

2、按方向分:

  • 输入流 - InPutStream/Reader
  • 输出了 - OutPutStream/Writer

3、按功能分:

  • 包装流(转换流) - InPuterStreamReader/OutPutStreamWriter
  • 节点流(除包装流外都是节点流)- FileOutPutStream

更详细分类如下图:

字节流

先来看字节流的例子(InPutStream/OutPutStream):

public class IODemo1 {
public static void main(String[] args) {
    FileOutputStream fos=null; // OutputStream输出流
    try {
        fos=new FileOutputStream("ab.txt");//在名叫"ab.txt"的文件中写内容
        fos.write("Hello World".getBytes());//将内容写到缓冲区
        fos.flush();    //保存到硬盘
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        CloseUtils.close(fos);//调用自己写的CloseUtils方法,实现流的关闭
    }
  }
}

将内容”Hello World”写到”ab.txt”文件中。

public class IODemo2 {
public static void main(String[] args) {
    FileInputStream fis=null;
    StringBuilder sb=new StringBuilder();
    try {
        fis=new FileInputStream("ab.txt");//读"ab.txt"文件
        byte[] buf=new byte[512];
        int len=-1; 
        while((len=fis.read(buf))!=-1){  //读文件,到-1后结束
            sb.append(new String(buf, 0, len));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        CloseUtils.close(fis);//关闭流
    }
    System.out.println(sb);
  }
}

运行结果:

Hello World

字节流综合运用(实现文件的复制功能)

 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import com.sxt.io.CloseUtils;
 public class IODemo4 {
    public static void main(String[] args) {
        copy("D:"\\java.mp4","j.mp4");定义一个copy()方法,将D盘的java.mp4文件复制到我当前工程下
    }  
    private static void copy(String from, String to) {
       BufferedInputStream bis=null;
       BufferedOutputStream bos=null;
          try {
            File file = new File(from);
            bis=new BufferedInputStream(new FileInputStream(file)); //输入流
            bos=new BufferedOutputStream(new FileOutputStream(to)); //输出流
            long total = file.length();
            long part=0;// 用来记录复制了多少
            byte[] buf=new byte[512];
            int len=-1;
            while((len=bis.read(buf))!=-1){
               bos.write(buf,0,len);
               part+=len;
               System.out.println("当前进度:"+(part*100/total)+"%");//打印复制文件的进度百分比
            }
       }catch (Exception e) {
           e.printStackTrace();
       }finally {
            CloseUtils.close(bis);//调用自己创建的工具类,实现关闭流的功能
            CloseUtils.close(bos);
        }
      }
   }

上面的代码,实现了将我D盘下的一个视频文件复制到eclipes的当前工程中,这里用到了BufferedInputStream和BufferedOutStream这两个子类,它们的父类分别是InPutStream和OutPutStream。

InputStream类常用方法:

  • int read( )
  • int read(byte[] b)
  • int read(byte[] b,int off,int len)
  • void close( )

子类FileInputStream常用的构造方法:

  • FileInputStream(File file)
  • FileInputStream(String name)

OutputStream类常用方法:

  • void write(int c)
  • void write(byte[] buf)
  • void write(byte[] b,int off,int len)
  • void close( )

子类FileOutputStream常用的构造方法:

  • FileOutputStream (File file)
  • FileOutputStream(String name)
  • FileOutputStream(String name,boolean append)

字符流

同样我们先来看两个例子:

public class IODemo15 {
public static void main(String[] args) {
    BufferedWriter bw=null;
    try {
        bw=new BufferedWriter(new FileWriter("a.txt");
        bw.write("hello world");
        bw.newLine();// 换行。
        bw.flush();
    } catch (Exception e) {
        // TODO: handle exception
    }finally {
        CloseUtils.close(bw);
    }
  }
}

上面这个代码的功能是在”a.txt”文件下写入”hello world”内容,我们发现字符流的格式几乎和字节流一模一样
。先构造BufferedWriter对象和FileWrite对象,然后调用write()方法写数据。流对象清空flush(), 流对象关闭close()。

  public static void main(String[] args) {
    BufferedReader br=null;
    try {
        //给FileReader增加了缓存功能
        br=new BufferedReader(new FileReader("abc2.txt"));
        String line=null;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }finally {
        CloseUtils.close(br);
     }
  }
 }

输出结果

hello world

上面这个代码是为了读取BufferedWriter刚写入的数据。格式也仍然和字节流相类似,构造BufferedReader对象和FileReader对象,然后调用readLine()方法读取数据。

Write类常用方法:

  • write(String str)
  • write(String str,int off,int len)
  • void close();
  • void flush();

子类BufferedWriter常用的构造方法

  • BufferedReader(Writer out)

Reader()常用方法:

  • int read()
  • int read(byte[] c)
  • read(char[]c,int off,int len)
  • void close();

子类BufferedReader特有的方法:

  • readLine()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值