Java IO流·文件传输

📅 2026/8/3 8:46:12 👁️ 阅读次数 📝 编程学习
Java IO流·文件传输

这里的IO框架是Java.io那一套流体系,聚焦两件事:

1.IO流怎么分类、各自干什么

2.怎么用字节流+Socket做网络文件传输

1.两个分类视角

1.1按数据格式:字节流vs字符流

类别抽象基类(输入/输出)单位典型场景
字节流InputStream/OutputStream8-bit字节,不做编码转换图片/音视频/压缩包/任意文件;Socket网络传输必须用字节流
字符流Reader/Writer16-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/PrintWriterprint()/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 (...)