IO流(1):基础字节流、字符流

一、IO概述

1. 什么是IO?

  • 把计算机上数据的传输,按照流动的方向,以内存为基准,分为输入input输出output
  • 所谓的IO操作,就是利用java.io包下的内容,进行输入输出操作

2. IO的分类

2.1 按流动的方向分

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

2.2 按数据的类型分

  • 字节流:以字节为单位,读写数据的流
    • 字节流处理的最基本单位是单个字节,通常用来处理二进制数据。
  • 字符流:以字符为单位,读写数据的流
    • Java中的字符流处理的最基本单位是Unicode码元,(大小2字节)。通常处理文本数据

3. IO流中的根类

在这里插入图片描述

二、字节流

在这里插入图片描述

1. 一切皆字节

  • 一切文件数据(文本、图片、视频等)在存储的时候,都是以二进制数据保存的,最后都是一个一个的字节,那么在传输的时候肯定也是一样的
  • 所以,字节流可以传输任意文件数据,在操作流的时候,需要明确的一点是,无论使用什么样的流对象,底层传输的始终都只是二进制数据,也就是字节

2. 字节输出流(抽象类):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):写入指定的字节到这个输出流

3. FileOutputStream

  • java.io.FileOutputStream:文件输出流,将数据写出到文件。也就是抽象类OutputStream最简单的一个继承类

3.1 构造方法

  • public FileOutputStream(File file):创建文件输出流以写入指定的File对象表示的文件

  • public FileOutputStream(String name):创建文件输出流以指定的名称写入文件

  • 当创建一个流对象的时候,必须传入一个文件路径。该路径下:

    • 如果没有这个文件,则会创建该文件
    • 如果有这个文件,会清空该文件的数据
  • 示例代码

public class FileOutputStreamConstructor_Demo01 {
   

    public static void main(String[] args) throws IOException {
   
        //使用File对象创建流对象
        File file = new File("aa.txt");
        FileOutputStream fos = new FileOutputStream(file);

        //使用文件名创建流对象
        FileOutputStream fos1 = new FileOutputStream("b.txt");

    }
}
  • 效果:在当前项目的根目录下存在了两个txt文件

在这里插入图片描述

3.2 写出字节数据

3.2.1 写出单个字节
  • 写出字节write(int b),每次可以写出一个字节数据
  • 代码
public class FOSWrite_Demo02 {
   

    public static void main(String[] args) throws IOException {
   
        //0. 使用文件名创建流对象
        FileOutputStream fos = new FileOutputStream("fos.txt");
        //1. 写出数据
        fos.write(97);//1.1 对应ASCII码中 的a
        fos.write(98);
        fos.write(99);
        //2. 关闭资源
        fos.close();
    }
}

  • 结果
    在这里插入图片描述
  • 注意这里int类型的大小是4个字节,但只会保留一个字节的信息写出,也就是第一个字节的int值
3.2.2 写出字节数组
  • write(byte[] b):每次写出数组中的数据

  • 代码

public class FOSWrite_Demo03 {
   

    public static void main(String[] args) throws IOException {
   
        //0. 使用文件名创建流对象
        FileOutputStream fos = new FileOutputStream("fos.txt");
        //1. 字符串转换为字节数组
        byte[] b = "正在学IO".getBytes();
        //2. 写出字节数组
        fos.write(b);
        //3. 关闭资源
        fos.close();
    }
}

  • 效果
    在这里插入图片描述
3.2.3 写出指定起点和长度的字节数组
  • write(byte[] b, int off, int len):从off开始,往后len个字节

  • 代码

public class FOSWrite_Demo04 {
   

    public static void main(String[] args) throws IOException {
   
        //0. 使用文件名创建流对象
        FileOutputStream fos = new FileOutputStream("fos.txt");
        //1. 字符串转换为字节数组
        byte[] b = "abcde".getBytes();
        //2. 写出指定开始位置和长度的 字节数组
        //2.1 起始位置(索引) = 2:c
        //2.2 长度=2,从起始位置算起, cd
        fos.write(b,2,2);
        //3. 关闭资源
        fos.close();
    }
}

  • 效果
    在这里插入图片描述

  • 上述的写出字节数据,可以这样理解吗:通过fos这个输出流对象,把内存中的数据以字节为单位输出到了指定的一个文件中去

3.3 数据追加续写(2个相关的构造方法)

  • 上面的写出方式中,每创建一个流对象,都会先清空掉文件中的内容
  • 如何在保留文件内容的基础上,再往后面进行写入数据呢?
3.3.1 相关方法(构造方法)
  • public FileOutputStream(File file, boolean append):创建文件输出流写入由指定的File对象表示的文件

  • public FileOutputStream(String name, boolean append):创建文件输出流,以指定的名称写入文件

  • 上述方法中的boolean类型的append

    • true:表示追加数据
    • false:表示清空原有数据
  • 代码

public class FOSWrite_Demo05 {
   

    public static void main(String[] args) throws IOException {
   
        //0. 使用文件名创建流对象
        FileOutputStream fos = new FileOutputStream("fos.txt",true);
        //1. 字符串转换为字节数组
        byte[] b = "追加写入".getBytes();
        //2. 写出字节数组
        fos.write(b);
        //3. 关闭资源
        fos.close();
    }
}
  • 写入前
    在这里插入图片描述
  • 写入后
    在这里插入图片描述

3.4 写出换行

3.4.1 不同操作系统换行的不同
  • Windows系统里,每行结尾是 回车+换行 ,即\r\n
    • 回车符\r:回到一行的开头(return)。
    • 换行符\n:下一行(newline)。
  • Unix系统里,每行结尾只有 换行 ,即\n
  • Mac系统里,每行结尾是 回车 ,即`r `。从 Mac OS X开始与Linux统一
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值