Java高级编程day25【谷】

本文讲解了Java高级编程中的对象序列化机制,包括如何将Java对象转换为二进制流并实现持久化。接着介绍了对象流的概念,强调了序列化和反序列化的实现方式。同时,文章探讨了RandomAccessFile的使用,强调其在多线程下载中的应用。网络编程部分涵盖了TCP和UDP通信,以及URL编程,包括如何进行网络资源的下载。
摘要由CSDN通过智能技术生成

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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值