Java必备知识之IO流

221 阅读4分钟

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

1. I/O流

1.1 概述

  • IO流用来处理设备之间的数据传输
  • Java对数据的操作是通过流的方式
  • Java用于操作流的对象都在IO包中

1.2 分类

(1) 按照数据流向:输入流、输出流
(2) 按照数据类型:字节流、字符流

f9a10442c1fb4e33bee44412226d9ddb_tplv-k3u1fbpfcp-watermark.png

2. 字节流

2.1 字节输入流

2.1.1 输入流模式

image.png

2.1.2 输入流分类

image.png

2.1.3 子类实例

2.1.3.1 构造方法

a. FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
b. FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名name命名。

2.1.3.2 创建实例

import java.io.*;

//文件内容
public class Test {

    public static void main(String[] args) throws Exception{
        // 使用文件名称创建流对象.
        InputStream in = new FileInputStream("test.txt");
        // 定义字节数组,作为装字节数据的容器
        byte[] b = new byte[2];
        // 循环读取
        while (in.read(b) != -1){
            // 每次读取后,把数组变成字符串打印
            System.out.println(new String(b));
        }
        // 关闭资源
        in.close();
    }
}

2.1.4 常用方法

public void close() 关闭此输入流并释放与此流相关联的任何系统资源; public abstract int read() 从输入流读取数据的下一个字节; public int read(byte[] b) 该方法返回的int值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1。

2.2 字节输出流

2.2.1 输出流模式

输出流模式.png

2.2.2 输出流分类

e36ea154f66c49ab9aad85d5f2ec3e64.png

2.2.3 子类实例

(1) 构造方法

public FileOutputStream(File file) 根据File对象为参数创建对象; public FileOutputStream(String name) 根据名称字符串为参数创建对象。 public FileOutputStream(File file, boolean append) 创建新的输出流对象并指定是否追加续写;

(2) 创建实例

import java.io.*;

public class Test {

    public static void main(String[] args) throws Exception{
        OutputStream out = new FileOutputStream("test.txt");
        // 写入单个字节
        out.write(97);
        //换行
        out.write("\r\n".getBytes());
        // 写入字节数组
        byte[] b = new String("abcde").getBytes();
        out.write(b);
        out.write("\r\n".getBytes());
        // 写入指定长度的字节数组
        out.write(b,1,2);
		// 关闭资源
        out.close();
    }
}

2.2.4 常用方法

public void close() 关闭此输出流并释放与此流相关联的任何系统资源; public void flush() 刷新此输出流并强制任何缓冲的输出字节被写出; public void write(byte[] b) 将 b.length个字节从指定的字节数组写入此输出流; public void write(byte[] b, int off, int len) 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 也就是说从off个字节数开始读取一直到len个字节结束; public abstract void write(int b) 将指定的字节写入输出流。

3.字符流

3.1 字符输入流

java.io.Reader抽象类是字符输入流的所有类的超类(父类),可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

3.1.1 常用方法

public void close() 关闭此流并释放与此流相关联的任何系统资源;
public int read() 从输入流读取一个字符;
public int read(char[] cbuf) 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中。

3.2 字符输出流

java.io.Writer抽象类是字符输出流的所有类的超类(父类),将指定的字符信息写出到目的地。它同样定义了字符输出流的基本共性功能方法。

3.2.1 子类实例

import java.io.*;

public class Test {

    public static void main(String[] args) throws Exception{
        // 创建流对象
        Writer writer = new FileWriter("test.txt");
        writer.write(97);
        writer.write('b');
        writer.write("fsdfs");
		
        //关闭资源时,与FileOutputStream不同。 如果不关闭,数据只是保存到缓冲区,并未保存到文件。
        writer.flush();
        writer.close();
    }
}

注意:关闭资源时,与FileOutputStream不同。 如果不关闭,数据只是保存到缓冲区,并未保存到文件。

3.2.2 常用方法

void write(int c): 写入单个字符;
void write(char[] cbuf):写入字符数组;
abstract void write(char[] cbuf, int off, int len):写入字符数组的某一部分,off数组的开始索引,len写的字符个数;
void write(String str):写入字符串;
void write(String str, int off, int len):写入字符串的某一部分,off字符串的开始索引,len写的字符个数; void flush():刷新该流的缓冲;
void close():关闭此流,但要先刷新它。

4. 缓冲流

缓冲流,也叫高效流。能够高效读写缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化对象等等。

按照数据类型分类:

  • 字节缓冲流:BufferedInputStream,BufferedOutputStream
  • 字符缓冲流:BufferedReader,BufferedWriter

4.1 字节缓冲流

(1) 节缓冲输入流

// 创建一个新的字节缓冲输入流 BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size)

(2) 节缓冲输出流

// 将数据写入指定的底层输出流 BufferedOutputStream(OutputStream out) // 将具有指定缓冲区大小的数据写入指定的底层输出流 BufferedOutputStream(OutputStream out, int size)

4.2 字符缓冲流

(1) 缓冲字符输入流

// 创建一个新的缓冲字符输入流 BufferedReader(Reader in) BufferedReader(Reader in, int sz)

(2) 缓冲字符输出流

// 创建一个新的缓冲字符输出流 BufferedWriter(Writer out) BufferedWriter(Writer out, int sz)