Java 用“流(Stream)”抽象数据的输入输出。按数据单位分字节流与字符流,按方向分输入流与输出流。
InputStream / OutputStream(处理二进制)。Reader / Writer(处理文本,自动处理编码)。try (InputStream in = new FileInputStream("a.bin");
OutputStream out = new FileOutputStream("b.bin")) {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
FileInputStream/FileOutputStream 读写文件;read() 返回 -1 表示读完。BufferedInputStream/BufferedOutputStream 包装底层流,减少磁盘 IO 次数。try (BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
}
FileReader/FileWriter 读写字符;BufferedReader.readLine() 按行读取。InputStreamReader/OutputStreamWriter 在字节流与字符流间转换,可指定编码。ObjectInputStream/ObjectOutputStream 实现序列化(对象需 implements Serializable)。DataInputStream/DataOutputStream 读写基本类型(readInt/writeUTF 等)。PrintStream/PrintWriter(System.out 就是 PrintStream)。ByteArrayInputStream/ByteArrayOutputStream、CharArrayReader/CharArrayWriter 操作内存而非磁盘。File 表示文件/目录的路径,提供 exists、createNewFile、mkdir、delete、listFiles、isDirectory 等操作。
RandomAccessFile 支持按位置读写(seek),适合在文件任意位置跳转。
字符集规定字符与字节的映射:ASCII、GBK、UTF-8(变长,兼容 ASCII)、UTF-16 等。读写时需编码一致,否则乱码:
new InputStreamReader(in, StandardCharsets.UTF_8);
fopen/fread/fwrite 基于文件指针,需手动关闭、手动管理缓冲区,无异常机制。iostream(cin/cout)运算符重载流式,也有 fstream。open()/with 极简,自动关闭;with 语句 ≈ Java 的 try-with-resources。关键差异:Java 用“装饰器模式”堆叠流(如缓冲流包文件流),灵活但类多、啰嗦;Python 的
open一个函数搞定。Java 的 try-with-resources 自动关闭流,避免了 C 式忘记close的资源泄漏。