Java IO流·文件传输
这里的IO框架是Java.io那一套流体系,聚焦两件事:
1.IO流怎么分类、各自干什么
2.怎么用字节流+Socket做网络文件传输
1.两个分类视角
1.1按数据格式:字节流vs字符流
| 类别 | 抽象基类(输入/输出) | 单位 | 典型场景 |
| 字节流 | InputStream/OutputStream | 8-bit字节,不做编码转换 | 图片/音视频/压缩包/任意文件;Socket网络传输必须用字节流 |
| 字符流 | Reader/Writer | 16-bit Unicode,内置编码转换(GBK→UTF-8) | 纯文本txt csv json xml ,避免中文乱码 |
记忆:网络传输、拷任何文件→字节流。只有“确定是纯文本”才用字符流
1.2按功能角色:节点流vs处理流(包装流)
节点流(直接怼数据源,原始流)
·FileInputStream/FileOutputStream:直接读写磁盘文件
·ByteArrayInputStream/ByteArrayOutputStream:以内存byte[]为数据源(缓存/内存操作)
·Socket.getInputStream()/getOutputStream():网络连接的原始字节流,底层 TCP
处理流(包在别的流外面,加功能)
BufferedInputStream/BufferedOutputStream:内置缓冲区(默认 8KB),减少系统调用,性能关键
DataInputStream/DataOutputStream:直接读写int/long/UTF,固定字节序,跨平台一致 → 发元数据(文件名/大小)/ 自定义协议头
ObjectInputStream/ObjectOutputStream:对象序列化 / 反序列化(类需实现Serializable)
InputStreamReader/OutputStreamWriter:字节流 ↔ 字符流转换桥梁,可指定字符集
PrintStream/PrintWriter:print()/println(),格式化输出(System.out就是PrintStream)
速记:节点流是“水管直接接水源”,处理流是“在水管上套过滤/加压/计算器”
2.Socket文件传输的“包装链”思想
正确顺序(由内到外)
1.节点流FileInputStream——从磁盘读原始字节
2.处理流BufferedInputStream——加缓冲提速
3.处理流DataOutputStream——先发元数据(文件名/大小),再发内容
3.速记清单
- 网络 / 文件拷贝 → 字节流(
InputStream/OutputStream)
- 纯文本 → 字符流(
Reader/Writer)
- 性能 → 必包
Buffered
- 循环读:
while ((len = in.read(buf)) != -1)且out.write(buf, 0, len)
- 发完 →
flush()
- 资源 →
try (...)
