【JavaEE初阶】文件操作 和 IO (下篇)

☕导航小助手☕

    🍚写在前面

          🧇三、文件内容的操作

               🍣🍣3.1 读文件

                         🧀🧀🧀3.1.1 使用字节流读文件

                         🥡🥡🥡3.1.2 使用字符流读文件 

                         🦪🦪🦪3.1.3 使用Scanner读取文件(推荐)

               🍱🍱3.2 写文件

                         🍛🍛🍛3.2.1 使用字节流写文件

                         🍰🍰🍰3.2.2 使用字符流写文件

                         🥩🥩🥩3.2.3 使用PrintWriter写文件

          🍜四、代码案例

               🍤🍤4.1 文件查找功能

               🍔🍔4.2 复制普通文件

               🥐🥐4.3 获取含有指定字符串的普通文件


写在前面

这篇博客是关于 文件操作和IO 的下半篇的内容,主要介绍的是 文件内容的各种操作 ~

若想看上半篇的内容,请通过下面的传送门进行传送:

🚪传送门🚪【JavaEE初阶】文件操作 和 IO (上篇)

现在,接着上半篇的内容继续介绍 ......

三、文件内容的操作

关于文件读写的操作,主要分为这几大块:打开文件、关闭文件、读文件、写文件 ~

其中,读写文件 是关键操作 ~

但是,在读写文件之前,必须要打开文件;在使用完毕之后,必须要关闭文件 ~

在 Java中,关于文件读写,提供了几组相关的类(是父类,还有许多其他子类继承):

  1. 第一组:InputStream类、OutputStream类 ——> 字节流(以字节为单位的流,用来操作二进制文件的)
  2. 第二组:Reader类、Writer类 ——> 字符流(以字符为单位的流,用来操作文本文件的)

关于 "流",是计算机中一种常见的概念 ~

比如说,如果想接住 100ml的水 ~

可以一次接 100ml,一次就搞定;可以一次接 50ml,两次就搞定;可以一次接 10ml,十次就搞定 ......

类似于水流,可以随心所欲的控制 读写的数据量 ~

如:想 读/写 100字节的数据 ~

可以一次 读/写100字节,一次就搞定;可以一次 读/写50字节,两次就搞定;可以一次 读/写10字节,十次就搞定 ......

于是,我们就把这种 读/写 方式,称为 面向流的读/写方式 ~ 


3.1 读文件

3.1.1 使用字节流读文件

我们可以在 Idea 上输入 InputStream类,点击 Ctrl + 左键,便可以发现,InputStream 是一个抽象类,不可以直接 new,需要使用 new InputStream 子类的方式来进行实例化: 

方法:

关于 InputStream类 的常用方法有下面几个:

修饰符及返回值类型 方法 说明
int(其实返回的是 byte) read() 读取一个字节的数据,如果读取到文件末尾(EOF),则返回 -1
int read(byte[ ]  b)

把文件中读到的内容,往 b数组中塞,b数组是"输出型参数";返回值是 读取成功的字节个数(往 b数组 塞的个数);-1表示已经读完了

int read(byte[ ] b,int off,int len) 从 b[ off ] 这个位置开始塞,最多塞 len - off 这么多个字节  ;返回值是 读取成功的字节个数(往 b数组 塞的个数);-1表示已经读完了
void close() 关闭字节流

需要注意的是,要在打开之后 一定记得要关闭文件!!!

—— 需要释放资源(内存、文件描述符表)

—— 如果打开文件之后,忘记关闭,造成的结果非常大的(文件资源泄露,就像是定时炸弹一样,并不是马上就泄露完,这就非常的麻烦了)~

一个进程,会使用PCB来描述(此时 只考虑单线程)~

PCB 里面有很多属性,文件描述符表 就是其中的一个属性,它可以看作是一个数组(顺序表),其中的每个元素 都对应着当前打开的文件,这个数组的下标 就称为 "文件描述符" ~

每次打开文件,都会在文件描述符表中 占据一个位置,每次关闭文件,都会释放一个位置;由于文件描述符表的长度是存在上限的,所以如果一个线进程一直在打开文件,没有释放文件,此时就会导致 后续进程在打开的时候失败!!!

代码示例:

package file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Demo6 {
    //使用一下 InputStream类
    public static void main(String[] args) throws IOException {
        // 1.打开文件
        //打开文件成功,就得到了 InputStream对象,
        //后续针对文件的操作,都是通过 InputStream 来展开的
        // (就相当于是 空调遥控器 可以操控空调,内存中的 InputStream对象 可以操控硬盘里面的 test2.txt文件)
        //像 inputStream 这一类的 “遥控器”,在计算机中 我们通常称为:句柄(Handler)
        InputStream inputStream = new FileInputStream("./test2.txt");

        // 2.读取文件
        while (true) {
            int b = inputStream.read();
            if(b == -1) {
                //此时,文件读完了
                break;
            }
            System.out.println(b);
        }

        // 3.关闭文件
        //关闭文件,以释放 内存资源 和 文件描述符表
        inputStream.close();
    }
}

同时,我在 test2.txt 文件下输入了:hello 

运行结果:


-- 当然,我们也可以采用其他的 read方法 来读取数据
-- 这里可以把 2.读取文件 的代码改成:
        byte[] b = new byte[1024];
        int len = inputStream.read(b);
        System.out.println(len);
        for (int i = 0; i < len; i++) {
            System.out.println(b[i]);
        }

 此时,运行的结果是:</

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呀是小张啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值