Java中对IO流的全面解析

 更新时间:2025年12月02日 16:22:54   作者:酷爱码  
文章介绍了Java中IO流的分类,字符流和字节流的区别,以及字符流和字节流的常用类和方法,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一.IO流的类别

IO流分为字符流和字节流两种:

字符流:一般指文本,我们能读的懂的都可以认为是字符流。比如:文章,java文件等等。

字节流:指二进制的数据,这种数据一般用文本打开我们读不懂。比如图片文件,mp3文件等等。

二.字符流

字符流适合处理文本文件,支持字符编码,能够高效地读写文本数据。 

字符输入流(Reader)用于读取文本数据,常用类包括 FileReader 和 BufferedReader。
字符输出流(Writer)用于写入文本数据,常用类包括 FileWriter 和 BufferedWriter。

1.字符输入流

字符输入流用于从数据源(如文件、字符串等)读取字符数据。Reader 是所有字符输入流的抽象基类。
FileReader :用于从文件中读取字符数据。
InputStreamReader:将字节流转换为字符流,可以指定字符编码。
BufferedReader:提供缓冲功能,提高读取效率,支持按行读取。

import java.io.*;
public class Main {
    public static void main(String[] args) {
        // 使用 FileReader 读取文件
        try (FileReader reader = new FileReader("D:\\a.txt")) {
            int data;
            while ((data = reader.read()) != -1) {
                System.out.print((char) data); // 逐个字符读取
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 使用 InputStreamReader 读取文件 
        try (InputStreamReader reader = new InputStreamReader(new FileInputStream("D:\\a.txt"), "UTF-8")) {
            int data;
            while ((data = reader.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 使用 BufferedReader 按行读取文件
        try (BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line); // 逐行读取
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.字符输出流

字符输出流用于将字符数据写入目标(如文件、控制台等)。Writer 是所有字符输出流的抽象基类。
FileWriter:用于将字符数据写入文件。
OutputStreamWriter:将字符流转换为字节流,可以指定字符编码。
BufferedWriter:提供缓冲功能,提高写入效率,支持按行写入。

import java.io.*;
public class Main {
    public static void main(String[] args) {
        // 使用 FileWriter 写入文件
        try{
            FileWriter writer = new FileWriter("output.txt");
            writer.write("Hello, World!"); // 写入字符串
            writer.write("\nThis is a new line."); // 写入换行符
            writer.close();  //这个很重要没有这个数据写入不进去
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"));
            writer.write("Hello, World!"); // 写入字符串
            writer.write("\nThis is a new line."); // 写入换行符
            writer.close();  //这个很重要没有这个数据写入不进去
        }catch (IOException e){
            e.printStackTrace();
        }
        // 使用 BufferedWriter 按行写入文件
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
            bw.write("Hello, World!"); // 写入字符串
            bw.newLine(); // 写入换行符
            bw.write("This is a new line."); // 写入另一行
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

一定要注意写上writer.close()

3.Writer常用的五种写入方法

(1)write(int c)     
功能:写入单个字符。
参数:c 是要写入的字符(以 int 形式表示,低 16 位有效)。
(2)write(char[] cbuf)  
功能:写入字符数组中的所有字符
参数:cbuf 是要写入的字符数组。
(3)write(char[] cbuf, int off, int len)
功能:写入字符数组的一部分。
参数:cbuf:字符数组。
off:起始偏移量(从数组的哪个位置开始写入)。
len:要写入的字符数。
(4)write(String str)
功能:写入字符串。
参数:str 是要写入的字符串。
(5)write(String str, int off, int len)
功能:写入字符串的一部分。
参数:str:字符串。
off:起始偏移量(从字符串的哪个位置开始写入)。
len:要写入的字符数。

// 1. 写入单个字符
writer.write('H');
// 2. 写入字符数组
char[] array = {'e', 'l', 'l', 'o'};
 writer.write(array);
// 3. 写入字符数组的一部分
writer.write(array, 1, 2); // 写入 "ll"
// 4. 写入字符串
writer.write(", World!");
// 5. 写入字符串的一部分
String str = "\nThis is Java IO.";
writer.write(str, 0, 11); // 写入 "This is Java"

三.字节流

1.字节输入流

InputStream 是所有字节输入流的抽象基类,它定义了读取字节数据的基本方法。

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

常用方法:(1)int read():从输入流中读取一个字节的数据,返回值为读取的字节(范围是 0 - 255),如果到达流的末尾则返回 -1。
(2)int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,返回实际读取的字节数,如果到达流的末尾则返回 -1。
(3)int read(byte[] b, int off, int len):从输入流中读取最多 len 个字节的数据,并将其存储在数组 b 中,从偏移量 off 开始存储,返回实际读取的字节数,如果到达流的末尾则返回 -1。
(4)void close():关闭此输入流并释放与之关联的所有系统资源。

import java.io.*;
public class FileInputStreamTest {
    public static void main(String[] args)  {
        //定义输入流
        FileInputStream fis =null;
        try {
            //1、创建文件对象
            File file = new File("D:\\IO\\hello.txt");
            //2、创建输入流对象
            fis = new FileInputStream(file);
            //用定义字节数组,作为装字节数据的容器
            byte[] buffer =new byte[5];
            int len;//记录每次读取的字节个数
            System.out.println(fis.read(buffer));
            while ((len=fis.read(buffer))!=-1){
                //转成String型,否则输出ASCII码
                String str=new String(buffer,0,len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.字节输出流

OutputStream是所有字节输出流的父类,定义了所有字节输出流都具有的共同特征。

FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。
FileOutputStream(String name,boolean append): 创建文件输出流以指定的名称写入文件,每次输出文件是否继续拼接。

常用方法:(1)void write(byte b):把一个字节写入到文件中。
(2)void write(byte[] b):把数组b 中的所有字节写入到文件中。
(3)void write(byte[] b,int off,int len):把数组b中的字节从 off 索引开始的 len 个字节写入到文件中。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
    public static void main (String[] args)  {
        //定义字节输出流
        FileOutputStream fos =null;
        try {
            //1、创建文件对象
            File file = new File("D:\\IO\\hello.txt");
            //2、创建输出流对象
            fos = new FileOutputStream(file);
            fos.write(97);
            //后面的 \r\n表示回车换行
            fos.write("中国人!\r\n".getBytes());
            //从索引2开始输出4个字节
            fos.write("ABCDEFGH".getBytes(),2,4);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

到此这篇关于Java中Map.Entry键值对的概念与应用实践的文章就介绍到这了,更多相关Java中Map.Entry键值对内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 整合 Redis详解从基础操作到实战应用

    Spring Boot 整合 Redis详解从基础操作到实战应用

    文章介绍了SpringBoot整合Redis的必要性、步骤及核心数据类型,涵盖分布式锁、缓存注解等高级功能,并提供最佳实践如键命名规范和内存优化,强调二者结合提升应用性能与可扩展性,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • SpringBoot整合PowerJob实现定时任务调度

    SpringBoot整合PowerJob实现定时任务调度

    最近项目需要使用定时任务,而使用了PowerJob做任务调度模块,感觉这个框架真香,今天我们就来深入了解一下新一代的定时任务框架——PowerJob,需要的朋友可以参考下
    2024-03-03
  • MyBatis-Plus 查询返回实体对象还是map

    MyBatis-Plus 查询返回实体对象还是map

    这篇文章主要介绍了MyBatis-Plus 查询返回实体对象还是map,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解jvm双亲委派机制

    详解jvm双亲委派机制

    双亲委派机制保证了核心类的安全,确保不会被修改,也保证了不会加载到重复的字节码文件,这篇文章主要介绍了jvm双亲委派机制详解,需要的朋友可以参考下
    2022-11-11
  • springboot启动过程中常用的回调示例详解

    springboot启动过程中常用的回调示例详解

    springboot提供非常丰富回调接口,利用这些接口可以做非常多的事情,本文通过实例代码给大家介绍springboot启动过程中常用的回调知识感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Fluent Mybatis学习之Update语法实践

    Fluent Mybatis学习之Update语法实践

    Fluent MyBatis是一个MyBatis的增强工具,没有对mybatis做任何修改。本篇文章将详细介绍对Fluent Mybatis中的update语法进行验证。代码具有一定价值,感兴趣的小伙伴可以学习一下
    2021-11-11
  • SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式

    SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式

    这篇文章主要介绍了SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中List按自定义顺序排序的几种实现过程

    Java中List按自定义顺序排序的几种实现过程

    文章介绍Java中按省份自定义排序的三种方法:Map(高效易维护)、Enum(类型安全可扩展)、List.indexOf(简洁但效率低),推荐根据数据量和需求选择,大数据量优先Map或Enum,小数据量可用List.indexOf,强调代码可读性和维护性
    2025-07-07
  • Java中的@Accessors使用详解

    Java中的@Accessors使用详解

    这篇文章主要介绍了Java中的@Accessors使用详解,@RequiredArgsConstructor是Lombok的一个注解,简化了我们对setter和getter方法操作,它可以作用在类上,也可以作用在类的单个属性上,需要的朋友可以参考下
    2024-01-01
  • SpringBoot之Order注解启动顺序说明

    SpringBoot之Order注解启动顺序说明

    这篇文章主要介绍了SpringBoot之Order注解启动顺序说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论