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

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

简介

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

基本概念

  • 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): 写入字节数组的一部分数据。

字节输出流的子类: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(): 关闭输入流,释放资源。

字节输入流的子类: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(): 关闭输出流,释放资源。

字符输出流的实现类: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());
        }
    }
}

字符输入流: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());
        }
    }
}

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

相关文章
|
20天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
34 6
|
19天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
58 3
|
5天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
20 2
|
27天前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
26 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
29天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
63 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
11天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
31 2
|
15天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
20天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
31 2
|
22天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。
【10月更文挑战第14天】从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。本文深入探讨Set的核心理念,并通过示例代码展示了HashSet和TreeSet的特点和应用场景。
17 2
|
23天前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
下一篇
无影云桌面