深入理解Java IO流:高效数据输入输出的利器

Alt

🎈个人主页:程序员 小侯
🎐CSDN新晋作者
🎉欢迎 👍点赞✍评论⭐收藏
✨收录专栏:Java知识介绍
✨适用于:Java初学者
🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

简介

  • 在计算机编程中,IO(Input/Output)流是一种用于处理输入和输出操作的机制,它是与外部设备(如文件、网络连接等)交换数据的重要手段。Java提供了丰富的IO流类库,使得数据的读取和写入变得高效、灵活而且可靠。本文将深入探讨Java IO流的基本概念、不同类型的IO流以及一些常见的用例。

Alt

基本概念

  • IO流可以看作是数据从源到目标的一条流水线,其中数据可以是字节或字符。Java中的IO流主要分为两大类:字节流和字符流。字节流适合处理二进制数据,而字符流则更适合处理文本数据。

字节流

  • 字节流以字节为单位进行数据传输,是数据传输的基本形式。在Java中,字节流由两个抽象类InputStream和OutputStream衍生而来。常见的字节流有FileInputStream和FileOutputStream,它们用于读取和写入字节数据。

字节输出流:OutputStream(抽象类)

字节输出流(OutputStream)用于将字节数据写入到数据源中。它是处理数据输出的基本工具,以下是其主要方法:

close(): 关闭输出流,释放资源。
flush(): 刷新输出流,将缓冲区中的数据写入目标。
write(int b):写入一个字节数据。
write(byte b[]): 写入字节数组数据。
write(byte b[], int off, int len): 写入字节数组的一部分数据。

Alt

字节输出流的子类:FileOutputStream

FileOutputStream 是 OutputStream 的子类,用于将字节数据写入文件。它提供了许多方法来实现字节数据的输出操作:
构造方法:通过文件路径或文件对象创建 FileOutputStream 对象。

FileOutputStream(String name)
FileOutputStream(File file)

写出数据:通过 write 方法写出数据。

write(int b) 一次写一个字节数据
write(byte b[]) 保存一个字节数组的数据 (重点)
write(byte b[],int off, int len) byte数组 保存开始位置 保存个数

数据追加:通过构造方法的参数指定是否追加写入数据到已存在的文件。

FileOutputStream(String name, boolean append)
FileOutputStream(Filefile, boolean append)
append:true-----追加;false-----清空原文件中的内容

写出换行:通过写出 “\r\n”(Windows 换行)实现换行操作。

示例:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileWriteExample {

    public static void main(String[] args) {
        // 创建一个名为 "b.txt" 的文件
        File file = new File("b.txt");

        try {
            // 打开文件的输出流,并设置为追加模式
            FileOutputStream fileOutputStream = new FileOutputStream(file, true);

            // 定义要写入文件的内容
            byte[] contentBytes = {97, 98, 99, 100, 101}; // 字节内容
            String newLine = "\r\n"; // 换行符

            // 写入换行符和字节内容到文件
            fileOutputStream.write(newLine.getBytes()); // 写入换行
            fileOutputStream.write(contentBytes); // 写入字节内容

            // 关闭输出流
            fileOutputStream.close();

            System.out.println("文件写入完成。");

        } catch (IOException e) {
            System.out.println("出现IO异常:" + e.getMessage());
        }
    }
}

字节输入流:InputStream (抽象类)

字节输入流(InputStream)用于从数据源读取字节数据。它是处理数据输入的基本工具,以下是其主要方法:

int read(): 读取一个字节数据>
int read(byte b[]): 读取一定数量的字节数据
int read(byte b[], int off, int len): 从字节数组的指定位置 off 开始读取 len 个字节数据,并存储在数组 b 中。
void close(): 关闭输入流,释放资源。

Alt

字节输入流的子类:FileInputStream

FileInputStream 是 InputStream 的子类,用于从文件中读取字节数据。以下是其主要特点:
构造方法:通过文件路径创建 FileInputStream 对象。

FileInputStream(String name)
FileInputStream(File file)

读出数据:通过read方法读出数据。

int read(): 读取一个字节数据,并返回其对应的整数值(0-255)。若达到流的末尾,返回 -1。

int read(byte b[]): 读取一定数量的字节数据,并存储在字节数组 b 中。返回实际读取的字节数,若无数据可读则返回 -1。
int read(byte b[], int off, int len): 从字节数组的指定位置 off 开始读取 len 个字节数据,并存储在数组 b 中。返回实际读取的字节数,若无数据可读则返回 -1。(重点)

