2.3-IO

优质
小牛编辑
129浏览
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
DataOutputStreamnew 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

更改流的行为。

方法功能
BufferedReadernew BufferedReader(new FileReader(filename))构造器。
String readLine
BufferedWriter

2. Socket

2.1 InetAddress 和 InetSocketAddress

方法功能
InetAddressgetLocalHost()静态方法,获得本机的 InetAddress 对象。
getByName()静态方法,根据域名或 IP 地址获得 InetAddress 对象。
getHostName()获得 InetAddress 对象的 IP 地址。
getHostAddress()获得 InetAddress 对象的 IP 域名。
InetSocketAddressInetSocketAddress(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 方法不同带来的风险。