IO流之字节流、字符流

一、IO流

1.1 什么是IO流

IO:为Input、Outout亦为输入输出

流:是一种抽象的概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质就是数据传输。

  1. 按照数据的流向

输入流:读数据

输出流:写数据

  1. 按照数据类型来分

  1. 字节流

字节输入流

字节输出流

  1. 字符流

字符输入流

字符输出流

1.2 IO流的使用场景

如果操作的是纯文本文件,优先使用字符流
如果操作的是图片、视频、音频等二进制文件。优先使用字节流
如果不确定文件类型,优先使用字节流。字节流是万能的流

二、字节流

2.1字节流的体系结构

2.2字节流的抽象基类

  • InputStream:这个抽象类是表示字节输入流的所有类的超类

  • OutputStream:这个抽象类是表示字节输出流的所有类的超类

  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

2.3数据写入的步骤

创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

调用字节输出流对象的写数据方法

释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)

2.4字节输入流、输出流对象

由体系可知,输入、输出流又有着不带缓冲字节流和带缓冲的字节流

不带缓冲字节流:FileInputStream FileOutputStream

字节缓冲流:BufferedInputStream、BufferedOutputStream

2.4.1不带缓冲的字节流的构造

FileInputStream fis = new FileInputStream("文件 相对路径或绝对路径");

FileOutputStream fos = new FileOutputStream("文件相对路径或绝对路径");

2.4.2 字节缓冲流的构造

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件或者目录的 相对路径或绝对路径"));

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件或者目录的 相对路径或绝对路径"));

2.5字节流的写入、读取数据的方式

写入的方式有如下三种

方法名

说明

void write(int b)

将指定的字节写入此文件输出流 一次写一个字节数据

void write(byte[] b)

将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据

void write(byte[] b, int off, int len)

将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\fileDemo\\ok.txt");
        fos.write(97);

        byte[] bys ={'A','B'};
        fos.write(bys);

        byte[] bys1 ={'A','B','c'};
        fos.write(bys1,1,2);
        
        fos.close();
    }

读取的方式有如下俩种

//一种是一个字节一个字节的读取
FileInputStream fis = new FileInputStream("D:\\fileDemo\\ok.txt");
        int by;
        while((by=fis.read())!=-1){
            System.out.println((char)by);
        }
        fis.close();
//第二种是以字节数组的形式读取
FileInputStream fis = new FileInputStream("D:\\fileDemo\\ok.txt");
        byte[] bys2 = new byte[1024];
        int len;
        while((len=fis.read(bys2))!=-1){
            System.out.print(new String(bys2,0,len));
        }
        fis.close();
切记,流一当使用完毕,即直接关闭流

2.6字节缓冲流

字节缓冲流的写入和读取均和字节流一致,不过由于带有缓冲区,所以比字节流更快。


三、字符流

3.1字符流的体系结构

3.2字符流的抽象基类

  • Reader:这个抽象类是表示字符输入流的所有类的超类

  • Writer:这个抽象类是表示字符输出流的所有类的超类

  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

3.3什么是字符流

由于在字节流中操作中文效率不好,所以java提供了字符流。字符流=字节流+编码表

3.4字符串的编码解码

方法名

说明

byte[] getBytes()

使用平台的默认字符集将该 String编码为一系列字节

byte[] getBytes(String charsetName)

使用指定的字符集将该 String编码为一系列字节

String(byte[] bytes)

使用平台的默认字符集解码指定的字节数组来创建字符串

String(byte[] bytes, String charsetName)

通过指定的字符集解码指定的字节数组来创建字符串

底层的字节都为负数

3.5字符输入流、输出流对象

由体系可知,输入、输出流又有着不带缓冲字符流和带缓冲的字符流

不带缓冲字符流:InputStreamReader、OutputStreamWriter

字符缓冲流:BufferedReader、BufferedWriter

3.5.1不带缓冲的字符流的构造

InputStreamReader isr = new InputStreamReader(new FileInputStream("文件或者目录的 相对路径或绝对路径"));

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("文件或者目录的 相对路径或绝对路径"));

3.5.2 字符缓冲流的构造

BufferedReader br = new BufferedReader(new FileReader("文件的 相对路径或绝对路径"));

BufferedWriter bw = new BufferedWriter(new FileWriter("文件的 相对路径或绝对路径"));

3.6字符写入、读取数据的方式

字符流写入有五种

方法名

说明

void write(int c)

写一个字符

void write(char[] cbuf)

写入一个字符数组

void write(char[] cbuf, in0t off, int len)

写入字符数组的一部分

void write(String str)

写一个字符串

void write(String str, int off, int len)

写一个字符串的一部分

这里偷个懒不演示了哈,大家可以下去尝试一下

读取的俩种方式

 InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\fileDemo\\g2.txt"));
        int ch;
        while ((ch=isr.read())!=-1) {
            System.out.print((char)ch);
        }
        isr.close();
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\fileDemo\\g2.txt"));
        char[] chs = new char[1024];
        int len;
        while ((len = isr.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }
        isr.close();
第一种是一个字符一个字符的读取,第二种是使用了字符数组。

而在字符缓冲流中,除了以上俩种读取,还可以如下

BufferedReader br = new BufferedReader(new  FileReader("D:\\fileDemo\\g2.txt"));
        String line;
        while ((line=br.readLine())!=null) {
            System.out.println(line);
        }
        br.close();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值