Day27
对象流
-
自定义类需要满足以下的需求,方可序列化
-
1.实现Serializable的接口。---->标识接口,这个接口没有任何方法。
-
2.需要当前类,提供一个全局常量:serialVersionUID
-
3.除了当前Person类需要实现serializable接口之外,还必须保证其内部属性也必须是可序列化的。
(默认情况下,基本数据类型是可序列的)
serialVersionUID没有显性声明的话,系统会自动分配,但是分配后,修改了类之后,就找不到了。
所以!!!!必须声明serialVersionUID。
补充:ObjectInputStream和ObjectOutputStream不能序列化static和transient修饰的成员变量
代码
package com.sorrymaker.IO;
import org.junit.Test;
import java.io.*;
/**
* ObjectInputStream和ObjectOutputStream都是字节流
* 用于存储和读取基本数据类型或对象的数据流。可以把java中的对象写到数据源中,也可以还原回来。
*
* 要想一个java对象是可序列化的,需要满足相应的要求,见Person.java
*/
public class ObjectInputOutputStreamTest {
/**
* 序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去。
* 使用ObjectOutputStream实现
*/
随机存取文件流
RandomAccessFile流、
-
既可以是输入流也可以是输出流
-
继承于java.io.Object。
-
实现了DataInput、DataOutput、Closeable、AutoCloseable接口。
long getFilePointer():获取文件记录指针的当前位置。
void seek(long pos):将文件记录指针定位到pos位置。
使用RandomAccessFile实现数据的插入效果。
/**
* 使用RandomAccessFile实现数据的插入效果。
*/
网络编程
两个要素:
-
IP和端口号
-
网络通信协议: TCP/IP参考模型。
IP
package com.sorrymaker.Internet;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 两个要素:
* 1.IP地址和端口号
* 2.网络通信协议: TCP/IP参考模型。
*
* 1.IP地址:InetAdress
* 2.IP:唯一的标识Internet上的计算机(通信实体)
* 3.IP分类:IPv4 和 IPv6 ; 万维网 和 局域网
* 4.域名: www.baidu.com
* 5.本地回路地址:127.0.0.1 对应的是:localhost
* 6.实例化InetAddress:两个方法:getByName(String host)、getLocalHost()
* 两个常用方法:getHostName()---->获取域名
* getHostAddress()---->获取域名解析后的地址。
*
*/
public class InetAddressTest {
public static void main(String[] args){
try {
InetAddress inet1 = InetAddress.getByName("10.12.168.155");
System.out.println(inet1);
//解析了域名所对应的IP地址。
InetAddress inet2 = InetAddress.getByName("www.baidu.com");
System.out.println(inet2);
InetAddress inet3 = InetAddress.getByName("127.0.0.1");
System.out.println(inet3);
//获取本机IP。
InetAddress inet4 = InetAddress.getLocalHost();
System.out.println(inet4);
//getHostName()---->获取域名
System.out.println(inet2.getHostName());
//getHostAddress()---->
System.out.println(inet2.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
端口号
端口号标识正在计算机上运行的进程(程序)
要求:不同的进程有不同的端口号
端口被规定为一个16位的整数0~65535
端口分类:
公认端口:0~1023。被预先定义的服务通信占用。
注册端口:1024~49151。分配给用户进程或应用程序。
动态/私有端口:49152~65535。
IP 与端口号的组合得出一个网络套接字:Socket
TCP网络编程
例题1.
客户端发送内容给服务端,服务端将内容打印到控制台上
package com.sorrymaker.Internet;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 实现TCP的网络编程
* 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上
* 先启动服务器,再启动客户端。
* 先启动服务器,再启动客户端。
* 客户端总体步骤:
* 1.创建Socket对象,指明服务器端的ip和端口号。
* 2.获取一个输出流,用于输出数据。
* 3.写出数据的操作。
* 4.资源的关闭(socket也要关闭)
* 服务器端总体步骤:
* 1.创建服务器端的ServerSocket,指明字节的端口号。
* 2.调用accept()表示接收来只自于客户端的socket
* 3.获取输入流
* 4.读取输入流的数据
*
*/
public class TCPTest {
//客户端
