关于Java中的IO流

173 阅读4分钟

一直感觉之前的学习理解的不够,最近有时间来回顾和复习一下流的核心知识

先看概念😶‍🌫️

官方概念:在Java中,I/O(Input/Output)流表示数据的流动,允许程序与外部设备进行数据交换。

说人话😭:之前学过流的概念,就是用来处理集合数据的,那IO流也是流,IO流处理的是字符或者字节集合数据

核心知识

IO流的分类

分类一直很模糊和混淆,一到项目中不知道该怎么使用了,下面跟着我好好学学!😎

分类:字节流(Byte Streams)和字符流(Character Streams)

很多人还是不清楚字节和字符的区别😢,我最后再讲一遍:

开讲🙌🙌🙌:首先,这两种不能比较大小,因为它们是用于不同目的的不同概念,但是说占用上可能字符更大一点

字节: 字节是计算机存储和传输数据的最小单元,8比特一个字节

字符: 通常是文本中的一个元素,字符的大小通常由字符编码方案决定,而一个字符可能占用一个或多个字节的存储空间。

字节流

下面来看字节流:字节流用于处理原始的二进制数据,每次操作的单位是一个字节。

字节流的基本类是InputStreamOutputStream

  • InputStream及其子类用于从输入流中读取字节数据。
  • OutputStream及其子类用于向输出流中写入字节数据。

来个小Demo:

字节流主要是用来处理文件等,比如表格、视频、音频等文件

下面演示一下如何读取一个文件的内容并将其写入另一个文件:

 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 ​
 public class ByteStreamExample {
     public static void main(String[] args) {
         // 指定输入文件和输出文件的路径
         String inputFile = "input.txt";
         String outputFile = "output.txt";
 ​
         // 使用try-with-resources确保资源关闭
         try (FileInputStream inputStream = new FileInputStream(inputFile);
              FileOutputStream outputStream = new FileOutputStream(outputFile)) {
             // 读取输入文件的字节数据
             int data;
             while ((data = inputStream.read()) != -1) {
                 // 处理每个字节数据(这里简单地写入到输出文件)
                 outputStream.write(data);
             }
 ​
             System.out.println("文件复制成功!");
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }
 ​

其中通过inputStream的read方法来读取数据,outputStream的write方法来写入数据

其中流的构建需要指定要转换的文件,以便将文件转换为流

字符流

下面来看字节流:字符流用于处理字符数据,提供了以字符为单位的高级I/O操作

字节流的基本类是ReaderWriter两个抽象类及其实现类

  • Reader及其子类用于从输入流中读取字符数据。
  • Writer及其子类用于向输出流中写入字符数据。

来个小Demo:

字节流主要是用来处理文件等,比如表格、视频、音频等文件

下面演示如何使用字符流读取一个文件的内容并将其写入另一个文件:

 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 ​
 public class CharacterStreamDemo {
     public static void main(String[] args) {
         // 指定输入文件和输出文件的路径
         String inputFile = "input.txt";
         String outputFile = "output.txt";
 ​
         // 使用try-with-resources确保资源关闭
         try (FileReader reader = new FileReader(inputFile);
              FileWriter writer = new FileWriter(outputFile)) {
             // 读取输入文件的字符数据
             int data;
             while ((data = reader.read()) != -1) {
                 // 处理每个字符数据(这里简单地写入到输出文件)
                 writer.write(data);
             }
 ​
             System.out.println("文件复制成功!");
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

和字节流类似奥,不讲啦😁

缓冲流

这个有点点高级,来看🙌🙌🙌:

先看概念:缓冲流提供了对缓冲的支持,可以提高I/O操作的性能。这些流通常用于包装其他流,添加缓冲功能。

很好理解,就是在上面讲到的流的外面加了一层流:

  • BufferedInputStreamBufferedOutputStream: 提供缓冲的字节流。
  • BufferedReaderBufferedWriter: 提供缓冲的字符流。

举个简单的例子:

 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 ​
 public class BufferedStreamDemo {
     public static void main(String[] args) {
         // 指定输入文件和输出文件的路径
         String inputFile = "input.txt";
         String outputFile = "output.txt";
 ​
         // 使用try-with-resources确保资源关闭
         try (BufferedReader reader = new BufferedReader(new FileReader(inputFile));
              BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
 ​
             // 读取输入文件的一行字符数据,并写入到输出文件
             String line;
             while ((line = reader.readLine()) != null) {
                 // 处理读取的一行字符数据
                 writer.write(line);
                 writer.newLine(); // 写入换行符
             }
 ​
             System.out.println("文件复制成功!");
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

也是挺简单的,哈哈哈

转换流

转换流(Conversion Streams)用于将字节流转换为字符流或字符流转换为字节流。

转换流主要涉及到两个类:InputStreamReaderOutputStreamWriter

看其中一个怎么用的:

比如使用InputStreamReader来将字节流输入流转换为字符流输入流

 import java.io.*;
 ​
 public class InputStreamReaderDemo {
     public static void main(String[] args) {
         // 字节流,用于读取文件
         try (FileInputStream fis = new FileInputStream("input.txt");
              // 将字节流转换为字符流,指定字符编码
              InputStreamReader isr = new InputStreamReader(fis, "UTF-8")) {
 ​
             int data;
             while ((data = isr.read()) != -1) {
                 // 处理读取的字符数据
                 System.out.print((char) data);
             }
 ​
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

大概就是这些,梳理过后,脑子就很清晰,下一篇我将分享几种常见的IO模型💕💕💕