Java高级编程day25
对象序列化机制
允许把内存中的Java对象转换成与平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或通过网络将这种二进制传输到另一个网络节点,
当其他程序获取这种二进制流,就可以恢复为原来的Java对象
对象流
序列化:将内存中的Java对象转换成与平台无关的二进制流
public class test {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream("dest.dat");
oos = new ObjectOutputStream(fileOutputStream);
oos.writeObject("我爱中国,我爱共产党");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
反序列化:将磁盘文件中的对象还原为内存中的一个java对象
public class TestJie {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
FileInputStream fileInputStream = new FileInputStream("dest.dat");
ois = new ObjectInputStream(fileInputStream);
Object o = ois.readObject();
String str = (String) o;
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
如果对象流要传的数据为自定义类
我们要将自定义类型序列化
1.需要实现接口:Serializable
2.当前类提供一个全局变量:serialVersionUID
执行如上两部即可序列化
3.除了当前的类需要实例化外,必须保证内部的所有属性都必须是可实例化的(默认情况下,基本数据类型都是可实例化的)
补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
RandomAccessFile
1.RandomAccessFile直接继承java.lang.Object类,实现了DataInput和DataOutput接口
2.RandomAccessFile即可作为输入流也可以作为输出流,却决于构造器是 r还是rw
3.如果RandomAccessFiLe作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建
如果写出到的文件存在,则会对原有文件内容自行覆盖。(默认情况下,从头覆盖)
seek方法:将指针调到角标为几的位置,write方法将从指定角标位置进行覆盖
RandomAccessFile类应用:多线程下载
main方法中文件的相对路径为Poject类
Junit测试在文件的相对路径在当前的Module下
我们一般在开发时会使用第三方jar包来简化开发
NIO是IO的进阶产品
NIO2因为NIO不太好用,NIO2出现
NIO2中Path相当于IO中的File且二者可以相互转换
网络编程
目的
直接或间接地通过网络协议与其他计算机实现数据交互,进行通信
两个主要的问题
如何准确地定位网络上一台主机或多台主机;定位主机上的特定应用
找到主机后如何高效进行数据传输
网络通信要素
IP和端口号
IP地址:InetAddress
在Java中使用InetAddress类表示IP
唯一的标识Internet上的计算机(通信实体)
本地回环地址:127.0.0.1 主机名(hostName):localhost
IP分类:IPV4与IPV6;万维网和局域网
域名:www.baidu.com www.mi.com
实例化InetAddress的两个方法:getByName(String host)
getLocalHost():获取本地IP地址
常用的两个方法getHostName() getHostAddress()
端口号
正在计算机上运行的进程
要求:不同的进程由不同的端口号
范围:被规定为16位的整数0~65535
代表一台主机上不同的应用程序
网络通信协议
TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
端口号与IP地址的组合得出一个网络套接字:Socket
TCP网络编程
客户端与服务端通信
客户端
1.创建Socket对象,指明服务器端的ip的端口号
2.获取一个输出流,用于输出数据
3.写入数据的操作
4.资源的关闭
@Test
public void client() {
Socket socket = null;
OutputStream os = null;
try {
InetAddress inetAddress = InetAddress.getByName("192.168.100.101");
socket = new Socket(inetAddress, 8888);
os = socket.getOutputStream();
os.write("我爱你中国,我爱你刘晶晶".getBytes());
} catch (IOException e)