广告位联系
返回顶部
分享到

Java的File类和IO流其实真的不难

java 来源:互联网 作者:秩名 发布时间:2022-03-04 22:01:11 人浏览
摘要

IO流: IO流概述: IO:输入/输出(Input/Output) 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问

IO流:

IO流概述:

IO:输入/输出(Input/Output)

流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的, 常见的应用:文件复制;文件上传;文件下载等等,总而言之,涉及到传输的,都涉及到流。

IO流体系图:

在这里插入图片描述

在这里插入图片描述

既然IO是涉及文件的操作,那么一定离不开文件操作的技术:

File类:

File 类是 java.io 包中唯一代表磁盘文件本身的对象。File 类定义了一些方法来操作文件,主要用来获取或处理与磁盘文件相关的信息,像文件名、 文件路径、访问权限和修改日期等,还可以浏览子目录层次结构。

File 类表示处理文件和文件系统的相关信息。File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性。所以和IO搭配在一起进行读出和写入的操作。

先看一张File类常用的方法总汇图:

在这里插入图片描述

使用createNewFile()创建一个文件:

1

2

3

4

5

6

7

public class test01 {

    public static void main(String[] args) throws IOException {

        //先建立一个File对象,并传入路径

        File file1 = new File("G://abc.txt");

        //创建空文件,如果没有存在则新建一个,并且返回True,如果存在了就返回false

        System.out.println(file1.createNewFile());  

}       

如果执行后,该目录没有这个文件,那么会创建一个,并且返回true,如果已经存在了,就会返回false,代表创建失败。

在这里插入图片描述

使用mkdir()创建一个目录:

1

2

3

File file2 = new File("G://a");

    System.out.println(file2.mkdir());  

//创建一个目录,如果没有存在则新建一个,并且返回True,如果存在了就返回false

使用mkdirs()创建多级目录:

1

2

3

File file3 = new File("G://a//b//c");

        System.out.println(file3.mkdirs());  

//创建多级目录,如果没有存在则新建一个,并且返回True,如果存在了就返回false

在这里插入图片描述

接着我们需要使用IO流里面的功能对文件进行输入和输出:

先介绍四个常用的流:

  • 字节输入流:InputStream
  • 字节输出流:OutputStream
  • 字符输入流:Reader
  • 字符输出流:Writer

为什么会有字节和字符两种流呢?

ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。

UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。

Unicode 编码中,一个英文为一个字节,一个中文为两个字节。

所以我们知道计算机读取数据是一个一个的读取,当文件里面是数字或者英文的时候,因为都占了一个字节,所以可以正常读取出来。
那么如果是汉字呢?最少也占了两个字节,如果把一个汉字拆分读取,显示出来肯定是有问题的。

小结:如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流!

下面是四种流对应功能的方法名总汇表:

在这里插入图片描述

字节输出流:

我们使用字节输出流给abc.txt文件里面写一句话:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class test01 {

    public static void main(String[] args) {

        try{

              //创建输出流对象:

            OutputStream fos = null;

            fos = new FileOutputStream("G://abc.txt");

            String str = "今天的博客是IO流";

            //先将需要写入的字符打散成数组:

            byte[] words = str.getBytes();

            //使用写入的功能

            fos.write(words);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

运行后:

在这里插入图片描述

字节输入流(从文件读取到控制台):

我们知道如果文件内是汉字,使用字节输入流,那么显示的肯定是乱码,如果现在文件里面是“我爱中国”这四个字,使用下面这段代码:

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

public class test02 {

    public static void main(String[] args) {

        //创建字节输入流对象:

        InputStream fis = null;

        try{

            fis = new FileInputStream("G://abc.txt");

            int data;

            //fis.read()取到每一个字节通过Ascll码表转换成0-255之间的整数,没有值返回-1

            while((data=fis.read())!=-1){

                //(char) data 将读到的字节转成对应的字符

                //中文的字符是2+个字节组成

                System.out.print((char) data);

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }finally {

            try{

                fis.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

输出的结果是:

在这里插入图片描述

然后把文件内信息换成英文和数字:

在这里插入图片描述

结论:有汉字的文件读取不能用字节流

字符输出流:

我们使用字符输出流给abc.txt文件里面写几句话:

1

2

3

4

5

6

7

8

9

10

11

12

13

public class test03 {

    public static void main(String[] args) {

        try{

            //使用字符输出流的FileWriter写入数据

            Writer fw = new FileWriter("G://abc.txt");

            fw.write("我们在学Java");

            fw.write("一起加油");

            fw.close(); //关闭资源

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

在这里插入图片描述

也没用问题,我们发现,使用字符流写中文汉字更方便。

字符输入流:

可以设置缓存流提高获取值的效率:

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

public class test04 {

    public static void main(String[] args) throws IOException {

        //创建字符输入流对象:

        Reader fr = null;

        try{

            fr = new FileReader("G:/abc.txt");

            //借助字符流对象创建了字符缓存区 把字符一个一个的取到后先放到缓存区

            //然后一起再读写到程序内存来,效率更高

            BufferedReader br = new BufferedReader(fr);

            //先去缓存区一行一行的读取

            String line = br.readLine();

            while(line != null){

                System.out.println(line);

                line = br.readLine();

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }finally {

            try {

                fr.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

当文件内的信息为多行的时候:

在这里插入图片描述

字节流和字符流总结:

  • IO是文件的输入和输出,我们要想去对文件或者写,或者通过程序发送消息给另外的用户都要用到流。
  • IO流分 字节流和字符流,字节流是以字节为单位IO,字符流是以字符为单位IO;通常读写图片、视频音频等用字节 流,如果读写文件的内容比如中文建议用字符流。

总结

IO流还有很多方法操作,比如复制文件、缓冲流(增加缓冲功能,避免频繁读写硬盘)、转换流(实现字节流和字符流之间的转换)、数据流(提供将基础数据类型写入到文件中,或者读取出来)等等


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/m0_57310550/article/details/123261674
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计