IO流详解

IO分类

根据数据的流向分为

  • 输入流 : 把数据从其他设备上读取到内存中的流;
  • 输出流 : 把数据从内存中写出到其他设备上的流;

根据数据的类型分为

  • 字节流 : 以字节为单位,读写数据的流;
  • 字符流 : 以字符为单位,读写数据的流;
输入流输出流
字节流字节输入流
InputStream
字节输出流
OutputStream
字符流字符输入流
Reader
字符输出流
Writer

字节输出流 OutputStream

java.io.OutputStream此抽象类是表示字节输出流的所有类的超类;

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节输出流。
    public static void main(String[] args) throws IOException {
        //创建文件输出流FileOutputStream实例对象,第一个参数是输出的位置,第二个Boolean类型是指是否续写,false会覆盖源文件,true是续写源文件;
        FileOutputStream fos = new FileOutputStream("src\\demo\\outputStream\\a.txt",false);
        //使用write方法,参数为byte[],可以String.getBytes()方法
        fos.write("你好,世界".getBytes());
        //换行,windows: \r\n  linux: /n  mac: /r
        fos.write("\r\n".getBytes());
        //从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流
        //表示从第2个索引开始写3个
        fos.write("abcde".getBytes(),2,3);
        //写完要关闭流 
        fos.close();
    }

字节输入流 InputStream

java.io.InputStream此抽象类是表示字节输入流的所有类的超类;

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read() : 从输入流读取数据的下一个字节。读完会返回-1
  • public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src\\demo\\outputStream\\a.txt");
        //记录读取到的字节
        int len = 0;
        //判断变量len是否不等于-1,read方法读完当前字节指针会指向下一个字节,所以必须这样写
        while ((len = fis.read())!=-1){
            System.out.print((char) len);
        }
        fis.close();
    }

一次读取多个字节

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src\\demo\\outputStream\\a.txt");
        //存储读取到的多个字节
        byte[] bytes = new byte[1024];
        //记录读取到的字节
        int len = 0;
        //判断变量len是否不等于-1,read方法读完当前字节指针会指向下一个字节,所以必须这样写
        while ((len = fis.read(bytes))!=-1){
            //把字节数组的一部分转换成字符串,offset:数组的开始索引,length:转换的字节个数
            System.out.println(new String(bytes,0,len));
        }
        fis.close();
    }

字符输入流 Reader

java.io.Reader字符输入流最顶层父类,定义了一些共性的成员方法,是一个抽象类;

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() : 从输入流读取一个字符。
  • public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
    public static void main(String[] args) throws IOException {
        //创建FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr = new FileReader("src\\demo\\ioDemo\\a.txt");
        int len =0;

        //方式一,一个一个字符读取
        /*while ((len = fr.read()) != -1){
            //直接打印len是整数,要用char类型强转成字符
            System.out.println((char)len);
        }*/

        //方式二,多个读取
        char[] chars = new char[1024];
        while ((len=fr.read(chars))!= -1){
            //使用String的构造方法读取,从0开始,有效的个数
            System.out.println(new String(chars,0,len));
        }
        //释放资源
        fr.close();
    }

字符输出流 Writer

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节
输出流的基本共性功能方法。

  • void write(int c) 写入单个字符。
  • void write(char[] cbuf) 写入字符数组。
  • abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
  • void write(String str) 写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
  • void flush() 刷新该流的缓冲。
  • void close() 关闭此流,但要先刷新它。
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("src\\demo\\ioDemo\\a.txt",true);
        fw.write("找朋友玩");
        fw.close();
    }

flush()方法和close()方法的区别

  • flush方法,刷新缓冲区,流对象可以继续使用;
  • close方法,先刷新缓冲区,然后关闭资源,流对象不能再使用了;

IO流的try catch方式

JDK7以后增加了新的格式,不需要写多个繁复的try catch代码,并且代码执行完毕会自动释放资源,不需要再写close方法;
格式:
try(定义流对象,定义流对象…){
//可能会产生异常的代码
}catch(异常类变量 变量名){
异常的处理逻辑
}

public static void main(String[] args) {
        //将流对象定义在try的()中
        try (FileReader fr = new FileReader("src\\demo\\ioDemo\\a.txt")) {
            int len = 0;
            char[] chars = new char[1024];
            while ((len = fr.read(chars)) != -1) {
                System.out.println(new String(chars, 0, len));
            }
        //代码执行后会自动close资源    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值