IO流原理及流的分类

IO流原理

在这里插入图片描述

I/O 是input/output 的缩写。用于处理设备之间的数据传输。
in --> 输入,out -->输出
java 将IO 必须为“流”,即Stream .只支持单向顺序流动,这里的流动是二进制数据,我们可以理解他们是连接程序另一端口管道.用于获取发送数据到另一端。

IO流的分类:

1.根据数据的流向分为:输入流 和 输出流 (参照点是当前程序。从程序写出到另一端口,从另一端口读入到当前程序)

  • 输入流:从外界到程序,用来读取数据

  • 输出流:从程序到外界,用来写出数据

2.根据数据的操作单位分为:字节流, 字符流

  • 字节流:以字节为单位读写数据

  • 字符流:以符节为单位读写数据
    3.根据是否直接操作数据分为:节点流(低级流) 和 处理流(高级流).高低级之分只是是否能直接作用于文件。
    低级流: 也叫节点流,负责实际读写数据
    高级流(不能直接作用于文件):也叫处理流,不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对其他某些加工处理,
    简化我们的读写操作。读写数据一定是建立在低级流的基础上进行。

java定义了两个超类(抽象类)
java.io.InputStream: 所有字节输入流的超类。
java.io.OutputStream: 所有字节输出流的超类
里面定义了若干读取写出字节的相关方法,所有字节流都继承自InputStreamOutputStream.
因此无论我们将来要读写什么设备,只要使用对应的流调用相同的方法就可以。

文件流java.io.FileOutputStreamjava.io.FileInputStream。(直接连接文件
这是常用的一对字节流,也是(低级流),用于连接程序与文件(硬盘)的”管道“,负责读写数据

文件字节流

FileInputStream 和 FileOutputStream

FileOutputStream构造方法

覆盖模式

  • FileOutputStream (String path); 通过指定的路径来创建一个字节输出流对象

FileOutputStream fos = new FileOutputStream("fos.txt");当指定的文件路径不存在时,创建该文件。如果指定的文件已经存在,则每次操作写出数据到文件会覆盖之前的内容
  • FileOutputStream (File file);通过指定的文件来创建一个字节输出流对象,往原文件中写入数据的

以上构造方法创建文件输出流的是覆盖模式,如果指定的文件已经存在,则会将该文件原有数据全部抹除,然后通过当前流写出的数据保存到文件中
追加模式(非覆盖模式)

  • FileOutputStream (File file , boolean append);通过一个实际的文件来创建FileOutputStream对象,通过boolean

  • FileOutputStream (String path ,boolean append);
    文件流有重载的构造方法,允许我们传入一个boolean 类型的参数,如果该值为true,则文件流创建时是追加模式,如果指定的文件存在,则原内容全部保存,通过当前流写出的新内容会被顺序追加到文件中。

// FileOutputStream fos = new FileOutputStream("fos.txt");
//RandomAccessFile fos = new RandomAccessFile("fos.txt","rw");
FileOutputStream fos = new FileOutputStream("fos.txt",true);

FileOutputStream 和 RandomAccessFile 写文件的区别

RandomAccessFile是基于指针的随机读写形式, 可以对文件任意位置进行局部覆盖,但是文件流不行,由于java标准的IO是顺序读写形式,对于操作而言只能按顺序的先后写。不能回退,因此写操作的灵活性不如RandomAccessFile.
但是后期基于流连接,可以串联若干高级流完成复杂的读写操作,这一点上是RandomAccessFile所不及的。

通俗理解:
RandomAccessFile 就好比个体,个体的活动灵活,但是力量薄弱,File 是一个团队的一员,团队的力量强大。

package JAVA_API.num12;

import java.io.*;

/**
 * java标准IO
 * in --输入,out--输出
 * java将IO比喻为“流”,即Stream .只支持单向顺序流动,这里的流动是二进制数据,
 * 我们可以理解他们是连接程序于另一端口的管道.用于获取和发送数据到另一端。
 *
 * IO流的分类:
 * 1.根据数据的流向分为:输入流 和 输出流 (参照点是当前程序。从程序写出到磁盘,从磁盘读入到当前程序)
 * 输入流:从外界到程序,用来读取数据
 * 输出流:从程序到外界,用来写出数据
 * 2.根据数据的操作单位分为:字节流,字符流
 * 字节流:以字节为单位读写数据
 * 字符流:以符节为单位读写数据
 * 3.根据是否直接操作数据分为:节点流(低级流) 和 处理流(高级流).高低级之分只是是否能直接作用于文件。
 * 低级流:也叫节点流,负责实际读写数据
 * 高级流(不能直接作用于文件):也叫处理流,不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对其他某些加工处理,
 * 简化我们的读写操作。读写数据一定是建立在低级流的基础上进行。
 *
 * java定义了两个超类(抽象类)
 * java.io.InputStream: 所有字节输入流的超类。
 * java.io.OutputStream:所有字节输出流的超类
 * 里面定义了若干读取和写出字节的相关方法,所有字节流都继承自InputStream 和 OutputStream.
 * 因此无论我们将来要读写什么设备,只要使用对应的流调用相同的方法就可以了。
 *
 * 文件流:java.io.FileOutputStream 和 java.io.FileInputStream。(直接连接文件)
 * 这是常用的一对字节流,也是(低级流),用于连接程序与文件(硬盘)的”管道“,负责读写数据
 * @author yyc
 * 2021/9/15 14:06
 */
/* 文件字节流 练习*/
public class Test1_FOS {
    public static void main(String[] args) throws Exception {
        /*
        *FileOutputStream 的构造方法:
        * FileOutputStream (String path);通过指定的路径来创建一个字节输出流对象
        * FileOutputStream (File file);通过指定的文件来创建一个字节输出流对象,往原文件中写入数据的时候会覆盖原有文件。
        * 以上构造方法创建文件输出流的是覆盖模式,如果指定的文件已经存在,则会将该文件原有数据全部抹除,然后通过当前流写出的数据保存到文件中
        * FileOutputStream (File file , boolean append);通过一个实际的文件来创建FileOutputStream对象,
        * 通过boolean
        * FileOutputStream (String path ,boolean append);
        * 文件流有重载的构造方法,允许我们传入一个boolean 类型的参数,如果该值为true,则文件流创建时是追加模式,
        * 如果指定的文件存在,则原内容全部保存,通过当前流写出的新内容会被顺序追加到文件中。
        * */
       // FileOutputStream fos = new FileOutputStream("fos.txt");
        //RandomAccessFile fos = new RandomAccessFile("fos.txt","rw");

        //文件字节流
        FileOutputStream fos = new FileOutputStream("fos.txt",true);
        /*
        * 与RandomAccessFile 写文件的区别,RandomAccessFile是基于指针的随机读写形式,
        * 可以对文件任意位置进行局部覆盖,但是文件流不行,由于java标准的IO是顺序读写形式,对于操作而言
        * 只能顺序先后写。不能回退,因此写操作的灵活性不如RandomAccessFile.
        * 但是后期基于流连接,我们可以串联若干高级流完成复杂的读写操作,这一点上是RandomAccessFile所不及的。
        * */
        String str = "编码89757";
        //将字符串内容写出到文件,因为write / read 只能操作字节,所以需要将字符串转化为字节数组。
        byte[] data = str.getBytes("UTF-8");
        fos.write(data);
        str = "从这一刻即使你给我的名字~";
        data = str.getBytes("UTF-8");
        fos.write(data);
        fos.close();
        System.out.println("写出完毕!");
     }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值