Java NIO (二)NIO Buffer类的重要方法(备份)

1 allocate()方法

        在使用Buffer实例前,我们需要先获取Buffer子类的实例对象,并且分配内存空间。需要获取一个Buffer实例对象时,并不是使用子类的构造器来创建,而是调用子类的allocate()方法。

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("afer allocate ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

abb55b6d2a6b40129c5a704d62e6c1a6.png

        本例中,IntBuffer是具体的Buffer子类,通过调用IntBuffer.allocate(20)创建了一个intBuffer实例对象,并且分配了20*4字节的内存空间。运行程序后,通过输出结果,可以查看一个新建缓冲区实例对象的主要属性值。

        从上面的运行结果可以看出:一个缓冲区在新建后处于写模式,position属性(代表写入位置)的值是0,缓冲区的capacity值是初始化时allocate方法的参数值,而limit最大可写上限值也为allocate方法的初始化参数值。

2 put()方法

        在调用allocate方法分配内存、返回了实例对象后,缓冲区实例对象处于写模式,可以写入对象,如果要把对象写入缓冲区,就需要调用put()方法。put方法很简单,只有一个参数,即需要写入的独享,只不过要求写入的数据类型与缓冲区的类型保持一致。接着上面的例子向刚刚创建的intBuffer缓存实例对象写入5个整数。

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("before put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }
        System.out.println("after put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

 0b3efdefc9dc44c6bef3293dda479834.png

        从结果可以看到,写入了5个元素后,缓冲区的position属性值变成了5,所以指向了第6个(从0开始)可以进行写入的元素位置。limit、capacity两个属性的值没有发生变化。

3 flip()方法 

        向缓冲区写入数据之后,是否可以直接从缓冲区读取数据呢?答案是否定的。这时缓冲区还处于写模式,如果需要读取数据,要将缓冲区转换成读模式。flip()翻转方法是Buffer类提供的一个模式转变的重要方法,作用是将写模式转换成读模式。接着前面的例子演示flip()方法。

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("before put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }
        System.out.println("after put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.flip();
        System.out.println("after flip ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

063045aa1b1f4fb5adc918b8cb4d615b.png

        调用flip方法后,新模式可读上限limit的值变成了之前写模式下的position的值,也就是5;而新模式下的position的值变成了0,表示从头开始读取。

        对flip()方法从写入到读取转换的规则,再一次详细介绍:

        首先,设置可读上限limit的属性值。将写模式下的缓冲区中内容的最后写入位置position的值作为读模式下的limit上限值。

        其次,把读的起始位置position的值设为0,表示从头开始读。

        最后,清除之前的mark标记,因为mark保存的是写模式下的临时位置,发生模式转换后,如果继续使用旧的mark标记,就会造成位置混乱。

        上面三步可以查看Buffer.flip()方法的源码,具体如下:

 public Buffer flip() {
        //设置可读上限limit,设置为写模式下的position值
        limit = position;
        //把读的起始位置position的值设为0,表示从头开始读
        position = 0;
        //清除之前的mark标记
        mark = -1;
        return this;
   }

         新的问题来了:在读取完后,如果再一次将缓冲区切换成写模式呢?答案是:可以调用Buffer.clear()清空或者Buffer.compact()压缩方法,它们可以将缓冲区切换为写模式。

4 get()方法

        调用flip()方法将缓冲区切换成读模式后,就可以开始从缓冲区读取数据了。读取数据的方法很简单,可以调用get()方法从position的位置读取一个数据,并且进行相应的缓冲区属性的调整。接着前面调用flip()方法的实例,演示缓冲区的读取操作。

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("before put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }
        System.out.println("after put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.flip();
        System.out.println("after flip ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //先读取两个数据
        for (int i = 0; i < 2; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第一次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //再读取三个数据
        for (int i = 0; i < 3; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第二次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

c57f39d84aa14eea94d220c9c75b6cfd.png

        从输出看到,读取操作会改变可读位置position的值,而可读上限limit的值不会改变。在position值和limit值相等时,表示所有数据读取完成,position指向了一个没有数据的元素位置,已经不能在读了。这里强调一下,在读完之后是否可以立即对缓冲区进行数据写入呢?答案是不能。现在还处于读模式,必须调用clear()或compact()方法,即清空或压缩缓冲区,将缓冲区切换成写模式。

5 rewind()方法

        已经读完的数据,如果需要再读一遍,可以调用rewind()方法。rewind()方法也叫倒带,就像播放磁带一样,再重新播放。接着前面的代码,继续rewind()方法使用的演示。

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("before put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }
        System.out.println("after put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.flip();
        System.out.println("after flip ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //先读取两个数据
        for (int i = 0; i < 2; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第一次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //再读取三个数据
        for (int i = 0; i < 3; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第二次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.rewind();
        System.out.println("after rewind -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

 97370672218841e49c21601bc1293b3c.png

        rewind()方法主要是调整了缓冲区的position属性与mark属性,调整规则如下:

        1、position重置为0,所以可以重读缓冲区的所有数据。

        2、limit保持不变,数据量还是一样的,仍然可以从缓冲区读取的元素数量。

        3、mark被清理,表示之前的临时位置不能再用了。

        rewind()源码如下:

public Buffer rewind() {
        //重置为0,所以可以重读缓冲区中的所有数据
        position = 0;
        //mark被清理,表示之前的临时位置不能再用了
        mark = -1;
        return this;
    }

         通过源码可以看到rewind()和flip()方法很像,区别在于:rewind()方法不会影响limit属性值;而flip()方法会重设limit属性值。

6 mark()和reset()方法

        mark()和reset()方法是配套使用的:mark()方法将当前position的值保存起来放在mark属性中,让mark属性记住这个临时位置;然后可以调用reset()方法将mark的值恢复到position中。

        例如,在前面重复读取的示例代码中,在读到第三个元素(i=2时)时,可以调用mark方法,把当前位置position的值保存到mark属性中,这时mark属性值是2。

        接下来可以调用reset()方法,将mark属性的值恢复到position中,这样就可以从位置2(第三个元素)开始重复读取了。

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("before put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }
        System.out.println("after put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.flip();
        System.out.println("after flip ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //先读取两个数据
        for (int i = 0; i < 2; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第一次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //再读取三个数据
        for (int i = 0; i < 3; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第二次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.rewind();
        System.out.println("after rewind -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            if(i == 2){
                intBuffer.mark();
            }
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after mark -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.reset();
        for (int i = 2; i < 5; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after reset -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

6552eeffaf6e40aa8448321af65aa0c3.png

        在上面的代码中,首先调用reset方法把mark中的值恢复到position中,因此读取的位置position就是2,表示可以再次开始从第三个元素开始读取数据。调用reset方法后,position的值是2,此时去读取缓冲区,输出后面的三个元素2 、3 、4。

7 clear()方法

        在读模式下,调用clear方法将缓冲区切换成写模式。此方法的作用是:

        (1)将position清零。

        (2)limit设置为capacity最大容量值,可以一直写入,直到缓冲区写满。

        接着上面的示例,调用clear方法。

        

public class AllocateTest {
    static IntBuffer intBuffer = null;//一个整型的Buffer静态变量
    public static void main(String[] args) {
        //创建一个intbuffer 实例对象
        intBuffer = IntBuffer.allocate(20);
        System.out.println("before put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }
        System.out.println("after put ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.flip();
        System.out.println("after flip ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //先读取两个数据
        for (int i = 0; i < 2; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第一次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        //再读取三个数据
        for (int i = 0; i < 3; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after get 第二次 ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.rewind();
        System.out.println("after rewind -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        for (int i = 0; i < 5; i++) {
            if(i == 2){
                intBuffer.mark();
            }
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after mark -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.reset();
        for (int i = 2; i < 5; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println("after reset -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
        intBuffer.clear();
        System.out.println("after clear -- ----------------");
        System.out.println("position = " + intBuffer.position());
        System.out.println("limit = " + intBuffer.limit());
        System.out.println("capacity = " + intBuffer.capacity());
    }
}

 d8545bda124b42bb8d9e78b8600fdd44.png

        在缓冲区处于读模式时,调用clear方法,缓冲区被切换成写模式,可以看到清空了position的值,值被设置为0, 并且limit值为最大容量。

8 使用Buffer类的基本步骤

        总体来说,使用Java NIO Buffer类的基本步骤如下:

        (1)使用创建子类实例对象的allocate()方法创建一个Buffer类的实例对象。

        (2)调用put()方法将数据写入缓冲区。

        (3)写入完成后,再开始读取数据之前调用flip()方法,将缓冲区切换成读模式。

        (4)调用get()方法,可以从缓冲区读取数据。

        (5)读取完成后,调用clear()或compact()方法,将缓冲区从读模式切换成写模式,可以继续写入数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/328176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【FastAPI】路径参数(二)

预设值 如果你有一个接收路径参数的路径操作&#xff0c;但你希望预先设定可能的有效参数值&#xff0c;则可以使用标准的 Python Enum 类型。 导入 Enum 并创建一个继承自 str 和 Enum 的子类。通过从 str 继承&#xff0c;API 文档将能够知道这些值必须为 string 类型并且能…

PromptCast-时间序列预测的好文推荐

前言 这是关于大语言模型和时间序列预测结合的好文推荐&#xff0c;发现这篇文章&#xff0c;不仅idea不错和代码开源维护的不错&#xff0c;论文也比较详细&#xff08;可能是顶刊而不是顶会&#xff0c;篇幅大&#xff0c;容易写清楚&#xff09;&#xff0c;并且关于它的Br…

STM32+HAL库驱动ADXL345传感器(SPI协议)

STM32HAL库驱动ADXL345传感器&#xff08;SPI协议&#xff09; ADXL345传感器简介实物STM32CubeMX配置SPI配置片选引脚配置串口配置 特别注意&#xff08;重点部分&#xff09;核心代码效果展示 ADXL345传感器简介 ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加…

Spring Security- 基于角色的访问控制

基于角色 或权限 进行访问控制 hasAuthority方法 如果当前的主体具有指定的权限,则返回true,否则返回false 修改配置类 //当前登录用户 只有具备admins权限才可以访问这个路径.antMatchers("/test/index").hasAuthority("admins") 代码如下: package c…

达芬奇调色软件DaVinci Resolve Studio 18 中文激活版

DaVinci Resolve Studio 18是一款功能强大的视频编辑软件&#xff0c;它可以帮助用户轻松完成视频剪辑、调色、音频处理和特效合成等任务。 软件下载&#xff1a;DaVinci Resolve Studio 18 中文激活版下载 这款软件具有友好的用户界面和易于使用的功能&#xff0c;使得用户能够…

云服务器CVM_云主机_云计算服务器_弹性云服务器

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

transbigdata笔记:轨迹停止点和行程提取

1 traj_stay_move——标识停靠点和行程 1.1 方法介绍 如果两个连续轨迹数据点&#xff08;栅格化处理之后&#xff09;之间的持续时间超过设定的阈值&#xff0c;将其视为停靠点。两个停靠点之间的时间段被视为一个行程 1.2 使用方法 transbigdata.traj_stay_move(data, pa…

从零开始搭建ubuntu 16.04 pwndocker环境

1.安装VMware-tools 1.1遇到问题 在使用 VMware Workstation时遇到了VMware Tools不能安装的问题&#xff0c;具体表现为&#xff1a;在要安装VMware Tools的虚拟机上右键 ----》安装VMware Tools(T)… 为灰色&#xff0c;不能够点击。 1.2解决方案    1. 关闭虚拟机&…

设计Twitter时间线和搜索功能

设计Twitter时间线和搜索功能 设计 facebook feed 和 设计 facebook search是相同的问题 第一步&#xff1a;定义用例和约束 定义问题的需求和范围&#xff0c;询问问题去声明用例和约束&#xff0c;讨论假设 ps: 没有一个面试官会展示详细的问题&#xff0c;我们需要定义一些用…

【软件测试】学习笔记-测试基础架构

这篇文章探讨什么是测试基础架构。 什么是测试基础架构&#xff1f; 测试基础架构指的是&#xff0c;执行测试的过程中用到的所有基础硬件设施以及相关的软件设施。因此&#xff0c;我们也把测试基础架构称之为广义的测试执行环境。通常来讲&#xff0c;测试基础 架构主要包括…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…

Spring Security-用户注销及记住我

用户注销 在配置类增加退出映射地址 Overrideprotected void configure(HttpSecurity http) throws Exception {//退出/注销http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/hello").permitAll();} 完整代码: package com.config;​import o…

礼贺新春,徐坊大曲新品【中国红】

梁山徐坊大曲新推出中国风礼盒&#xff0c;以中国红为主题&#xff0c;为即将到来的新春佳节增添了浓厚的节日气氛。为您呈现一场视觉与味觉的盛宴。从礼盒的颜色到图案设计&#xff0c;无不体现出中国红的热情与活力&#xff0c;象征着吉祥、喜庆与团圆。梁山徐坊大曲&#xf…

设计模式之依赖倒转原则

在软件开发的世界里&#xff0c;设计模式一直是提升代码质量、确保软件稳定性以及优化软件可维护性的重要工具。而在这其中&#xff0c;依赖倒转原则无疑是其中最具代表性的设计模式之一。那么&#xff0c;什么是依赖倒转原则&#xff1f;它又为何如此重要&#xff1f;让我们一…

Android 系统启动过程纪要(基于Android 10)

前言 看过源码的都知道&#xff0c;Launcher系统启动都会经过这三个进程 init ->zygote -> system_server。今天我们就来讲解一下这三个进程以及Launcher系统启动。 init进程 准备Android虚拟机环境&#xff1a;创建和挂载系统文件目录&#xff1b;初始化属性服务&…

解决哈希冲突的几种方法

什么是hash冲突 哈希函数是一个映像&#xff0c;把任意长度的输入&#xff0c;通过Hash算法变换成固定长度的输出&#xff0c;这个输出就是Hash值&#xff1b; 当两个不同的输入&#xff0c;产生了同一个输出值即为哈希冲突 解决方式 开放定址法 开放寻址法的核心思想是&am…

PyQt5多线程使用

PyQt5多线程使用 本案例使用PyQt5多线程实现一个UI界面同时显示3个时间实时更新控件&#xff0c;从而直观地了解到Qt多线程是如何进行工作的。 from PyQt5.QtCore import QThread,pyqtSignal,QDateTime from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit,QVBoxLay…

[Android]实现一个权限申请类

[Android]实现一个权限申请类 导言 在引入了动态权限申请之后&#xff0c;Android的权限申请就变得尤为繁琐&#xff0c;若是按照原有的方法一板一眼地进行申请&#xff0c;样板代码未免太多。因此本篇文章就使用ActivityResult API&#xff0c;来实现一个简单的权限申请类来帮…

【漏洞复现】Kubernetes PPROF内存泄漏漏洞(CVE-2019-11248)

Nx01 产品简介 Kubernetes&#xff08;简称K8S&#xff09;是Google在2014年开源的一个容器集群管理系统。它用于容器化应用程序的部署、扩展和管理&#xff0c;目标是让部署容器化应用简单且高效。 Nx02 漏洞描述 漏洞存在于Kubernetes的1.18.6版本之前&#xff0c;可能导致未…