IO流(一)

104 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

IO流概述

  • I/O是Input/Output的缩写,I/O技 术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
  • Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。
  • java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

Java IO原理

在这里插入图片描述

IO流分类

  • 按操作数据单位不同分为:字节流(8bit),字符流(16bit)
  • 按数据流的流向不同分为:输入流,输出流
  • 按流的角色的不同分为:节点流,处理流

在这里插入图片描述 Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

在这里插入图片描述

IO流的体系结构

在这里插入图片描述

在这里插入图片描述

FileReader读入数据的基本操作

  1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
  2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
  3. 读入的文件一定要存在,否则就会报FileNotFoundException

将day06下的hello.txt文件内容读入程序中,并输出到控制台

package com.harrison.java;

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author Harrison
 * @create 2022-06-12-20:34
 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
 */
public class FileReaderWriterTest {
    public static void main(String[] args) {
        File file = new File("hello.txt");//相较于当前工程
        System.out.println(file.getAbsolutePath());

        File file1 = new File("day06\\hello.txt");
        System.out.println(file1.getAbsolutePath());
    }

    /*
    将day06下的hello.txt文件内容读入程序中,并输出到控制台

    说明点:
    1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
    2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
    3. 读入的文件一定要存在,否则就会报FileNotFoundException。

     */
    @Test
    public void testFileReader(){
        FileReader fr = null;
        try {
            //1.实例化File类的对象,指明要操作的文件
            File file = new File("hello.txt");//相较于当前Module
            //2.提供具体的流
            fr = new FileReader(file);

            //3.数据的读入
            //read():返回读入的一个字符。如果达到文件末尾,返回-1
            //方式一:
//        int data = fr.read();
//        while(data != -1){
//            System.out.print((char)data);
//            data = fr.read();
//        }

            //方式二:语法上针对于方式一的修改
            int data;
            while((data = fr.read()) != -1){
                System.out.print((char)data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流的关闭操作
//            try {
//                if(fr != null)
//                    fr.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
            //或
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在这里插入图片描述

FileWriter写出数据的操作

从内存中写出数据到硬盘的文件里

说明:
1. 输出操作,对应的File可以不存在的。并不会报异常
2.
     File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
     File对应的硬盘中的文件如果存在:
            如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖
            如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容

测试FileInputStreamFileOutputStream的使用

结论 1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 2. 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理 3. 使用字节流FileInputStream处理文本文件,可能出现乱码

缓冲流

1.缓冲流:

  • BufferedInputStream
  • BufferedOutputStream
  • BufferedReader
  • BufferedWriter

2.作用:提供流的读取、写入的速度

  • 提高读写速度的原因:内部提供了一个缓冲区
  • 处理流,就是“套接”在已有的流的基础上

说明:资源关闭的时候,要求先关闭外层的流,再关闭内层的流。但是关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略