2.3-IO
优质
小牛编辑
133浏览
2023-12-01
1.1 定义
- 输入流:有能力产生数据的数据源对象,调用 read 方法将外部对象(文件、字节数组、对象)转为流对象。
- 流出流:有能力接收数据的接收端对象,调用 write 方法将流对象转为外部对象。
1.2 常见的输入输出流
抽象了应用程序读取数据的方式,所有字节输入流的接口。 抽象了应用程序写出数据的方式,所有字节输出流的接口。1.2.1 InputStream 与 OutputStream
1.2.1.1 FileInputSream 与 FileOutputSream
类 | 方法 | 功能 |
---|---|---|
FileInputSream | 文件输入流,实现了在文件上读取数据。 | |
FileOutputSream | 文件输出流,实现了向文件中写数据。 |
1.2.1.2 ByteArrayInputSream 与 ByteArrayOutputSream
字节数组输入流。 字节数组输出流。
1.2.1.3 DataInputSream 和 DataOutputSream
对流功能的扩展,可以更加方便向流中写入的int、long、字符等类型数据。
类 | 方法 | 功能 |
---|---|---|
DataInputStream | ||
DataOutputStream | new DataOutputStream(OutPutStream) | 使用输出流构造。 |
writeInt | 将 int 类型数字存入流中。 | |
writeDouble | 将 double 类型数字存入流中 | |
writeUTF | 将字符串类型数组存入流中 |
1.2.1.4 ObjectInputSream 与 ObjectOutputSream
引用类型数据。
1.2.2 Reader 与 Writer
类 | 功能 |
---|---|
Reader | |
Writer |
1.2.2.1 InputStreamReader 与 OutputStreamWriter
适配器
类 | 方法 | 功能 |
---|---|---|
InputStreamReader | ||
OutputStreamWriter |
1.2.2.2 BufferedReader 与 BufferedWriter
更改流的行为。
类 | 方法 | 功能 |
---|---|---|
BufferedReader | new BufferedReader(new FileReader(filename)) | 构造器。 |
String readLine | ||
BufferedWriter |
2. Socket
2.1 InetAddress 和 InetSocketAddress
类 | 方法 | 功能 |
---|---|---|
InetAddress | getLocalHost() | 静态方法,获得本机的 InetAddress 对象。 |
getByName() | 静态方法,根据域名或 IP 地址获得 InetAddress 对象。 | |
getHostName() | 获得 InetAddress 对象的 IP 地址。 | |
getHostAddress() | 获得 InetAddress 对象的 IP 域名。 | |
InetSocketAddress | InetSocketAddress(String hostname,int port) | 使用主机名(或 IP 地址)和端口号构造 InetSocketAddress 对象。 |
getAddress() | 获得 InetSocketAddress 对象的 IP 地址。 | |
getHostName() | 获得 InetSocketAddress 对象的域名。 | |
getPort() | 获得 InetSocketAddress 对象的端口。 |
2.2 URL组成
- 协议(protocol)
- 存放资源的主机域名(host)
- 端口(port)
- 资源文件名(file) 创建对象 URL(String spec)绝对路径 URL(URL context,String spec)相对路径
2.3 TCP
2.3.1 客户端
- 创建客户端(Socket类) ,指定服务器域名和端口。
- 准备数据,将数据转成字节数组,文件转为字节数组输出流。
- 使用输出流写出 字节数组。
2.3.2 服务端
- 创建服务端(SocketServer类) ,指定端口。
- 创建连接(Socket 类)。
- 调用 Socket 的 accept() 方法等待客户端连接。
- 获取输入流。
- 解析输入流中的数据。
2.4 UDP
2.4.1 客户端
- 创建客户端(DatagramSocket类) ,指定端口
- 准备数据,将数据转成字节数组,文件转为字节数组输出流。
- 打包 DatagramPacket+服务器地址及端口
- 发送
- 释放资源
2.4.2 服务端
- 创建服务端(DatagramSocket类),指定端口。
- 准备容器(字节数组),封装成 DatagramPacket
- 用包接收数据
- 分析数据
- 释放资源
3. NIO
4. 序列化与反序列化
4.1 序列化定义
在分布式环境下,当进行远程通信时,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。
4.2 实现
- 实现 Serializable 接口
- 都有一个 serialVersionUID,显式申明降低计算时间,避免不同平台计算 serialVersionUID 方法不同带来的风险。