Java I/O
一、概览
Java 的 I/O 大概可以分成以下几类:
- 磁盘操作: File
- 字节操作: InputStream 和 OutputStream
- 字符操作: Reader 和 Writer
- 对象操作: Serializable
- 网络操作: Socket
- 新的输入 / 输出: NIO
二、磁盘操作
File 类可以用于表示文件和目录的信息,但是它不表示文件的内容
从 Java7 开始,可以使用 ** Paths** 和 Files 代替 File
三、字节操作
实现文件复制:
1 | public static void copyFile(String src, String dist) throws IOException { |
装饰者模式:
1 | FileInputStream fileInputStream = new FileInputStream(filePath); |
四、字符操作
1. 编码 与 解码
概述: 编码就是把字符转换为字节,而解码是把字节重新组合成字符
乱码: 如果编码和解码过程使用不同的编码方式那么就出现了乱码
2. String 的编码方式
1 | String str1 = "中文"; |
3. Reader 与 Writer
不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符。但是在程序中操作的通常是字符形式的数据,因此需要提供对字符进行操作的方法。
- InputStreamReader 实现从字节流解码成字符流;
- OutputStreamWriter 实现字符流编码成为字节流。
实现逐行输出文本文件的内容:
1 | public static void readFileContent(String filePath) throws IOException { |
五、对象操作
1. Serializable
序列化的类需要实现 Serializable 接口,它只是一个标准,没有任何方法需要实现,但是如果不去实现它的话而进行序列化,会抛出异常
2. transient
transient 关键字可以使一些属性不会被序列化
六、网络操作
Java 中的网络支持
- InetAddress: 用于表示网络上的硬件资源,即 IP 地址
- URL: 统一资源定位符
- Sockets: 使用 TCP 协议实现网络通信
- Datagram: 使用 UDP 协议实现网络通信
1. InetAddress
创建: 没有公有的构造函数,只能通过静态方法来创建实例
1 | InetAddress.getByName(String host); |
2. URL
可以直接从 URL 中读取字节流数据
1 | public static void main(String[] args) throws IOException { |
3. Sockets
- ServerSocket: 服务器端类
- Socket: 客户端类
- 服务器和客户端通过 InputStream 和 OutputStream 进行输入输出
4. Datagram
- DatagramSocket: 通信类
- DatagramPacket: 数据包类