示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileReadExample {

    public static void main(String[] args) {
        // 创建一个文件对象,指向 "D:\\a\\b.txt"
        File file = new File("D:\\a\\b.txt");

        try {
            // 创建文件输入流
            FileInputStream fis = new FileInputStream(file);

            // 定义一个字节数组,用于存储读取的数据
            byte[] buffer = new byte[2];

            int bytesRead; // 用于记录实际读取的字节数

            // 循环读取数据
            while ((bytesRead = fis.read(buffer)) != -1) {
                // 将字节数组中的数据转换为字符串,并指定有效的数据长度
                String content = new String(buffer, 0, bytesRead);

                // 输出读取到的内容
                System.out.println(content);
            }

            // 关闭文件输入流
            fis.close();

        } catch (IOException e) {
            System.out.println("出现IO异常:" + e.getMessage());
        }
    }
}

字符流

  • 字符流以字符为单位进行数据传输,能够处理字符编码和解码。在Java中,字符流由两个抽象类Reader和Writer衍生而来。常见的字符流有FileReader和FileWriter,它们用于读取和写入字符数据。

字符输出流:Writer

字符输出流(Writer)用于以字符为单位将数据写入到数据源中。以下是其主要方法:

void write(int c): 写入一个字符。
void write(char cbuf[]): 写入字符数组中的所有字符。
void write(char cbuf[], int off, int len): 写入字符数组的一部分字符。
void write(String str): 写入字符串。
void write(String str, int off, int len): 写入字符串的一部分。
void flush(): 刷新输出流,将缓冲区的数据写入目标。
void close(): 关闭输出流,释放资源。

Alt

字符输出流的实现类:FileWriter

FileWriter 是 Writer 的子类,用于将字符数据写入到文件中。以下是其主要特点:

构造方法

FileWriter(String fileName): 通过文件路径创建 FileWriter 对象。 FileWriter(File
file): 通过文件对象创建 FileWriter 对象。

写出功能

void write(int c): 写入一个字符。
void write(char cbuf[]): 写入字符数组中的所有字符。
void write(String str): 写入字符串。(重点)

示例:

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class FileWriterExample {

    public static void main(String[] args) {
        // 创建一个 FileWriter 对象,用于向 "info.txt" 文件中追加内容
        try (FileWriter fileWriter = new FileWriter("info.txt", true)) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入信息:");
            String str = null;

            // 无限循环读取用户输入,直到输入 "886" 为止
            while (true) {
                str = scanner.next();
                if ("886".equals(str)) {
                    break;
                }
                
                // 换行符和用户输入的内容写入文件
                String str1 = "\r\n"; // 换行
                fileWriter.write(str1);
                fileWriter.write(str);
            }
        } catch (IOException e) {
            System.out.println("写入文件时发生异常:" + e.getMessage());
        }
    }
}

Alt

字符输入流:Reader

字符输入流(Reader)用于以字符为单位从数据源中读取数据。以下是其主要方法:

int read(): 读取一个字符。
int read(char[] c): 读取一定数量的字符,并存储在字符数组 c 中。
read(char[] cbuf, int off, int len): 从字符数组的指定位置 off 开始读取 len个字符,并存储在数组 c 中。
void close(): 关闭输入流,释放资源。

字符输入流的实现类:FileReader

FileReader 是 Reader 的子类,用于从文件中以字符为单位读取数据。以下是其主要特点:

构造方法

FileReader(String fileName): 通过文件路径创建 FileReader 对象。 FileReader(File
file): 通过文件对象创建 FileReader 对象。

读取功能

int read(): 从流中读取一个字符,并返回其整数值。若到达文件末尾,返回 -1。
int read(char[] c):从流中读取一定数量的字符,并存储在字符数组 cbuf 中。返回实际读取的字符数,若无数据可读则返回 -1。
int read(char[] c, int off, int len): 从流中读取 len 个字符,从字符数组的指定位置 off开始存储。返回实际读取的字符数,若无数据可读则返回 -1。
示例:

import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

public class FileReaderExample {

    public static void main(String[] args) {
        try {
            // 创建 FileReader 对象以读取名为 "a.txt" 的文件
            FileReader fileReader = new FileReader("info.txt");

            char[] c = new char[2]; // 缓冲区,用于存储读取的字符

            int read; // 用于存储读取的字符数

            // 循环读取文件中的数据,直到读取到文件末尾
            while ((read = fileReader.read(c)) != -1) {
                // 将读取到的字符数组转换为字符串并输出
                String s = new String(c, 0, read);
                System.out.print(s);
            }

            // 关闭 FileReader 资源
            fileReader.close();

        } catch (IOException e) {
            System.out.println("读取文件时发生异常:" + e.getMessage());
        }
    }
}

后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

Alt

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员 小侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值