JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

释放双眼,带上耳机,听听看~!

JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习


JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了。如果你初学,不懂IO流,你可以从前往后慢慢看,但是你工作了一段时间你会发现,流的使用场景以及技术点是非常的强硬的,我们势必要掌握这个知识点,如果你觉得翻阅API比较鼓噪,看视频得不到精髓,看书看不到要点,你就跟随我的JAVA之旅,一起去探索吧!

一.I/O概述

I/O全名:Input Output,输入输出的意思

  • IO流用来处理设备之间的数据传输
  • JAVA对数据的操作都是通过流的方式
  • JAVA用于操作流的对象都在IO包里
  • 流操作分两种:字节流,字符流
  • 流按流向分为:输入流,输出流

对数据的操作,其实就是File文件,我们可以去网上偷张图片来描述我们本大系列的所有知识点

图片来自于网络

  • 字节流的抽象积累

  • InputStream

    • OutputStream
  • 字符流的抽象基类

  • Reader

    • Writer

从图中可以看出,都是从这四个类中派生出来的子类,但是他们的后缀都是这四个

二.FileWriter

我们先从字符流开始,肯定是从子类对象下手,我们对文件操作开始吧!

  • 需求:在硬盘上创建一个文件,并且写入数据

那我们怎么去做?他构造函数比较多的,我们看例子


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1package com.lgl.hellojava;
2
3import java.io.FileWriter;
4import java.io.IOException;
5
6public class HelloJJAVA {
7    public static void main(String[] args) {
8        /**
9         * 需求:在硬盘上创建一个文件,并且写入数据
10         */
11
12        // 一被初始化就必须要有被操作的文件
13        // 如果不指定位置,就创建在同目录下
14        // 如果目录下存在同名文件,覆盖
15        try {
16            FileWriter fileWriter = new FileWriter("test.txt");
17            // 写入数据到内存
18            fileWriter.write("abcde");
19            // 刷新该流的缓冲
20            // fileWriter.flush();
21
22            // 关闭流 关闭之前会刷新,和flush的区别在于flush刷新后流可以继续工作
23            fileWriter.close();
24        } catch (IOException e) {
25            // TODO Auto-generated catch block
26            e.printStackTrace();
27        }
28    }
29}
30
31

这样在我们的项目根目录下就可以看到生成的文件了

我用白话再说一遍吧,其实就是创建fileWriter ,他没有空构造函数,你创建一个文件,可以传文件名或者路径,然后wirter写数据,这样你是看不到的,你需要刷新,刷新是刷新缓冲区,你现在就可以看到了,抛异常,还有关闭,关闭之前会刷新的,但是这个流就没用了,根据自己的场景来分析

三.IOException、

我们来看看怎么处理IO的异常,IO异常大致有三个,一个是IO异常,一个是找不到文件异常,还有一个就是没有对象异常了,我们比较严谨的写法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1package com.lgl.hellojava;
2
3import java.io.FileWriter;
4import java.io.IOException;
5
6public class HelloJJAVA {
7    public static void main(String[] args) {
8
9        FileWriter fileWriter = null;
10        try {
11            fileWriter = new FileWriter("demo.txt");
12        } catch (IOException e) {
13            // TODO Auto-generated catch block
14            e.printStackTrace();
15        } finally {
16            try {
17                if (fileWriter != null) {
18                    fileWriter.close();
19                }
20            } catch (IOException e) {
21                // TODO Auto-generated catch block
22                e.printStackTrace();
23            }
24        }
25    }
26}
27
28

四.文件续写

我们知道,文件存在的话就会覆盖,但是我们不想这样,我们想在原有的数据中续写,这该去怎么做?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1package com.lgl.hellojava;
2
3import java.io.FileWriter;
4import java.io.IOException;
5
6public class HelloJJAVA {
7    public static void main(String[] args) {
8
9        try {
10            //参数2代表不覆盖已有的文件,支持续写
11            FileWriter fileWriter = new FileWriter("demo.txt",true);
12            fileWriter.write("你好");
13            fileWriter.close();
14        } catch (IOException e) {
15            // TODO Auto-generated catch block
16            e.printStackTrace();
17        }
18
19    }
20}
21
22

构造传参的时候设置为true就可以续写文件了

五.FileReader

既然写已经会了,那我们就来读取了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1package com.lgl.hellojava;
2
3import java.io.FileNotFoundException;
4import java.io.FileReader;
5import java.io.IOException;
6
7public class HelloJJAVA {
8    public static void main(String[] args) {
9        try {
10            // 创建一个文件读取流对象,和指定名称的文件关联,保证文件存在,
11            // 如果不存在,异常
12            FileReader fileReader = new FileReader("demo.txt");
13            // 读取单个字符,自动往下读
14            int cd = fileReader.read();
15            System.out.println((char) cd);
16
17            //全部打印
18            int ch = 0;
19            while ((ch = fileReader.read()) != -1) {
20                System.out.println(ch);
21            }
22
23            fileReader.close();
24
25        } catch (FileNotFoundException e) {
26            // TODO Auto-generated catch block
27            e.printStackTrace();
28        } catch (IOException e) {
29            // TODO Auto-generated catch block
30            e.printStackTrace();
31        }
32    }
33}
34
35

这样就可以按照字节读取了,我们也可以把读到的字符存储在数组中


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1package com.lgl.hellojava;
2
3import java.io.FileNotFoundException;
4import java.io.FileReader;
5import java.io.IOException;
6
7public class HelloJJAVA {
8    public static void main(String[] args) {
9
10        try {
11            FileReader fileReader = new FileReader("demo.txt");
12            char[] buf = new char[3];
13
14            int num = fileReader.read(buf);
15
16            System.out.println("num:" + num + new String(buf));
17
18        } catch (FileNotFoundException e) {
19            // TODO Auto-generated catch block
20            e.printStackTrace();
21        } catch (IOException e) {
22            // TODO Auto-generated catch block
23            e.printStackTrace();
24        }
25
26    }
27}
28
29

OK,读出来了

六.小练习

我们字符流的读取和一些小操作算是了解了一点了,我们用一个小练习来结束本篇幅吧

  • 需求:读取一个.java的文件,打印出来

好的,其实这个是比较简单的,我们看代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1package com.lgl.hellojava;
2
3import java.io.FileNotFoundException;
4import java.io.FileReader;
5import java.io.IOException;
6
7public class HelloJJAVA {
8    public static void main(String[] args) {
9        try {
10            FileReader fileReader = new FileReader("Single.java");
11            char[] cs = new char[1024];
12            int num = 0;
13            while ((num = fileReader.read(cs)) != -1) {
14                System.out.println(new String(cs, 0, num));
15            }
16            fileReader.close();
17        } catch (FileNotFoundException e) {
18            // TODO Auto-generated catch block
19            e.printStackTrace();
20        } catch (IOException e) {
21            // TODO Auto-generated catch block
22            e.printStackTrace();
23        }
24
25    }
26}
27
28

是不是比较简单,读取到之后就直接存在数组中,打印出来

OK,到这里我们的IO入门算是了解了一点,不过这还不够,我们应该继续深入一下,我们下一篇继续跟进IO,敬请期待!

欢迎加群:555974449,我们一起探索!

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Http模块(2) CNodejs爬虫实现

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索