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对象序列化 / 反序列化类需实现SerializableInputStreamReader/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 (...)