清朝云资源网

作者: 清朝云

  • Java 基础之枚举类及常见用法


    共计 1844 个字符,预计需要花费 5 分钟才能阅读完成。

    Java 枚举类(Enum)是一种特殊的数据类型,用于定义一组常量。

    例如 web 请求状态码枚举类如下:

    public enum ResultCode {
    
        /**
         * 请求成功状态码
         */
        SUCCESS(200, "成功"),
    
        /**
         * 请求失败状态码
         */
        FAIL(1000, "失败");
    
        private int code;
        private String msg;
        private static final Map<Integer, ResultCode> codeMsgMap = new HashMap<>();
        private static final Map<String, ResultCode> msgCodeMap = new HashMap<>();
    
        static {
            for (ResultCode resultCode : ResultCode.values()) {
                codeMsgMap.put(resultCode.getCode(), resultCode);
                msgCodeMap.put(resultCode.getMsg(), resultCode);
            }
        }
    
        ResultCode(int code, String msg){
            this.code = code;
            this.msg = msg;
        }
        public int getCode() {
            return code;
        }
        public String getMsg() {
            return msg;
        }
    
        public static Map<Integer, ResultCode> getCodeMsgMap() {
            return codeMsgMap;
        }
        public static Map<String, ResultCode> getMsgCodeMap() {
            return msgCodeMap;
        }
    
        public static ResultCode getMsgByCode(int code){
            for (ResultCode resultCode : ResultCode.values()) {
               if(resultCode.getCode() == code){
                   return resultCode;
               }
            }
            return null;
        }
    }
    

    常见用法,一下列举出了枚举类的常见用法:

    public class EmunTest {
    
        /**
         * 枚举类基本使用
         */
        @Test
        public void test1() {
            System.out.println(ResultCode.SUCCESS.getMsg() + ": " + ResultCode.SUCCESS.getCode());
        }
    
        /**
         * 枚举类遍历
         */
        @Test
        public void test2() {
            for (ResultCode resultCode : ResultCode.values()) {
                System.out.println("Code: " + resultCode.getCode());
                System.out.println("Message: " + resultCode.getMsg());
                System.out.println("--------------------------");
            }
        }
    
        /**
         * 测试自己写的 getByCode 方法获取枚举常量
         */
        @Test
        public void test3() {
            int code = 1000;
            ResultCode resultCode = ResultCode.getByCode(code);
            if (resultCode != null) {
                System.out.println(resultCode.getMsg() + ": " + resultCode.getCode());
            }
        }
    
        /**
         * 通过静态代码块,通过 map 获取枚举常量
         */
        @Test
        public void test4() {
            // 通过 code 获取枚举常量
            int code = 200;
            ResultCode resultCode = ResultCode.getCodeMsgMap().get(code);
            if (resultCode != null) {
                System.out.println(resultCode.getMsg() + ": " + resultCode.getCode());
            }
    
            // 通过 msg 获取枚举常量
            String msg = "失败";
            ResultCode resultCode2 = ResultCode.getMsgCodeMap().get(msg);
            if (resultCode2 != null) {
                System.out.println(resultCode2.getMsg() + ": " + resultCode2.getCode());
            }
        }
    }

    提醒:本文发布于404天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • 11月01日,星期五, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 中印士兵交换了糖果 10月31日,据印媒报道,排灯节之际,中印双方军队在实控线沿线的几个边境点交换了糖果。

    2. 任正非:今天还不能说华为能活下来

    3. 持续推进交通运输领域适老化服务提升 据悉,近年来,交通运输部深入贯彻党中央、国务院决策部署,积极实施应对人口老龄化国家战略,多措并举提升适老化无障碍出行服务水平。

    4. 11月起买“小电驴”有重大变化

    5. 监狱长花1400多万搞监狱文化软装

    6. 俄对谷歌罚款35位数 超全球GDP总和 10月30日,据外媒报道,俄罗斯政府对谷歌的罚款已成天文数字(约35位数字美元),这一数字远超全球GDP总和。

    7. 女子买黄金不挑款不问价 店员报警

    8. 山西吕梁:女性35岁前结婚奖1500 31日,山西吕梁市政府发布《关于完善生育支持政策体系建设生育友好型社会的若干措施》提出:女性35岁前结婚奖励1500元。

    9. 陈好演技最差的一次 近日,最新一期花儿与少年播出,陈好被导演提问与大家看落日的感受,陈好沉默三秒挠头叹气。网友表示:陈好演技最差的一次。

    10. 这个杀手不太冷内地首映

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 博物馆里展出的古铜镜是不是都是背面,为什么不展出正面呢?
    链接: https://daily.zhihu.com/story/9776620
    ———————-
    标题: 恒温动物比起变温动物有哪些生理上的缺陷?
    链接: https://daily.zhihu.com/story/9776637
    ———————-
    标题: 有没有什么动物杰作,却被误会是人为的?
    链接: https://daily.zhihu.com/story/9776645
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776616
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: M4 版 Mac mini 国补后 3358 元,低过教育优惠 + 支持 6 期免息
    发布时间: 2024-10-31T09:36:42.003
    新闻简介: 苹果 2024 款 Mac mini 于 10 月 29 日发布,搭载 M4 / M4 Pro 芯片,内存 16GB 起步,最高 64GB,该迷你台式主机将于今日上午 9 点接受预购,11 月 8 日起正式发售。
    ———————-
    标题: 一加 13 手机发布:骁龙 8 至尊版、首发第二代 2K 东方屏,4499 元起
    发布时间: 2024-10-31T17:14:29.567
    新闻简介: 一加 13 首发第二代 2K 东方屏,搭载 2K 京东方 X2 最高定制等深四微弧直屏,支持 120Hz 8T LTPO 显示,还有“安卓唯一「太阳显示」技术”。#一加13#
    ———————-
    标题: 谷歌已被俄罗斯罚款 35 位数,达 200000000000000000
    00000000000000000 美元
    发布时间: 2024-10-31T18:09:09.4
    新闻简介: 谷歌 2020 年因其旗下视频平台 YouTube 封杀多个俄罗斯媒体账号败诉,从那开始谷歌被处以每日 10 万卢布(IT之家备注:当前约 7350 元人民币)的罚款。#谷歌被俄罗斯罚款35位数#
    ———————-
    标题: 全球最强笔记本芯片苹果 M4 Max 登场:CPU 比英特尔酷睿 Ultra 7 258V 快 2.5 倍、GPU 快 4 倍
    发布时间: 2024-10-31T07:19:53.1
    新闻简介: 苹果公司面向数据科学家、3D 艺术家、作曲家等时常面对极繁重任务的专业人士,重磅推出了 M4 Max 芯片,最多配备 16 核 CPU 和 40 核 GPU。
    ———————-
    标题: 2 分钟速读 11.11 全网 28 小时攻略:iPhone 16 系列立减千元,政府家电、数码补贴下单立减两千
    发布时间: 2024-10-31T16:51:04.847
    新闻简介: 全网 11.11 大促将于 10 月 31 日 20:00~24:00 限时开抢,2 分钟速读汇总攻略,一键保价没事就点点。
    ———————-
    标题: 贾跃亭造车又拿到钱,法拉第未来宣布收到 3000 万美元投资款
    发布时间: 2024-10-31T12:01:24.413
    新闻简介: 法拉第未来官方表示,这笔资金来自中东、美国和亚洲投资者处,最终投资金额于本周收到。所募资金净额将支持 FF91 的交付和供应链的逐步恢复,并为第二品牌 FX 项目提供资金支持。
    ———————-
    标题: 小米 15 / Pro 年度旗舰手机今日首销:搭载骁龙 8 至尊版,4499 元起
    发布时间: 2024-10-31T09:05:15.603
    新闻简介: 小米 15 手机可选丁香紫、浅草绿、黑、白四款常规配色,以及一款特别的“亮银版”配色,还有多彩的定制版和钻石限定版。
    ———————-
    标题: B站回应“疑似员工操纵直播间抽奖概率”:非在职或离职员工,已封禁
    发布时间: 2024-10-31T09:31:29.533
    新闻简介: “对于中奖异常情况,我们已成立专项小组进行核查,依法严肃处理。欢迎用户通过站内在线客服提供相关线索,共同维护社区的公平公正。”
    ———————-
    标题: 银行再减百元 + 免息:苹果 iPhone 16 / Pro 全系立减千元 4999 元起
    发布时间: 2024-10-31T17:06:54.423
    新闻简介: 苹果 iPhone 16/Pro 系列四款型号售价分别为 5999 元、6999 元、7999 元、9999 元起,天猫中国移动官方旗舰店 11.11 大促全系至高立减千元,到手仅需 4999 元起。
    ———————-
    标题: 再降 240 元:华为 Mate 60 Pro 512G 版 4887 元京东新低
    发布时间: 2024-10-31T09:09:46.103
    新闻简介: 再降240元:华为 Mate 60 Pro 512G 版 4887 元京东新低
    ———————-
    标题: 2024 款苹果 M4 Mac 新品上手:Mac Mini 焕新、iMac 多彩、MacBook Pro 优雅
    发布时间: 2024-10-31T06:33:12.98
    新闻简介: 苹果公司本周密集更新了 M4 Mac 产品线,吸引了众多科技爱好者的目光。在新品发布暂告段落后,苹果公司邀请部分媒体举办了线下体验活动,科技媒体 The Verge 受邀参加,并分享了 M4 Mac 新品的实物照片。
    ———————-
    标题: 小罗伯特・唐尼拒绝被“AI 化”:如果有高管想这样做,自己就起诉
    发布时间: 2024-10-31T07:05:51.46
    新闻简介: 这位奥斯卡影帝反对利用 AI 技术或深度伪造来在荧幕上复刻他的形象。此话题源自他在漫威饰演钢铁侠的经历,但唐尼对漫威不会用 AI 重塑托尼·斯塔克充满信心。
    ———————-

    —- IT之家新闻 End —-

  • 11月01日,星期五, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 中印士兵交换了糖果 10月31日,据印媒报道,排灯节之际,中印双方军队在实控线沿线的几个边境点交换了糖果。

    2. 任正非:今天还不能说华为能活下来

    3. 持续推进交通运输领域适老化服务提升 据悉,近年来,交通运输部深入贯彻党中央、国务院决策部署,积极实施应对人口老龄化国家战略,多措并举提升适老化无障碍出行服务水平。

    4. 11月起买“小电驴”有重大变化

    5. 监狱长花1400多万搞监狱文化软装

    6. 俄对谷歌罚款35位数 超全球GDP总和 10月30日,据外媒报道,俄罗斯政府对谷歌的罚款已成天文数字(约35位数字美元),这一数字远超全球GDP总和。

    7. 女子买黄金不挑款不问价 店员报警

    8. 山西吕梁:女性35岁前结婚奖1500 31日,山西吕梁市政府发布《关于完善生育支持政策体系建设生育友好型社会的若干措施》提出:女性35岁前结婚奖励1500元。

    9. 陈好演技最差的一次 近日,最新一期花儿与少年播出,陈好被导演提问与大家看落日的感受,陈好沉默三秒挠头叹气。网友表示:陈好演技最差的一次。

    10. 这个杀手不太冷内地首映

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 博物馆里展出的古铜镜是不是都是背面,为什么不展出正面呢?
    链接: https://daily.zhihu.com/story/9776620
    ———————-
    标题: 恒温动物比起变温动物有哪些生理上的缺陷?
    链接: https://daily.zhihu.com/story/9776637
    ———————-
    标题: 有没有什么动物杰作,却被误会是人为的?
    链接: https://daily.zhihu.com/story/9776645
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776616
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: M4 版 Mac mini 国补后 3358 元,低过教育优惠 + 支持 6 期免息
    发布时间: 2024-10-31T09:36:42.003
    新闻简介: 苹果 2024 款 Mac mini 于 10 月 29 日发布,搭载 M4 / M4 Pro 芯片,内存 16GB 起步,最高 64GB,该迷你台式主机将于今日上午 9 点接受预购,11 月 8 日起正式发售。
    ———————-
    标题: 一加 13 手机发布:骁龙 8 至尊版、首发第二代 2K 东方屏,4499 元起
    发布时间: 2024-10-31T17:14:29.567
    新闻简介: 一加 13 首发第二代 2K 东方屏,搭载 2K 京东方 X2 最高定制等深四微弧直屏,支持 120Hz 8T LTPO 显示,还有“安卓唯一「太阳显示」技术”。#一加13#
    ———————-
    标题: 谷歌已被俄罗斯罚款 35 位数,达 200000000000000000
    00000000000000000 美元
    发布时间: 2024-10-31T18:09:09.4
    新闻简介: 谷歌 2020 年因其旗下视频平台 YouTube 封杀多个俄罗斯媒体账号败诉,从那开始谷歌被处以每日 10 万卢布(IT之家备注:当前约 7350 元人民币)的罚款。#谷歌被俄罗斯罚款35位数#
    ———————-
    标题: 全球最强笔记本芯片苹果 M4 Max 登场:CPU 比英特尔酷睿 Ultra 7 258V 快 2.5 倍、GPU 快 4 倍
    发布时间: 2024-10-31T07:19:53.1
    新闻简介: 苹果公司面向数据科学家、3D 艺术家、作曲家等时常面对极繁重任务的专业人士,重磅推出了 M4 Max 芯片,最多配备 16 核 CPU 和 40 核 GPU。
    ———————-
    标题: 2 分钟速读 11.11 全网 28 小时攻略:iPhone 16 系列立减千元,政府家电、数码补贴下单立减两千
    发布时间: 2024-10-31T16:51:04.847
    新闻简介: 全网 11.11 大促将于 10 月 31 日 20:00~24:00 限时开抢,2 分钟速读汇总攻略,一键保价没事就点点。
    ———————-
    标题: 贾跃亭造车又拿到钱,法拉第未来宣布收到 3000 万美元投资款
    发布时间: 2024-10-31T12:01:24.413
    新闻简介: 法拉第未来官方表示,这笔资金来自中东、美国和亚洲投资者处,最终投资金额于本周收到。所募资金净额将支持 FF91 的交付和供应链的逐步恢复,并为第二品牌 FX 项目提供资金支持。
    ———————-
    标题: 小米 15 / Pro 年度旗舰手机今日首销:搭载骁龙 8 至尊版,4499 元起
    发布时间: 2024-10-31T09:05:15.603
    新闻简介: 小米 15 手机可选丁香紫、浅草绿、黑、白四款常规配色,以及一款特别的“亮银版”配色,还有多彩的定制版和钻石限定版。
    ———————-
    标题: B站回应“疑似员工操纵直播间抽奖概率”:非在职或离职员工,已封禁
    发布时间: 2024-10-31T09:31:29.533
    新闻简介: “对于中奖异常情况,我们已成立专项小组进行核查,依法严肃处理。欢迎用户通过站内在线客服提供相关线索,共同维护社区的公平公正。”
    ———————-
    标题: 银行再减百元 + 免息:苹果 iPhone 16 / Pro 全系立减千元 4999 元起
    发布时间: 2024-10-31T17:06:54.423
    新闻简介: 苹果 iPhone 16/Pro 系列四款型号售价分别为 5999 元、6999 元、7999 元、9999 元起,天猫中国移动官方旗舰店 11.11 大促全系至高立减千元,到手仅需 4999 元起。
    ———————-
    标题: 再降 240 元:华为 Mate 60 Pro 512G 版 4887 元京东新低
    发布时间: 2024-10-31T09:09:46.103
    新闻简介: 再降240元:华为 Mate 60 Pro 512G 版 4887 元京东新低
    ———————-
    标题: 2024 款苹果 M4 Mac 新品上手:Mac Mini 焕新、iMac 多彩、MacBook Pro 优雅
    发布时间: 2024-10-31T06:33:12.98
    新闻简介: 苹果公司本周密集更新了 M4 Mac 产品线,吸引了众多科技爱好者的目光。在新品发布暂告段落后,苹果公司邀请部分媒体举办了线下体验活动,科技媒体 The Verge 受邀参加,并分享了 M4 Mac 新品的实物照片。
    ———————-
    标题: 小罗伯特・唐尼拒绝被“AI 化”:如果有高管想这样做,自己就起诉
    发布时间: 2024-10-31T07:05:51.46
    新闻简介: 这位奥斯卡影帝反对利用 AI 技术或深度伪造来在荧幕上复刻他的形象。此话题源自他在漫威饰演钢铁侠的经历,但唐尼对漫威不会用 AI 重塑托尼·斯塔克充满信心。
    ———————-

    —- IT之家新闻 End —-

  • Java 基础之常见的输入输出流以及基本使用


    共计 6966 个字符,预计需要花费 18 分钟才能阅读完成。

    介绍

    流是用了读取和写出数据的对象,下面是常见的一些对象即使用方法。

    1. 字节流

    • InputStream:用于从字节流中读取数据。

      InputStream 为抽象类,常见的继承类:FileInputStream、BufferedInputStream、DataInputStream、ObjectInputStream。

    • OutputStream:用于向字节流中写入数据。

      OutputStream 同样为抽象类,常见继承类:FileOutputStream、BufferedOutputStream、DataOutputStream、ObjectOutputStream

    2. 字符流

    • Reader:用于从字符流中读取数据。

      Reader 也为抽象类,常见的继承类:FileReader、InputStreamReader、BufferedReader、StringReader。

    • Writer:用于向字符流中写入数据。

      Writer 为抽象类,常见的继承类:FileWriter、OutputStreamWriter、BufferedWriter、StringWriter。

    3. 缓冲流

    缓冲流内置了缓冲区,将磁盘内容先读取到缓冲区即内存中,一般默认大小为 8K,获取字节或字符时直接从内存中取出,减少了和磁盘打交道的次数。

    • BufferedInputStream:提供了缓冲功能的字节输入流。

    • BufferedOutputStream:提供了缓冲功能的字节输出流。

    • BufferedReader:提供了缓冲功能的字符输入流。

    • BufferedWriter:提供了缓冲功能的字符输出流。

    4. 文件流

    • FileInputStream:用于从文件中读取数据的字节流。

    • FileOutputStream:用于向文件中写入数据的字节流。

    • FileReader:用于从文件中读取数据的字符流。

    • FileWriter:用于向文件中写入数据的字符流。

    5. 转换流

    • InputStreamReader:将字节流转换为字符流的转换流。

    • OutputStreamWriter:将字符流转换为字节流的转换流。

    6. 数据流

    支持读写基本数据类型和字符串,但是不支持读写对象类型。

    • DataInputStream:用于读取基本数据类型和字符串的流。

    • DataOutputStream:用于写入基本数据类型和字符串的流。

    7. 对象流

    支持基本类型和字符串的读写,同时也从支持对实现了Serializable 接口的对象进行序列化和反序列化。

    • ObjectInputStream:用于读取对象的流。

    • ObjectOutputStream:用于写入对象的流。

    基本使用

    以下内容是对上面各种输入输出流的一些测试方法:

    public class IOTest {
    
        /**
         * 字节流 InputStream OutputStream
         * 1. 利用输入流,读取 file.txt, 将字符打印在控制台
         * 2. 利用输出流,复制 file.txt 里面的内容,追加到 file_copy.txt
         */
        @Test
        public void test1() throws IOException {
            String inputFile = "file/io/file.txt";
            String outPutFile = "file/io/file_copy.txt";
            initFileTxt(inputFile);  // 初始化文件内容为:你好啊amjun
            // try-with-resources 语句
            try (InputStream inputStream = new FileInputStream(inputFile);
                 OutputStream outputStream = new FileOutputStream(outPutFile);) {
                int byteData;
                while ((byteData = inputStream.read()) != -1) {
                    // byteData 是读取到的单个字节,因为这种读取方式是单个字符读取的
                    // 打印中文时会乱码,因为中文在utf-8中是三个字节为一个字符
                    System.out.println(byteData + "  " + (char)byteData);
                    outputStream.write(byteData);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 使用缓冲区进行数据读取
         * 1. 创建一个字节数组作为缓冲区
         * 2. 输入流读取字节时,将字节读入缓冲区
         * 3. 打印时,通过缓冲区的内容创建一个字符串
         * 4. 写入文件时,将缓冲区的内容一次性写入
         */
        @Test
        public void test2(){
            String inputFile = "file/io/file.txt";
            String outPutFile = "file/io/file_buffer_copy.txt";
            initFileTxt(inputFile); // 初始化文件内容为:你好啊amjun
            try (InputStream inputStream = new FileInputStream(inputFile);
                 OutputStream outputStream = new FileOutputStream(outPutFile);) {
                // 创建临时字节数组缓冲区
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    // bytesRead 是读取到的字节数,当字节少于1024时,一次性全部读取并打印,所以打印不会乱码
                    System.out.print(new String(buffer, 0 , bytesRead));
                    // 字节数为 14,因为3中文+5英文,中文3个字节1个字符,英文1个字节1个字符
                    System.out.println("\n读取到的字节数:" + bytesRead);
                    outputStream.write(buffer, 0, bytesRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 字节缓冲流 BufferedInputStream BufferedOutputStream
         * 引入了缓冲区,缓冲区的存在可以减少和磁盘之间的交互次数,提高读写效率。有需要可以打印时间进行测试
         * 缓冲区会一次读取一定量的数据,然后在内存中进行操作,直到缓冲区被填满或者操作完成后再写回磁盘。
         */
        @Test
        public void test3(){
            String inputFile = "file/io/file.txt";
            String outPutFile = "file/io/file_buffer2_copy.txt";
            initFileTxt(inputFile); // 初始化文件内容为:你好啊amjun
            try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(inputFile));
                 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outPutFile))) {
                // 创建临时字节数组缓冲区
                int bytesRead;
                while ((bytesRead = bufferedInputStream.read()) != -1) {
                    // 该乱码还是乱码,因为即使内部实现了缓冲区,但是读取的字节还是一个个读取出来的,但是字节的读取是在内存中读的,而不是在磁盘中
                    System.out.println(bytesRead + "  " + (char)bytesRead);
                    bufferedOutputStream.write(bytesRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 字符流转换流 InputStreamReader OutputStreamWriter
         * 1. 先将文件读取为字节流,然后用字符流包装,输出流文件也是如此
         * 2. 创建一个字符数组作为缓冲区
         * 3. 将文件读取到字符缓冲区
         * 4. 将字符缓冲区的内容打印和写入
         */
        @Test
        public void test4(){
            String inputFile = "file/io/file.txt";
            String outPutFile = "file/io/file_buffer_copy.txt";
            initFileTxt(inputFile); // 初始化文件内容为:你好啊amjun
            try (InputStreamReader reader = new InputStreamReader(new FileInputStream(inputFile));
                 OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outPutFile));) {
                // 创建临时字符数组缓冲区
                char[] buffer = new char[1024];
                int charsRead;
                while ((charsRead = reader.read(buffer)) != -1) {
                    // 将读取到的字符写入控制台,由于字符数小于1024,会一次性全部输出
                    System.out.print(new String(buffer, 0, charsRead));
                    // 3中文字符+5英文字符
                    System.out.println("\n读取到的字符数:" + charsRead);
                    // 将读取的数据追加到目标文件中
                    writer.write(buffer, 0, charsRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 字符缓冲流 BufferedReader BufferedWriter
         */
        @Test
        public void test5(){
            String inputFile = "file/io/file.txt";
            String outPutFile = "file/io/file_buffer_copy.txt";
            initFileTxt(inputFile); // 初始化文件内容为:你好啊amjun
            // 装饰器模式
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));
                 BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPutFile)))) {
                // 创建临时字符数组缓冲区
                char[] buffer = new char[1024];
                int charsRead;
                while ((charsRead = bufferedReader.read(buffer)) != -1) {
                    // 将读取到的字符写入控制台,由于字符数小于1024,会一次性全部输出
                    System.out.print(new String(buffer, 0, charsRead));
                    // 3中文字符+5英文字符
                    System.out.println("\n读取到的字符数:" + charsRead);
                    // 将读取的数据追加到目标文件中
                    bufferedWriter.write(buffer, 0, charsRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         *  字符流 FileReader FileWriter
         */
        @Test
        public void test6() throws IOException {
            String inputFile = "file/io/file.txt";
            String outPutFile = "file/io/file_buffer_copy.txt";
            initFileTxt(inputFile); // 初始化文件内容为:你好啊amjun
            try (Reader reader = new FileReader(inputFile);
                Writer writer = new FileWriter(outPutFile);) {
                // 创建临时字符数组缓冲区
                char[] buffer = new char[1024];
                int charsRead;
                while ((charsRead = reader.read(buffer)) != -1) {
                    // 将读取到的字符写入控制台,由于字符数小于1024,会一次性全部输出
                    System.out.print(new String(buffer, 0, charsRead));
                    // 3中文字符+5英文字符
                    System.out.println("\n读取到的字符数:" + charsRead);
                    // 将读取的数据追加到目标文件中
                    writer.write(buffer, 0, charsRead);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 数据流 DataInputStream DataOutputStream
         * 只支持读写基本数据类型和字符串
         */
        @Test
        public void test7() {
            String obgFile = "file/io/data.bin";
            try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(obgFile))) {
                dataOutputStream.writeInt(19);
                System.out.println("写入基本数据类型成功...");
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream(obgFile));) {
                int i = dataInputStream.readInt();
                System.out.println("读取基本类型数据:" +  i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 对象流 ObjectInputStream ObjectOutputStream
         * 对象流不能使用字符流进行包装,因为O对象流是基于字节流的,用于写入对象的二进制表示。而字符流主要用于处理字符数据。
         */
        @Test
        public void test8() {
            // 序列化对象
            String obgFile = "file/io/obj.bin";
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(obgFile))) {
                User user = new User().setName("zhangsan").setAge(18);
                objectOutputStream.writeObject(user);
                System.out.println("写入对象成功...");
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            // 反序列化对象
            try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(obgFile));) {
                User user = (User)objectInputStream.readObject();
                System.out.println("读取的对象为:" + user);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 初始化文件内容
         */
        public void initFileTxt(String outputFile){
            try(OutputStream outputStream = new FileOutputStream(outputFile);
            OutputStreamWriter writer = new OutputStreamWriter(outputStream)){
                String str = "你好啊amjun";
                // 将字符串以字节数组方式写入文件
                //byte[] byteArray = str.getBytes("UTF-8");
                //outputStream.write(byteArray);
    
                // 将文件以字符数组写入文件
                char[] charArray = str.toCharArray();
                writer.write(charArray);
            }catch (IOException e){
    
            }
        }
    }
    
    @Data
    @Accessors(chain = true)
    class User implements Serializable{
    
        public String name;
    
        public int age;
    }

    提醒:本文发布于402天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Java 基础之线程以及三种创建线程的方式


    共计 3398 个字符,预计需要花费 9 分钟才能阅读完成。

    简介

    线程是一种重要的概念,用于实现并发执行的多任务。

    • 线程是程序执行的最小单元,它可以独立执行代码片段。

    • 多线程允许在同一程序中同时执行多个任务,提高程序的并发性和响应能力。

    • 线程可以共享内存空间,方便数据交换和通信。

    三种方式创建线程

    1. 继承Thread类

    可以通过继承 Thread 类,并重写 run() 方法,在需要的地方调用 start 方法进行执行线程。

    注意:需要调用 start 方法才能看见线程效果,调用 run 方法只是在当前线程同步执行 run 方法。

    如果需要执行的逻辑代码只在一个地方出现,那么可以使用 Lambda 表达式的方式给

    public class ThreadTest {
    
        /**
         * 继承自 Thread 的类
         * 1. 需要调用 start 方法才能看见线程效果,调用 run 方法只是在当前线程同步执行 run 方法
         */
        public static void main(String[] args) {
            new MyThread("线程1", 5).start();
    
            new MyThread("线程2", 2).start();
        }
    }
    
    class MyThread extends Thread {
        int count;
    
        MyThread(String name, int count){
            super(name);
            this.count = count;
        }
    
        @Override
        public void run() {
            System.out.println(getName() + "开始执行,时间:" + new Date());
            try {
                for (int i=0; i < count; i++){
                    System.out.println(getName() + "第" + (i+1) + "次执行....");
                    Thread.sleep(1000);
                }
    
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(getName() + "执行完毕,时间:" + new Date());
        }
    }

    2. 实现Runnable接口

    首先需要注意的是,实现 Runnable 接口的方式,其实还是要将实现类作为构造参数传递给 Thread 类,通过 Thread 的 start 方法开辟一个线程。

    另外,Runnable 接口是一个函数式接口,可以通过 Lambda 表达式创建实现类。

    public class RunnableTest {
    
        /**
         * 为什么需要通过Thread执行Runnable对象
         * 1. 线程管理:Thread类提供了对线程的管理和控制。它包含了一些方法,例如start()来启动线程,join()来等待线程完成,
         *      interrupt()来中断线程等。通过Thread类,可以更方便地控制线程的生命周期和执行。
         * 2. 线程调度:Thread类提供了线程调度的功能。线程调度是指决定线程执行顺序和时间片分配的过程。
         *      通过Thread类,可以设置线程的优先级、睡眠时间和调度策略等。
         * 3. 线程上下文:Thread类维护了线程的上下文信息,例如线程名称、线程状态、线程组等。
         *      通过Thread类,可以方便地获取和设置这些信息。
         */
        public static void main(String[] args) {
            MyRunnable runnable1 = new MyRunnable("线程1", 5);
            Thread thread1 = new Thread(runnable1);
            thread1.start();
    
            // Lambda 表达式创建线程
            new Thread(() -> {
                System.out.println( "线程2开始执行,时间:" + new Date());
                try {
                    for (int i=0; i < 2; i++){
                        System.out.println("线程2第" + (i+1) + "次执行....");
                        Thread.sleep(1000);
                    }
    
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程2执行完毕,时间:" + new Date());
            }).start();
        }
    }
    
    class MyRunnable implements Runnable {
        private String name;
        private int count;
    
        MyRunnable(String name, int count) {
            this.name = name;
            this.count = count;
        }
    
        @Override
        public void run() {
            System.out.println(name + "开始执行,时间:" + new Date());
            try {
                for (int i=0; i < count; i++){
                    System.out.println(name + "第" + (i+1) + "次执行....");
                    Thread.sleep(1000);
                }
    
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(name + "执行完毕,时间:" + new Date());
        }
    }

    3. 实现Callable接口

    前面两种方式都是通过重写 run 方法实现多线程,需要注意的是 run 方法返回值是 void,也就是说无法获取线程的执行结果,于是 Callable 出现了。

    这种方式需要通过线程池的方式进行调用,首先需要创建一个线程池,然后创建一个 Callable 接口的实现类,使用线程池的 submitexecute 执行线程中的代码。

    而这两个方法的区别是, execute 方法是无返回值的,效果和上面的方式一样。而 submit 是有返回值的,返回的是一个 Future<T> 接口类型的对象,通过该接口的 get 方法可以获取到返回值。

    public class CallableTest {
    
        /**
         *
         * @param args
         */
        public static void main(String[] args) {
            ExecutorService executor = Executors.newFixedThreadPool(2);
            System.out.println("实际创建的线程池对象:" + executor);
    
            Callable<String> task1 = new MyCallable("线程1", 5);
            Future<String> future1 = executor.submit(task1);
            System.out.println("实际创建的Future对象:" + future1);
    
            Callable<String> task2 = new MyCallable("线程2", 2);
            Future<String> future2 = executor.submit(task2);
    
            executor.shutdown();
    
            try {
                // 这里是阻塞的,需要等待获取结果
                String result1 = future1.get();
                System.out.println(result1);
    
                // 虽然线程2比线程1早执行完,但是需要等待线程1执行完毕。如果放在线程1之前获取返回值,则先打印线程2执行完毕
                String result2 = future2.get();
                System.out.println(result2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    class MyCallable implements Callable<String> {
        private String name;
        private int count;
    
        public MyCallable(String name, int count) {
            this.name = name;
            this.count = count;
        }
    
        @Override
        public String call() throws Exception {
            //System.out.println(name + "开始执行,时间:" + new Date());
            for (int i=0; i < count; i++){
                System.out.println(name + "第" + (i+1) + "次执行....");
                Thread.sleep(1000);
            }
            //System.out.println(name + "执行完毕,时间:" + new Date());
            return name + "执行完毕!!!!!!!";
        }
    }

    提醒:本文发布于402天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Docker 部署 NasCab 云可云


    共计 827 个字符,预计需要花费 3 分钟才能阅读完成。

    1. 简介及安装

    云可云是一个支持照片管理、影音管理、文件浏览器和文件共享等功能的多功能管理软件,支持 window、mac、移动端甚至是 docker 进行安装,且界面非常美观,功能也非常全面。

    以下就是 docker 的安装方式:

    docker run -d \
    --name nascab \
    -p 8080:80 \
    -p 8443:443 \
    -p 8090:90 \
    -p 8021:21 \
    -v /home/docker/nascab/mydata:/mydata \
    -v /home/docker/nascab/data:/root/.local/share/nascab \
    ypptec/nascab

    以上命令映射了两个端口,8080 是用于 web 访问的端口,,8443用于 https,8090 是用于 Webdav 服务端口,8021 是 ftp 端口。映射的文件夹 mydata 是用于存储自己的文件,如照片、视频等数据,data 数据是NasCab 的数据库和缓存目录。

    首先就是设置管理员账号密码。

    Docker 部署 NasCab 云可云

    />

    2. 首页展示

    接下来进入到首页,可以看见磁盘、CPU、内存等基本信息,因为现在还没添加照片视频等信息,所以还没有展示。

    Docker 部署 NasCab 云可云

    />

    3. 照片管理

    进入照片管理,提示需要设置来源目录,因为 nascab 需要进行扫描,所以清朝云在 mydata 目录下新建 photo 照片目录作为示例。

    Docker 部署 NasCab 云可云

    />

    点击右上角进行图片上传,选择刚刚创建的 photo 目录,上传后点击刷新索引。

    Docker 部署 NasCab 云可云

    />

    接下来可以在时间轴看见上传的照片。

    Docker 部署 NasCab 云可云

    />

    4. 影视管理

    接下来同样的操作,添加 video 文件夹,上传视频文件。

    Docker 部署 NasCab 云可云

    />

    点击播放是可以在线播放的。

    Docker 部署 NasCab 云可云

    />

    5. 文件浏览

    点击首页的文件浏览,同样可以进入目录进行查看文件,这里进入刚刚创建的 photo 文件夹。

    Docker 部署 NasCab 云可云

    />

    6. 文件备份

    此外,还支持备份,且支持单次、每天、每周、每月备份。

    Docker 部署 NasCab 云可云

    />

    7. 文件分享

    支持 webdav、ftp 文件共享,此功能清朝云暂未测试。

    Docker 部署 NasCab 云可云

    />

    8. 安全中心

    这里是为了保障系统的安全,防止暴露公网后被暴力破解等措施。

    Docker 部署 NasCab 云可云

    />

    9. 设置

    这里是一些系统的设置,如用户管理、系统语言、端口等等。

    Docker 部署 NasCab 云可云

    提醒:本文发布于402天前,文中所关联的信息可能已发生改变,请知悉!

    />

    Tips:清朝云网络工作室

  • 10月31日,星期四, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 上海提醒市民提前囤水囤粮 据悉,10月31日傍晚到11月1日,上海市有大暴雨。上海气象部门提醒:台风影响前可适量储备饮用水和食物,期间尽量减少外出。

    2. 被捕韩国间谍曾在多家中国芯片厂工作

    3. 回顾神十九乘组出征太空 10月30日,神舟十九号载人飞船成功飞天。回顾“90后”初上太空,航天员们的出征宣言。飞天前的每一幕都自信满满!

    4. 男子在同一小区找了5个“媳妇”

    5. 女子二胎咨询休产次日竟遭辞退

    6. 马斯克想让14个母子住在一起

    7. 金城武隐居7年被曝在种田

    8. 开封王婆获得一百万元奖金

    9. 三只羊6894.91万罚款交了吗?当地回应 日前,合肥三只羊公司因在直播中进行虚假宣传等行为,被罚款6894.91万元。当地10月30日回应:暂未收到罚款缴纳通知。

    10. 很多被拐孩子和亲生父母已无感情 近日,《失孤》原型案二审结束,两名人贩子维持原判。二审开庭时检察员透露:很多被拐孩子和亲生父母已无感情。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 在进化史上有没有特别有趣或者奇葩的进化?
    链接: https://daily.zhihu.com/story/9776493
    ———————-
    标题: 西周政治制度有哪些特点?
    链接: https://daily.zhihu.com/story/9776502
    ———————-
    标题: 椭圆没有周长?
    链接: https://daily.zhihu.com/story/9776507
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: iQOO 13 手机发布:骁龙 8 至尊版、6150mAh 电池,3999 元起
    发布时间: 2024-10-30T17:12:42.767
    新闻简介: iQOO 13 手机今日正式发布,该手机搭载骁龙 8 至尊版处理器,配备等效 6150mAh 蓝海电池,拥有传奇、赛道、曼岛和纳多灰四种配色,售价 3999 元起。#iQOO13#
    ———————-
    标题: 4499 元起荣耀 Magic 7 系列正式发布:骁龙 8 至尊版,支持 IP68/69 防水、100W 有线 + 80W 无线快充
    发布时间: 2024-10-30T21:13:24.473
    新闻简介: 在今晚的发布会上,赵明推出了全新的荣耀 Magic 7 系列旗舰手机#荣耀Magic7##荣耀Magic7配置##荣耀发布会##荣耀Magic7系列AI旗舰发布#
    ———————-
    标题: 卢伟冰回应公布小米 15 Pro 手机价格“口误”:给发布会带来了一些欢乐
    发布时间: 2024-10-30T09:03:19.007
    新闻简介: 今天上午,小米集团合伙人、总裁、手机部总裁@卢伟冰 在微博上发文称:“昨晚在出小米15 Pro价格的时候,我出现了口误,给发布会带来了一些欢乐。”
    ———————-
    标题: 小米 15 Ultra 手机将树影像新标杆:索尼最强 1 英寸主摄、2 亿像素 5X 潜望镜头
    发布时间: 2024-10-30T08:24:02.18
    新闻简介: 科技媒体 xiaomitime 昨日(10 月 29 日)挖掘 Mi Code 代码,发现了小米 15 Ultra 手机的相机规格信息。小米 15 Ultra 将配备强大的相机模块,预计将为智能手机摄影设定新的标杆。
    ———————-
    标题: 苹果 iOS 18.1 正式支持 5G 消息功能
    发布时间: 2024-10-30T08:52:57.513
    新闻简介: 苹果于 10 月 28 日晚发布了 iOS 18.1 正式版更新,这次更新带来了 5G 消息功能,它支持在苹果与安卓设备之间互相收发高清图片、视频、实时位置等多种媒体形式组合的内容,还可以通过会话交互获取个性化信息服务。
    ———————-
    标题: 纽北更新官网录入小米 SU7 Ultra 圈速,6 分 46 秒 874 位居原型车组第四
    发布时间: 2024-10-30T14:06:45.72
    新闻简介: 小米创办人、董事长兼CEO雷军今天下午发文宣布,纽北官网更新并录入了小米SU7 Ultra原型车的圈速成绩。
    ———————-
    标题: 2024 款苹果 Mac mini 细节:电源按钮挪到设备底部
    发布时间: 2024-10-30T07:12:09.963
    新闻简介: 科技媒体 MacRumors 昨日(10 月 29 日)发布博文,报道称 2024 款 Mac mini 采用了全新的设计,苹果为了容纳各种部件,因此不得不将电源按钮挪到底部。
    ———————-
    标题: 王化:小米 15 手机屏幕不会混用,仅由 TCL 华星独供
    发布时间: 2024-10-30T16:45:30.347
    新闻简介: 小米 15 手机昨晚发布,12GB + 256GB 起步,定价 4499 元起。
    ———————-
    标题: 雷军回应小米 SU7 Ultra 车模秒售罄:基本都是手工做的,产能很低
    发布时间: 2024-10-30T09:44:19.707
    新闻简介: 有网友在@雷军 微博评论区喊话“车模没有啦”,雷军回复称:“目前车模基本上都是手工做的,产能很低。”
    ———————-
    标题: 苹果推出 2024 款 14/16 英寸 MacBook Pro:首发 M4 Max 芯片、16GB 起步内存,12999 元起
    发布时间: 2024-10-30T23:02:22.417
    新闻简介: 苹果更新了 14 英寸 MacBook Pro,配备 M4 芯片、16GB RAM、额外的 Thunderbolt 端口、太空黑等。
    ———————-
    标题: 小米 NAS 产品最新进度公布:核心技术已展开预研,将支持手机扩容、AI 相册、电影视频刮削等功能
    发布时间: 2024-10-30T19:23:35.807
    新闻简介: 据小米生态链总经理陈波对 NAS 产品的进度介绍:目前团队正在整理产品的定义,针对核心技术已经展开了几个月的预研,目标是打造出最适合小米米家用户的家庭存储产品。
    ———————-
    标题: 苹果 M2 / M3 版 MacBook Air 标配升级至 16GB 内存,国行 7999 元起
    发布时间: 2024-10-30T23:09:07.18
    新闻简介: 搭载 M2 和 M3 芯片的 MacBook Air 现标配 16GB 内存,相比之前翻倍,而起售价仍为 RMB 7,999。
    ———————-

    —- IT之家新闻 End —-

  • 10月31日,星期四, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 上海提醒市民提前囤水囤粮 据悉,10月31日傍晚到11月1日,上海市有大暴雨。上海气象部门提醒:台风影响前可适量储备饮用水和食物,期间尽量减少外出。

    2. 被捕韩国间谍曾在多家中国芯片厂工作

    3. 回顾神十九乘组出征太空 10月30日,神舟十九号载人飞船成功飞天。回顾“90后”初上太空,航天员们的出征宣言。飞天前的每一幕都自信满满!

    4. 男子在同一小区找了5个“媳妇”

    5. 女子二胎咨询休产次日竟遭辞退

    6. 马斯克想让14个母子住在一起

    7. 金城武隐居7年被曝在种田

    8. 开封王婆获得一百万元奖金

    9. 三只羊6894.91万罚款交了吗?当地回应 日前,合肥三只羊公司因在直播中进行虚假宣传等行为,被罚款6894.91万元。当地10月30日回应:暂未收到罚款缴纳通知。

    10. 很多被拐孩子和亲生父母已无感情 近日,《失孤》原型案二审结束,两名人贩子维持原判。二审开庭时检察员透露:很多被拐孩子和亲生父母已无感情。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 在进化史上有没有特别有趣或者奇葩的进化?
    链接: https://daily.zhihu.com/story/9776493
    ———————-
    标题: 西周政治制度有哪些特点?
    链接: https://daily.zhihu.com/story/9776502
    ———————-
    标题: 椭圆没有周长?
    链接: https://daily.zhihu.com/story/9776507
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: iQOO 13 手机发布:骁龙 8 至尊版、6150mAh 电池,3999 元起
    发布时间: 2024-10-30T17:12:42.767
    新闻简介: iQOO 13 手机今日正式发布,该手机搭载骁龙 8 至尊版处理器,配备等效 6150mAh 蓝海电池,拥有传奇、赛道、曼岛和纳多灰四种配色,售价 3999 元起。#iQOO13#
    ———————-
    标题: 4499 元起荣耀 Magic 7 系列正式发布:骁龙 8 至尊版,支持 IP68/69 防水、100W 有线 + 80W 无线快充
    发布时间: 2024-10-30T21:13:24.473
    新闻简介: 在今晚的发布会上,赵明推出了全新的荣耀 Magic 7 系列旗舰手机#荣耀Magic7##荣耀Magic7配置##荣耀发布会##荣耀Magic7系列AI旗舰发布#
    ———————-
    标题: 卢伟冰回应公布小米 15 Pro 手机价格“口误”:给发布会带来了一些欢乐
    发布时间: 2024-10-30T09:03:19.007
    新闻简介: 今天上午,小米集团合伙人、总裁、手机部总裁@卢伟冰 在微博上发文称:“昨晚在出小米15 Pro价格的时候,我出现了口误,给发布会带来了一些欢乐。”
    ———————-
    标题: 小米 15 Ultra 手机将树影像新标杆:索尼最强 1 英寸主摄、2 亿像素 5X 潜望镜头
    发布时间: 2024-10-30T08:24:02.18
    新闻简介: 科技媒体 xiaomitime 昨日(10 月 29 日)挖掘 Mi Code 代码,发现了小米 15 Ultra 手机的相机规格信息。小米 15 Ultra 将配备强大的相机模块,预计将为智能手机摄影设定新的标杆。
    ———————-
    标题: 苹果 iOS 18.1 正式支持 5G 消息功能
    发布时间: 2024-10-30T08:52:57.513
    新闻简介: 苹果于 10 月 28 日晚发布了 iOS 18.1 正式版更新,这次更新带来了 5G 消息功能,它支持在苹果与安卓设备之间互相收发高清图片、视频、实时位置等多种媒体形式组合的内容,还可以通过会话交互获取个性化信息服务。
    ———————-
    标题: 纽北更新官网录入小米 SU7 Ultra 圈速,6 分 46 秒 874 位居原型车组第四
    发布时间: 2024-10-30T14:06:45.72
    新闻简介: 小米创办人、董事长兼CEO雷军今天下午发文宣布,纽北官网更新并录入了小米SU7 Ultra原型车的圈速成绩。
    ———————-
    标题: 2024 款苹果 Mac mini 细节:电源按钮挪到设备底部
    发布时间: 2024-10-30T07:12:09.963
    新闻简介: 科技媒体 MacRumors 昨日(10 月 29 日)发布博文,报道称 2024 款 Mac mini 采用了全新的设计,苹果为了容纳各种部件,因此不得不将电源按钮挪到底部。
    ———————-
    标题: 王化:小米 15 手机屏幕不会混用,仅由 TCL 华星独供
    发布时间: 2024-10-30T16:45:30.347
    新闻简介: 小米 15 手机昨晚发布,12GB + 256GB 起步,定价 4499 元起。
    ———————-
    标题: 雷军回应小米 SU7 Ultra 车模秒售罄:基本都是手工做的,产能很低
    发布时间: 2024-10-30T09:44:19.707
    新闻简介: 有网友在@雷军 微博评论区喊话“车模没有啦”,雷军回复称:“目前车模基本上都是手工做的,产能很低。”
    ———————-
    标题: 苹果推出 2024 款 14/16 英寸 MacBook Pro:首发 M4 Max 芯片、16GB 起步内存,12999 元起
    发布时间: 2024-10-30T23:02:22.417
    新闻简介: 苹果更新了 14 英寸 MacBook Pro,配备 M4 芯片、16GB RAM、额外的 Thunderbolt 端口、太空黑等。
    ———————-
    标题: 小米 NAS 产品最新进度公布:核心技术已展开预研,将支持手机扩容、AI 相册、电影视频刮削等功能
    发布时间: 2024-10-30T19:23:35.807
    新闻简介: 据小米生态链总经理陈波对 NAS 产品的进度介绍:目前团队正在整理产品的定义,针对核心技术已经展开了几个月的预研,目标是打造出最适合小米米家用户的家庭存储产品。
    ———————-
    标题: 苹果 M2 / M3 版 MacBook Air 标配升级至 16GB 内存,国行 7999 元起
    发布时间: 2024-10-30T23:09:07.18
    新闻简介: 搭载 M2 和 M3 芯片的 MacBook Air 现标配 16GB 内存,相比之前翻倍,而起售价仍为 RMB 7,999。
    ———————-

    —- IT之家新闻 End —-

  • Windows 使用 ffmpeg 批量压缩视频文件


    共计 2247 个字符,预计需要花费 6 分钟才能阅读完成。

    下载了一些视频,感觉默认有点大,于是准备使用 ffmpeg 进行压缩,用了如下命令感觉效果还不错。

    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

    但是需要压缩的视频有点多,并且我的视频是分类好的,不想压缩的时候整到一个文件夹去到时候又要分文件夹,所以借助 gpt 写出了此脚本,不得不说虽然有 gpt 还是踩坑不少的。

    这个脚本能保证原来的目录结构,只需要指定输出目录即可。

    @echo off
    chcp 65001 > nul
    setlocal enabledelayedexpansion
    
    rem 设置 ffmpeg 路径、需要压缩的文件目录,输出文件目录
    set "ffmpeg_path=D:\soft\ffmpeg\bin\ffmpeg.exe"
    set "input_dir=E:\test3"
    set "output_root_dir=E:\Compress"
    
    for /r "%input_dir%" %%F in (*.mp4) do (
        set "input_file=%%F"
        echo 待压缩文件: !input_file!
        call set "output_file=!input_file:%input_dir%=%output_root_dir%!"
        rem echo 压缩后文件: !output_file!
        for %%I in ("!output_file!") do set "output_dir=%%~dpI"
        rem echo 输出目录: !output_dir!
        mkdir "!output_dir!" 2>nul
    
        rem 检查输入文件是否存在
        if exist "!output_file!" (
            rem 调用函数比较输入文件和输出文件的时长
        echo 输出文件已存在: !output_file!
        call :compare_durations "!input_file!" "!output_file!"
        )else (
        call :compress_file "!input_file!" "!output_file!"
        )
    
        echo "================================分隔符================================"
    )
    
    echo 脚本执行完成!!!!!按任意键退出.
    pause
    
    rem  方法===比较视频时长
    :compare_durations
    set "input_file=%~1"
    set "output_file=%~2"
    
    rem 获取输入文件、输出文件的时长
    for /F "delims=" %%A in ('%ffmpeg_path% -i "!input_file!" 2^>^&1 ^| findstr /C:"Duration"') do (
        set "input_duration=%%A"
    )
    for /F "delims=" %%B in ('%ffmpeg_path% -i "!output_file!" 2^>^&1 ^| findstr /C:"Duration"') do (
        set "output_duration=%%B"
    )
    
    for /F "tokens=2 delims= " %%C in ("!input_duration!") do (
        set "input_duration=%%C" 
    )
    for /F "tokens=2 delims= " %%D in ("!output_duration!") do (
        set "output_duration=%%D"
    )
    
    rem 忽略毫秒级别比较
    for /F "tokens=1 delims=." %%F in ("!input_duration!") do (
        set "input_duration=%%F"
    )
    for /F "tokens=1 delims=." %%G in ("!output_duration!") do (
        set "output_duration=%%G"
    )
    
    rem 比较输入文件和输出文件的时长
    rem echo "%input_file%"  时长 ==== "!input_duration!"
    rem echo "%output_file%" 时长 ==== "!output_duration!"
    if "!input_duration!" neq "!output_duration!" (
        echo 时长不一致,重新压缩文件...
        call :compress_file "!input_file!" "!output_file!"
    ) else (
        echo 时长一致,无需重新压缩文件.
    )
    
    goto :eof
    
    rem 方法===压缩文件
    :compress_file
    set "input_file=%~1"
    set "output_file=%~2"
    echo 正在压缩文件: !input_file! 请稍等...
    "%ffmpeg_path%" -loglevel quiet -i "!input_file!" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "!output_file!" -y -progress progress.txt 2>&1 | findstr "time=" > con
    echo 压缩完成,输出文件为: !output_file! 请稍等...
    call :compare_durations "!input_file!" "!output_file!"
    
    goto :eof

    执行效果:

    Windows 使用 ffmpeg 批量压缩视频文件

    />

    如图,已经压缩过的文件如果时长一致,则不进行再次压缩浪费时间;如果时长不一致,那么要进行压缩然后覆盖;如果没有压缩过的文件,直接进行压缩,压缩完再对比时长。

    提醒:本文发布于399天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Jenkins 微服务打包再优化


    共计 6977 个字符,预计需要花费 18 分钟才能阅读完成。

    之前也写过 jenkins 微服务打包的教程,可以打包单个模块,但是如果需要一次性打包全部就实现不了了,这次优化了一下脚本。

    如果有不了解的,可以先看看这两篇文章 Jenkins 打包微服务教程-一个配置文件即可打包所有模块Jenkins 打包微服务流程优化

    不过这次需要用到 Extended Choice Parameter 插件,因为需要在构建时传参,但是 jenkins 默认不支持传多选,需要通过这个插件。

    插件的使用也比较简单,在添加参数时选择 Extended Choice Parameter。

    Jenkins 微服务打包再优化

    />

    然后按如下图填写即可。

    Jenkins 微服务打包再优化

    />

    接下来就可以按住 ctrl 键配合鼠标进行多选了,也可以按住 shift 选择一个区间。

    接下来就是配置源码地址,maven 的打包可以不需要,如果实在需要可以设置命令为 mvn dependency:tree,因为接下来会在脚本进行打包。

    脚本如下,注意这里需要配置三个参数,分别是 all_module-候选打包模块,all_host-候选打包主机,branch-git分支,这个分支变量需要配置为 git 变量,其他两个使用上面的插件配置。

    #!/bin/bash
    
    # 0. 准备 1. 指定打包mvn路径 2. 获取打包的所有模块 3. 获取打包的所有主机
    maven_command="/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.6/apache-maven-3.6.1/bin/mvn"
    IFS=',' read -ra modules <<< "$all_module"
    IFS=',' read -ra hosts <<< "$all_host"
    
    echo "===============本次选择打包的模块 "$all_module"==============="
    # 1. 打包
    skip_tests="-Dmaven.test.skip=true"
    for module in "${modules[@]}"
    do
         echo "===============模块 "$module" 执行 mvn install==============="
         $maven_command clean install -pl ${module} -am $skip_tests
    done
    
    # 2. 构建镜像并保存
    for module in "${modules[@]}"
    do
        ## 构建镜像
        cd "${WORKSPACE}/${module}"
        serviceName="${module#*/}"
        current=$(date -d "8 hours" +"%Y%m%d-%H%M")
        branch_name=$(echo "${branch}" | sed 's/\//-/g')
        #imageName="${serviceName}-${branch_name}:${current}"
        imageName="${serviceName}:${branch_name}-${current}"
        tarName="${serviceName}-${current}.tar"
        jarFile=$(ls target/ | grep \.jar$)
        mv "target/${jarFile}" .
        docker build --build-arg JAR_FILE="${jarFile}" -t "${imageName}" .
    
        ## 保存镜像-保存在 jenkins 主目录下的 images 文件夹
        imagesDir="${JENKINS_HOME}/images/$JOB_NAME/${serviceName}"
        mkdir -p "${imagesDir}"
        docker save -o "${imagesDir}/${tarName}" "${imageName}"
        cp "${imagesDir}/${tarName}" target/
    
        ## 清理镜像
        docker rmi -f $(docker images | grep "${serviceName}" | awk 'NR>0 {print $3}')
        ## tar包保留指定数量
        cd "${imagesDir}"
        retainNumber=3
        rm -f $(ls -t | awk "NR>${retainNumber}")
    done
    
    # 3. 部署
    # 准备工作 -> 1. 定义主机 2.获取工作目录 3. 连接新主机不询问是否添加到known_hosts
    cd ${WORKSPACE}
    cat > hosts.txt <<EOF
    172.26.1.21 root xxx dev_test "-e ACTIVE=pro -e NACOS_URL=172.26.1.21"
    EOF
    grep -q 'StrictHostKeyChecking no' /etc/ssh/ssh_config || echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
    
    #==========定义远程执行脚本文件开始==========
    cd ${WORKSPACE}
    cat << 'EOF' > script.sh
    #!/bin/bash
    cd /tmp/robot-patrol-platform
    tarName=$(ls *.tar -1t | head -n 1)
    imageName=$(docker load -i ${tarName} |  cut -d' ' -f3)
    containerName=$(echo ${imageName} | cut -d: -f1)
    # 删除原来的容器,并新建一个容器
    if docker ps -a| grep "${containerName}" >/dev/null 2>&1; then docker rm -f ${containerName} ; fi
    docker run -d --net host $1 --restart=unless-stopped --name ${containerName} ${imageName}
    # 删除无用的镜像,只保留最新的镜像
    serviceName=${containerName}
    if docker images | grep "${serviceName}" >/dev/null 2>&1; then docker rmi -f $(docker images | grep ${serviceName} |awk 'NR>1 {print $3}'); fi
    # 删除临时文件夹
    rm -rf /tmp/robot-patrol-platform/${tarName}
    rm -rf /tmp/robot-patrol-platform/script.sh
    echo "The script has been executed successfully."
    EOF
    #==========定义远程执行脚本文件结束==========
    
    #==========定义任务函数开始==========
    dotask () {
        echo "===============远程主机 "$ip" 开始执行任务==============="
        for module in "${modules[@]}"
        do 
          echo "===============远程主机 "$ip" 正在部署 "$module" ==============="
          ip=$1; username=$2; password=$3; environment=$4; param=$5
          sshpass -p $password ssh $username@$ip "mkdir -p /tmp/robot-patrol-platform"
          sshpass -p $password scp ${WORKSPACE}/${module}/target/*.tar $username@$ip:/tmp/robot-patrol-platform
          sshpass -p $password scp ${WORKSPACE}/script.sh $username@$ip:/tmp/robot-patrol-platform
          sshpass -p $password ssh $username@$ip "chmod +x /tmp/robot-patrol-platform/script.sh && /tmp/robot-patrol-platform/script.sh $param"
       done
       echo "===============远程主机 "$ip" 脚本执行完成==============="
    }
    #==========定义任务函数结束==========
    
    while read -r ip username password environment param; do
      for host in "${hosts[@]}"; do
        if [ "$host" = "$environment" ] || [ "$host" = "$ip" ]; then
          dotask "$ip" "$username" "$password" "$environment" "$param"
        fi
      done
    done < hosts.txt
    echo "===============所有任务已完成==============="

    当然,这样的方式有个弊端,就是 idea 插件并不支持多选参数,

    还有一种方式,需要配置 single_module、host 都为单选,并且提供 all 这个选项,意思是打包全部模块或发送到全部主机。然后配置一个 all_module 字符变量,这个变量是模块以逗号分隔,另外一个就是分支变量了。

    脚本如下:

    #!/bin/bash
    modules=${single_module}
    # 如果选择该项目,则全部进行打包
    maven_command="/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.6/apache-maven-3.6.1/bin/mvn"
    skip_tests="-Dmaven.test.skip=true"
    if [ ${single_module} == "all" ]; then
         IFS=',' read -ra modules <<< "$all_module"
         echo "===============全部模块执行 mvn install==============="
         $maven_command clean install $skip_tests
    else
         echo "===============${single_module}模块执行 mvn install==============="
         $maven_command clean install -pl ${single_module} -am $skip_tests
    fi
    for module in "${modules[@]}"
    do
        echo $module
        ## 构建镜像
        cd "${WORKSPACE}/${module}"
        serviceName="${module#*/}"
        current=$(date -d "8 hours" +"%Y%m%d-%H%M")
        branch_name=$(echo "${branch}" | sed 's/\//-/g')
        #imageName="${serviceName}-${branch_name}:${current}"
        imageName="${serviceName}:${branch_name}-${current}"
        tarName="${serviceName}-${current}.tar"
        jarFile=$(ls target/ | grep \.jar$)
        mv "target/${jarFile}" .
        docker build --build-arg JAR_FILE="${jarFile}" -t "${imageName}" .
    
        ## 保存镜像-保存在 jenkins 主目录下的 images 文件夹
        imagesDir="${JENKINS_HOME}/images/$JOB_NAME/${serviceName}"
        mkdir -p "${imagesDir}"
        docker save -o "${imagesDir}/${tarName}" "${imageName}"
        cp "${imagesDir}/${tarName}" target/
    
        ## 清理镜像
        docker rmi -f $(docker images | grep "${serviceName}" | awk 'NR>0 {print $3}')
        ## tar包保留指定数量
        cd "${imagesDir}"
        retainNumber=3
        rm -f $(ls -t | awk "NR>${retainNumber}")
    done
    
    # 准备工作 -> 1. 定义主机 2.获取工作目录 3. 连接新主机不询问是否添加到known_hosts
    cd ${WORKSPACE}
    cat > hosts.txt <<EOF
    172.26.1.21 root xxx dev_test "-e ACTIVE=pro -e NACOS_URL=172.26.1.21"
    EOF
    grep -q 'StrictHostKeyChecking no' /etc/ssh/ssh_config || echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
    
    #==========定义远程执行脚本文件开始==========
    cd ${WORKSPACE}
    cat << 'EOF' > script.sh
    #!/bin/bash
    cd /tmp/robot-patrol-platform
    tarName=$(ls *.tar -1t | head -n 1)
    imageName=$(docker load -i ${tarName} |  cut -d' ' -f3)
    containerName=$(echo ${imageName} | cut -d: -f1)
    # 删除原来的容器,并新建一个容器
    if docker ps -a| grep "${containerName}" >/dev/null 2>&1; then docker rm -f ${containerName} ; fi
    docker run -d --net host $1 --restart=unless-stopped --name ${containerName} ${imageName}
    # 删除无用的镜像,只保留最新的镜像
    serviceName=${containerName}
    if docker images | grep "${serviceName}" >/dev/null 2>&1; then docker rmi -f $(docker images | grep ${serviceName} |awk 'NR>1 {print $3}'); fi
    # 删除临时文件夹
    rm -rf /tmp/robot-patrol-platform/${tarName}
    rm -rf /tmp/robot-patrol-platform/script.sh
    echo "The script has been executed successfully."
    EOF
    #==========定义远程执行脚本文件结束==========
    
    #==========定义任务函数开始==========
    dotask () {
          echo "===============远程主机 "$ip" 开始执行任务==============="
        for module in "${modules[@]}"
        do 
          echo "===============远程主机 "$ip" 正在部署 "$module" ==============="
          ip=$1; username=$2; password=$3; environment=$4; param=$5
          sshpass -p $password ssh $username@$ip "mkdir -p /tmp/robot-patrol-platform"
          sshpass -p $password scp ${WORKSPACE}/${module}/target/*.tar $username@$ip:/tmp/robot-patrol-platform
          sshpass -p $password scp ${WORKSPACE}/script.sh $username@$ip:/tmp/robot-patrol-platform
          sshpass -p $password ssh $username@$ip "chmod +x /tmp/robot-patrol-platform/script.sh && /tmp/robot-patrol-platform/script.sh $param"
       done
       echo "===============远程主机 "$ip" 脚本执行完成==============="
    }
    #==========定义任务函数结束==========
    
    while read -r ip username password environment param; do
      if [ "$host" = "all" ]; then
        dotask $ip $username $password $environment "$param"
      elif [ "$host" = "$environment" ]; then
        dotask $ip $username $password $environment "$param"
      fi
    done < hosts.txt
    echo "===============所有任务已完成==============="

    提醒:本文发布于399天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室