Java基础(11)字节流和字符流

在Java中,I/O(输入/输出)是处理数据流的核心机制,主要分为两大类:字节流(Byte Streams)和字符流(Character Streams)。这两种流的主要区别在于处理数据的单位不同:字节流以8位字节为单位处理数据,适用于处理所有类型的数据(如图片、视频等二进制数据);字符流以16位Unicode字符为单位处理文本数据,适合处理文本文件。

字节流

Java中的字节流主要由InputStreamOutputStream这两个抽象类定义,它们是所有字节输入流和输出流的超类。

  • InputStream - 该抽象类是表示字节输入流的所有类的超类。
  • OutputStream - 该抽象类是表示字节输出流的所有类的超类。

常用的字节流类

  • FileInputStreamFileOutputStream
  • BufferedInputStreamBufferedOutputStream
  • DataInputStreamDataOutputStream

代码演示:使用FileInputStreamFileOutputStream复制文件

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamTest {
    public static void main(String[] args) {
        try (FileInputStream in = new FileInputStream("source.dat");
             FileOutputStream out = new FileOutputStream("dest.dat")) {
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们使用FileInputStream来读取文件中的数据,每次读取一个字节,然后使用FileOutputStream将读取的字节写入另一个文件中。这里使用了Java 7的try-with-resources语句自动管理资源。

字符流

Java中的字符流由ReaderWriter这两个抽象类定义,它们是所有字符输入流和输出流的超类。

  • Reader - 该抽象类是表示字符输入流的所有类的超类。
  • Writer - 该抽象类是表示字符输出流的所有类的超类。

常用的字符流类

  • FileReaderFileWriter
  • BufferedReaderBufferedWriter
  • PrintWriter

代码演示:使用BufferedReaderBufferedWriter复制文本文件

java 复制代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamTest {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("source.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("dest.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // 添加新行
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们使用BufferedReader读取文本文件的每一行,并使用BufferedWriter将读取的行写入另一个文件中,每写完一行就添加一个新行。

深入理解

性能考量

  • 对于需要读写二进制数据的场景,应优先考虑使用字节流。
  • 对于处理文本数据,字符流更加方便和高效,因为它们直接处理字符,可以自动处理字符编码问题。
  • 在处理大量数据时,包装流(如BufferedInputStreamBufferedReader等)可以显著提高I/O操作的效率。

字符编码

字符流的一个重要特性是它们能够自动处理字符编码转换,使得读写文本文件时不必担心平台间的编码差异。当使用字符流读写文件时,可以指定字符集,如FileReaderFileWriter的构造函数就允许传入字符集名称。

总结

字节流和字符流是Java I/O库的基石,理解它们的区别和使用场景对于开发高效、健壮的I/O相关应用程序非常重要。通过上述示例和解析,希望能够帮助你更深入地理解Java中的字节流和字符流。

相关推荐
石榴树下8 分钟前
00. 马里奥的 OAuth 2 和 OIDC 历险记
后端
uhakadotcom9 分钟前
开源:subdomainpy快速高效的 Python 子域名检测工具
前端·后端·面试
似水流年流不尽思念26 分钟前
容器化技术了解吗?主要解决什么问题?原理是什么?
后端
Java水解27 分钟前
Java中的四种引用类型详解:强引用、软引用、弱引用和虚引用
java·后端
i听风逝夜27 分钟前
看好了,第二遍,SpringBoot单体应用真正的零停机无缝更新代码
后端
柏油1 小时前
可视化 MySQL binlog 监听方案
数据库·后端·mysql
舒一笑2 小时前
Started TttttApplication in 0.257 seconds (没有 Web 依赖导致 JVM 正常退出)
jvm·spring boot·后端
M1A12 小时前
Java Enum 类:优雅的常量定义与管理方式(深度解析)
后端
AAA修煤气灶刘哥3 小时前
别再懵了!Spring、Spring Boot、Spring MVC 的区别,一篇讲透
后端·面试
柏油3 小时前
MySQL 字符集 utf8 与 utf8mb4
数据库·后端·mysql