Java 中的 IO 流的分类?说出几个你熟悉的实现类?

参考回答

Java 中的 IO 流分类:

  1. 按流的方向分类
    • 输入流(InputStream/Reader):用于从外部读取数据到程序中。
    • 输出流(OutputStream/Writer):用于将数据从程序中写出到外部。
  2. 按处理数据的单位分类
    • 字节流(InputStream/OutputStream):以字节(8 位)为单位处理数据,适合处理图片、视频、音频等二进制文件。
    • 字符流(Reader/Writer):以字符(16 位)为单位处理数据,适合处理文本文件。
  3. 按功能分类
    • 节点流:直接操作数据源或目的地,例如文件、内存、网络等。
    • 处理流:对已有流进行功能增强或数据处理,例如缓冲、转换、压缩等。

常见的实现类:

  • 字节流
    • 输入流:FileInputStreamBufferedInputStream
    • 输出流:FileOutputStreamBufferedOutputStream
  • 字符流
    • 输入流:FileReaderBufferedReader
    • 输出流:FileWriterBufferedWriter
  • 特殊流
    • 对象流:ObjectInputStreamObjectOutputStream
    • 数据流:DataInputStreamDataOutputStream
    • 转换流:InputStreamReaderOutputStreamWriter

详细讲解与拓展

1. IO 流的四大核心基类

  • 字节流:
    • InputStream:所有字节输入流的超类。
    • OutputStream:所有字节输出流的超类。
  • 字符流:
    • Reader:所有字符输入流的超类。
    • Writer:所有字符输出流的超类。

关系图:

InputStream  ────> FileInputStream, BufferedInputStream, ObjectInputStream
OutputStream ────> FileOutputStream, BufferedOutputStream, ObjectOutputStream
Reader       ────> FileReader, BufferedReader, InputStreamReader
Writer       ────> FileWriter, BufferedWriter, OutputStreamWriter

2. 字节流的实现类

字节流适合处理 二进制数据,如图片、视频、音频等。

  • FileInputStreamFileOutputStream
    • 用于从文件中读取或向文件中写入字节数据。

    • 示例:

    import java.io.*;
    
    public class ByteStreamExample {
        public static void main(String[] args) {
            try (FileInputStream fis = new FileInputStream("input.txt");
                 FileOutputStream fos = new FileOutputStream("output.txt")) {
                int data;
                while ((data = fis.read()) != -1) {
                    fos.write(data); // 将读取的数据写入另一个文件
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  • BufferedInputStreamBufferedOutputStream

    • 对字节流提供缓冲功能,提高 IO 操作效率。

    • 示例:

    import java.io.*;
    
    public class BufferedByteStreamExample {
        public static void main(String[] args) {
            try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
                int data;
                while ((data = bis.read()) != -1) {
                    bos.write(data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

3. 字符流的实现类

字符流适合处理 文本数据,如 .txt 文件。

  • FileReaderFileWriter
    • 用于从文件中读取或向文件中写入字符数据。

    • 示例:

    import java.io.*;
    
    public class CharStreamExample {
        public static void main(String[] args) {
            try (FileReader fr = new FileReader("input.txt");
                 FileWriter fw = new FileWriter("output.txt")) {
                int data;
                while ((data = fr.read()) != -1) {
                    fw.write(data); // 将字符写入另一个文件
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  • BufferedReaderBufferedWriter

    • 对字符流提供缓冲功能,并支持按行读写。

    • 示例:

    import java.io.*;
    
    public class BufferedCharStreamExample {
        public static void main(String[] args) {
            try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
                 BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
                String line;
                while ((line = br.readLine()) != null) {
                    bw.write(line);
                    bw.newLine(); // 写入换行符
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

4. 特殊流的实现类

  • ObjectInputStreamObjectOutputStream

    • 用于序列化和反序列化对象。

    • 示例:

    import java.io.*;
    
    class Person implements Serializable {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person{name='" + name + "', age=" + age + "}";
        }
    }
    
    public class ObjectStreamExample {
        public static void main(String[] args) {
            try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));
                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
                // 序列化对象
                oos.writeObject(new Person("Alice", 30));
    
                // 反序列化对象
                Person person = (Person) ois.readObject();
                System.out.println(person);
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
  • InputStreamReaderOutputStreamWriter

    • 用于字节流与字符流之间的转换。

    • 示例:

    import java.io.*;
    
    public class StreamReaderWriterExample {
        public static void main(String[] args) {
            try (InputStreamReader isr = new InputStreamReader(new FileInputStream("input.txt"), "UTF-8");
                 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {
                int data;
                while ((data = isr.read()) != -1) {
                    osw.write(data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

总结

分类总览

分类方式 类型 代表基类 常见实现类
流方向 输入流 InputStream FileInputStreamBufferedInputStream
输出流 OutputStream FileOutputStreamBufferedOutputStream
输入流 Reader FileReaderBufferedReader
输出流 Writer FileWriterBufferedWriter
处理单位 字节流 InputStream/OutputStream FileInputStreamFileOutputStream
字符流 Reader/Writer FileReaderFileWriter
功能 节点流 FileInputStreamFileReader
处理流 BufferedInputStreamBufferedReader

发表评论

后才能评论