Java中的IO体系

103 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

什么是IO?

I -- Input:从外部系统获得数据读入到内存中,比如读取文件;

O -- Output: 将数据从内存中写出到外部系统中,比如写到文件里。

java.io 包中提供了所有相关的API。

JAVA中的IO架构

image.png

字节流: 类名以 Stream 结尾,以及 System.in/out/err 传递的数据单元为字节,可以读取任何类型的文件;

字符流: 类名以 Reader/Writer 结尾,传递的数据单元为字符,主要操作的对象为文本文件。

一个简单的IO Demo

写出数据到文件

定义 FileOutputStream 将数据写到文件中

import java.io.*;
import java.nio.charset.StandardCharsets;

public class IODemo {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("D:/test.txt");
            fos.write("读取数据的DEMO".getBytes(StandardCharsets.UTF_8));
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

image.png

从文件中读入数据到内存

对上边生成的文件内容进行读取。

定义 FileInputStream 从文件中读取数据,按字节读取,如果读取的是汉字,使用字节读取可能会出现乱码的情况。

import java.io.*;

public class IODemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("D:/test.txt");
            int read = fis.read();
            System.out.println(read);
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出为 232,即第一个字节的数值,如果要转换为字符,就会变成乱码。

从文件中读入数据到内存二

解决上一步中读取数据出现乱码的情况,需要定义一个数组,用来存放读取出的字节内容,然后将字节数组转换为字符串,这里要注意文本的编码必须与原内容保持一致。

import java.io.*;
import java.nio.charset.StandardCharsets;

public class IODemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("D:/test.txt");
            //定义存放内容的字节数组
            byte[] arr = new byte[19];
            int read = fis.read(arr);
            String s = new String(arr, StandardCharsets.UTF_8);
            System.out.println(s);
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这种方法因为需要定义字节数组,数组的长度需要人为定义。

如果少了,会导致内容读取不完整;如果多了,末尾会出现无意义字符。

所以就引入了转换流,InputStreamReader

从文件中读入数据到内存三

通过字符转换流,将字节流转换为字符流,并使用 BufferedReader 按行读取文件内容。

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class IODemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("D:/test.txt");
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr);

            String s1 = br.readLine();
            System.out.println(s1);
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}