Java IO(输入/输出)流用于处理数据的输入与输出。在Java中,IO流主要分为字节流和字符流,它们又可进一步细分为输入流和输出流。
1. IO流的分类
Java IO流的主要类别如下:
1.1 按数据单位分类
- 字节流(Stream):处理二进制数据,适用于图片、视频、音频等。
- 字符流(Reader/Writer):处理文本数据,适用于读取和写入字符串。
1.2 按数据流向分类
- 输入流(InputStream/Reader):从外部数据源读取数据。
- 输出流(OutputStream/Writer):向目标写入数据。
1.3 按功能分类
- 节点流:直接连接数据源,如
FileInputStream
、FileReader
。 - 处理流:对数据进行加工处理,如
BufferedInputStream
、BufferedReader
。
2. 字节流
2.1 字节输入流
用于读取二进制数据,常见子类包括:
FileInputStream
:从文件读取数据。BufferedInputStream
:提供缓冲,提高读取效率。
示例:使用 BufferedInputStream 读取文件
import java.io.*;public class BufferedByteInputExample {public static void main(String[] args) {try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"))) {int data;while ((data = bis.read()) != -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}
2.2 字节输出流
用于写入二进制数据,常见子类包括:
FileOutputStream
:向文件写入数据。BufferedOutputStream
:提供缓冲,提高写入效率。
示例:使用 BufferedOutputStream 写入文件
import java.io.*;public class BufferedByteOutputExample {public static void main(String[] args) {try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"))) {String content = "Hello, Buffered Output Stream!";bos.write(content.getBytes());} catch (IOException e) {e.printStackTrace();}}
}
3. 字符流
3.1 字符输入流
用于读取文本数据,常见子类包括:
FileReader
:从文件读取字符数据。BufferedReader
:提供缓冲,提高读取效率。
示例:使用 BufferedReader 读取文件
import java.io.*;public class CharInputExample {public static void main(String[] args) {try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
3.2 字符输出流
用于写入文本数据,常见子类包括:
FileWriter
:向文件写入字符数据。BufferedWriter
:提供缓冲,提高写入效率。
示例:使用 BufferedWriter 写入文件
import java.io.*;public class CharOutputExample {public static void main(String[] args) {try (BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt"))) {bw.write("Hello, Java IO with BufferedWriter!");} catch (IOException e) {e.printStackTrace();}}
}
4. 转换流
用于字节流和字符流之间的转换:
InputStreamReader
:将字节输入流转换为字符输入流。OutputStreamWriter
:将字符输出流转换为字节输出流。
示例:使用 InputStreamReader 读取字节流并转换为字符流
import java.io.*;public class ConvertStreamExample {public static void main(String[] args) {try (InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8")) {int data;while ((data = isr.read()) != -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}
5. 对象流(序列化与反序列化)
用于对象的存储和读取:
ObjectOutputStream
:对象序列化。ObjectInputStream
:对象反序列化。
示例:对象序列化和反序列化
import java.io.*;class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}public class SerializationExample {public static void main(String[] args) {Person person = new Person("Alice", 25);String filename = "person.ser";try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {oos.writeObject(person);} catch (IOException e) {e.printStackTrace();}try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {Person deserializedPerson = (Person) ois.readObject();System.out.println("反序列化对象: " + deserializedPerson);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
6. 打印流
用于格式化输出:
PrintStream
:打印字节数据。PrintWriter
:打印字符数据。
示例:使用 PrintWriter 进行格式化输出
import java.io.*;public class PrintStreamExample {public static void main(String[] args) {try (PrintWriter pw = new PrintWriter(new FileWriter("print.txt"))) {pw.println("Hello, PrintWriter!");pw.printf("Number: %d", 100);} catch (IOException e) {e.printStackTrace();}}
}
7. 压缩流
用于数据压缩和解压缩:
GZIPOutputStream
:用于 GZIP 格式的压缩。GZIPInputStream
:用于 GZIP 格式的解压缩。
示例:使用 GZIPOutputStream 进行数据压缩
import java.io.*;
import java.util.zip.*;public class GzipExample {public static void main(String[] args) {try (GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("compressed.gz"))) {gos.write("Hello, GZIP Compression!".getBytes());} catch (IOException e) {e.printStackTrace();}}
}