开源一套原创文本处理工具:Java+Bat脚本实现自动批量处理对账单工具

原创/朱季谦

这款工具是笔者在2018年初开发完成的,时隔两载,偶然想起这款小工具,于是,决定将其开源,若有人需要做类似Java批处理实现整理文档的工具,可参考该工具逻辑思路来实现。

该工具是运行在windos系统上的,基于bat脚本与jar包形式协同运行。当时开发该工具的背景是,需要每天定时处理大批量的对账单txt文本信息,将其统一整合到一张Excel文档上,供会计人员获取。在没有该工具之前,项目组上的会计人员,需要每天手动打开大量txt文本,并从每份txt文档里,复制所需信息,然后将获取到的信息再复制到一份当日的Excel文档里。这个过程根据对账单数量而定,若数量过多,手动整理就需花费大量时间,且过程重复操作。基于这个原因,当时就开发了这款小工具,供会计人员使用,其带来的效果是,节省了大量整理时间:会计人员只需把每天邮件收到的批量对账单txt文件,统一放到指定目录下,点击start启动脚本,就可一键自动批量处理完成。

这个工具在当时的工作环境下,是行之有效的,但若换到另一种领域或者环境,还需二次开发做修改。工具整体实现的逻辑并不复杂,笔者只提供一种解决文档重复整理工作的小思路,仅做参考学习之用,毕竟,解决问题的本质不在于工具,而在于思路。

下面,就围绕着业务与具体实现来结束该自动处理工具。

整体结构如下:

image

1.对账单:将同类型对账单批量放入到对账单文件夹中,同类,即格式几乎一样,但数据不一样,如下所示:

image

2.对账单集处理结果:批量处理获取到的数据,会统一写入到一份自动生成的Excel文档里,该文档存放在“对账单集处理结果”目录底下;

3.Auto.jar:由Java语言开发的jar包,通过循环读取各txt文本数据,从读取文本指定字段数据,截取其名字与对应保证金、可用资金,再写入到自动生成的Excel文档里。

4.CopyName.bat:bat脚本,将本目录下的txt文件名批量写入到“对账单批量名字集合.txt”;

CopyName.bat如下:

1 @dir /a-d /b *.txt>对账单批量名字集合.txt

5.Start.bat:bat脚本,主要实现是,将CopyName.bat和“对账单批量名字集合.txt”都复制到“对账单”目录,然后执行CopyName.bat,将该目录底下的所有.txt后缀的文件名,写入到“对账单批量名字集合.txt”,再启动Auto.jar包,该jar会去“对账单批量名字集合.txt”获取所在目录下各txt文档名字,再根据这些名字去读取对应的txt文档。

Start.bat主要代码如下:

1 @echo off
2 copy /y CopyName.bat 对账单
3 copy /y 对账单批量名字集合.txt 对账单
4 cd D:\批量处理对账单\对账单
5 call CopyName.bat
6 java -jar D:\批量处理对账单\Auto.jar

综上,业务人员只需把对账单统一放入到“对账单”目录下:

image

点击Start.bat启动,就可得到以下指定数据的统一获取:

image

接下来,就具体分享一下Java部分的逻辑实现:

代码结构

image

以maven进行jar依赖,主要有Datas、ExportExcelBase、ExportExcleClient、PutExcel四个类。

1.引入依赖

 1 <dependencies>2      <dependency>3          <groupId>org.apache.poi</groupId>4          <artifactId>poi</artifactId>5          <version>3.10-FINAL</version>6      </dependency>7      <dependency>8          <groupId>org.projectlombok</groupId>9          <artifactId>lombok</artifactId>
10          <version>1.18.2</version>
11      </dependency>
12 </dependencies>

2.设置导出基本类,根据需生成的Excel展示数据设置,笔者案例里只需展示“组合名”,“保证金占用金额”,“可用资金额”三个字段,故只需设置name,margin,avaFunds来接受获取到的值;

 1 package com.put.data;2 import lombok.Data;3 ​4 /**5  * 导出数据类6  * @author zhujiqian7  * @date 2020/10/27 20:098  */9 @Data
10 public class Datas {
11     //名字
12     private String name;
13     //保证金
14     private String margin;
15     //可用资金
16     private String avaFunds;
17     
18     public Datas(String name, String margin, String avaFunds) {
19         this.name = name;
20         this.margin = margin;
21         this.avaFunds = avaFunds;
22    }
23 ​
24 }

3.设置Excel表格生成类

  1 package com.put.put;2 ​3 import org.apache.poi.hssf.usermodel.*;4 import org.apache.poi.hssf.util.Region;5 ​6 import java.io.File;7 import java.io.FileNotFoundException;8 import java.io.FileOutputStream;9 import java.io.IOException;10 ​11 /**12  * HSSF - 提供读写Microsoft Excel格式档案的功能。13  *14  * XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。15  *16  * @author zhujiqian17  * @date 2020/10/27 20:3318  */19 public class ExportExcelBase {20     private HSSFWorkbook hwb=null;21     private HSSFSheet sheet=null;22     public ExportExcelBase(HSSFWorkbook hwb,HSSFSheet sheet){23         this.hwb=hwb;24         this.sheet=sheet;25    }26     public HSSFWorkbook getHwb() {27         return hwb;28    }29     public void setHwb(HSSFWorkbook hwb) {30         this.hwb = hwb;31    }32     public HSSFSheet getSheet() {33         return sheet;34    }35     public void setSheet(HSSFSheet sheet) {36         this.sheet = sheet;37    }38 ​39     /**40      * 创建设置表格头41      */42     public void createNormalHead(String headString,int colSum){43         //创建表格标题行,第一行44         HSSFRow row=this.sheet.createRow(0);45         //创建指定行的列,第一列46         HSSFCell cell=row.createCell(0);47         //设置标题行默认行高48         row.setHeight((short) 500);49         //设置表格内容类型:0-数值型;1-字符串;2-公式型;3-空值;4-布尔型;5-错误50         cell.setCellType(1);51         //设置表格标题内容52         cell.setCellValue(new HSSFRichTextString(headString));53         // 指定合并区域54         this.sheet.addMergedRegion(new Region(0, (short)0, 0, (short)colSum));55         // 定义单元格格式,添加单元格表样式,并添加到工作簿56         HSSFCellStyle cellStyle=this.hwb.createCellStyle();57         // 设置单元格水平对齐居中类型58         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);59         // 指定单元格垂直居中对齐60         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);61         // 指定单元格自动换行62         cellStyle.setWrapText(true);63         //设置字体64         HSSFFont font=this.hwb.createFont();65         font.setBoldweight((short) 700);66         font.setFontName("宋体");67         font.setFontHeight((short) 300);68         cellStyle.setFont(font);69         cell.setCellStyle(cellStyle);70    }71 ​72     /**73      *表单第二行74      * @param params75      * @param colSum76      */77     public void createNormalTwoRow(String[] params,int colSum){78         HSSFRow row1=this.sheet.createRow(1);79         row1.setHeight((short) 300);80         HSSFCell cell2=row1.createCell(0);81         cell2.setCellType(1);82         cell2.setCellValue(new HSSFRichTextString("统计时间"+params[0]+"至"+params[1]));83         this.sheet.addMergedRegion(new Region(1, (short) 0,1,(short)colSum));84         HSSFCellStyle cellStyle=this.hwb.createCellStyle();85         cellStyle.setAlignment((short) 2);86         cellStyle.setVerticalAlignment((short) 1);87         cellStyle.setWrapText(true);88         HSSFFont font=this.hwb.createFont();89         font.setBoldweight((short) 700);90         font.setFontName("宋体");91         font.setFontHeight((short) 250);92         cellStyle.setFont(font);93         cell2.setCellStyle(cellStyle);94    }95 ​96 ​97     /**98      * 表单内容99      * @param wb
100      * @param row
101      * @param col
102      * @param align
103      * @param val
104      */
105     public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align, String val) {
106         HSSFCell cell = row.createCell(col);
107         cell.setCellType(1);
108         cell.setCellValue(new HSSFRichTextString(val));
109         HSSFCellStyle cellstyle = wb.createCellStyle();
110         cellstyle.setAlignment(align);
111         cell.setCellStyle(cellstyle);
112    }
113 ​
114 ​
115     /**
116      * 文档输出流
117      * @param fileName
118      */
119     public void outputExcle(String fileName) {
120         FileOutputStream fos = null;
121         try {
122             fos = new FileOutputStream(new File(fileName));
123             this.hwb.write(fos);
124             fos.close();
125        } catch (FileNotFoundException var4) {
126             var4.printStackTrace();
127        } catch (IOException var5) {
128             var5.printStackTrace();
129        }
130    }
131 }

4.设置Excel根据数据导出类

1 package com.put.put;2 ​3 ​4 import com.put.data.Datas;5 import org.apache.poi.hssf.usermodel.*;6 ​7 import java.text.SimpleDateFormat;8 import java.util.Date;9 import java.util.List;
10 ​
11 /**
12  * TODO
13  *
14  * @author zhujiqian
15  * @date 2020/10/27 20:24
16  */
17 public class ExportExcleClient {
18     private HSSFWorkbook hwb=null;
19     private HSSFSheet sheet=null;
20 ​
21     ExportExcelBase exportExcel = null;
22     SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
23 ​
24     public ExportExcleClient() {
25         this.hwb = new HSSFWorkbook();
26         this.exportExcel = new ExportExcelBase(this.hwb, this.sheet);
27    }
28 ​
29     /**
30      * 导出Excel
31      * @return
32      */
33     public String exportExcel() {
34         String a = this.df.format(new Date()) + "对账单集合.xls";
35         String b = "D:\\批量处理对账单\\对账单集处理结果\\" + a;
36         this.exportExcel.outputExcle(b);
37         return b;
38    }
39 ​
40     /**
41      * 设置导出格式
42      * @param data
43      * @return
44      */
45     public String alldata(List<Datas> data) {
46         if (data.size() != 0) {
47             this.sheet = this.exportExcel.getHwb().createSheet("对账单集合");
48             this.exportExcel.setSheet(this.sheet);
49             int number = 2;
50 ​
51             for(int i = 0; i < number; ++i) {
52                 this.sheet.setColumnWidth(i, 8000);
53            }
54 ​
55             HSSFCellStyle cellStyle = this.hwb.createCellStyle();
56             cellStyle.setAlignment((short)2);
57             cellStyle.setVerticalAlignment((short)1);
58             cellStyle.setWrapText(true);
59             HSSFFont font = this.hwb.createFont();
60             font.setBoldweight((short)700);
61             font.setFontName("宋体");
62             font.setFontHeight((short)200);
63             cellStyle.setFont(font);
64             this.exportExcel.createNormalHead("对账单整合表", number);
65             String[] params = new String[]{this.df.format(new Date()), this.df.format(new Date())};
66             this.exportExcel.createNormalTwoRow(params, number);
67             HSSFRow row2 = this.sheet.createRow(2);
68             HSSFCell cell0 = row2.createCell(0);
69             cell0.setCellStyle(cellStyle);
70             cell0.setCellValue(new HSSFRichTextString("组合名"));
71             HSSFCell cell1 = row2.createCell(1);
72             cell1.setCellStyle(cellStyle);
73             cell1.setCellValue(new HSSFRichTextString("保证金占用金额"));
74             HSSFCell cell2 = row2.createCell(2);
75             cell2.setCellStyle(cellStyle);
76             cell2.setCellValue(new HSSFRichTextString("可用资金额"));
77 ​
78             for(int i = 0; i < data.size(); ++i) {
79                 System.out.println("==============" + ((Datas)data.get(i)).getName() + " " + ((Datas)data.get(i)).getMargin() + " " + ((Datas)data.get(i)).getAvaFunds());
80                 HSSFRow row = this.sheet.createRow((short)i + 3);
81                 this.exportExcel.cteateCell(this.hwb, row, 0, (short)6, ((Datas)data.get(i)).getName());
82                 this.exportExcel.cteateCell(this.hwb, row, 1, (short)6, ((Datas)data.get(i)).getMargin());
83                 this.exportExcel.cteateCell(this.hwb, row, 2, (short)6, ((Datas)data.get(i)).getAvaFunds());
84            }
85        }
86 ​
87         return "";
88    }
89 }

5.批量读取txt文本截取指定数据类

  1 package com.put;2 ​3 import com.put.data.Datas;4 import com.put.put.ExportExcleClient;5 import java.io.*;6 import java.util.ArrayList;7 import java.util.List;8 ​9 /**10  * TODO11  *12  * @author zhujiqian13  * @date 2020/10/27 20:0814  */15 public class PutExcel {16     public PutExcel() {17    }18     public static List<String> readTxtFile1(String TxtName, String filePath) {19         ArrayList list = new ArrayList();20         try {21             System.out.println("该组合:" + TxtName);22             File file = new File(filePath);23             if (file.isFile() && file.exists()) {24                 InputStreamReader read = new InputStreamReader(new FileInputStream(file), "GBK");25                 BufferedReader bufferedReader = new BufferedReader(read);26                 String lineTxt = null;27 ​28                 while(true) {29                     do {30                         if ((lineTxt = bufferedReader.readLine()) == null) {31                             read.close();32                             return list;33                        }34                    } while(!lineTxt.contains("持仓保证金:") && !lineTxt.contains("保证金占用:") && !lineTxt.contains("保证金占用 Margin Occupied:") && !lineTxt.contains("保证金占用 Margin Occupied:"));35                     String ZiJin;36                     int a;37                     String b;38                     int c;39                     String d;40                     int e;41                     int f;42                     String E;43                     if (lineTxt.contains("持仓保证金:")) {44                         ZiJin = lineTxt.replace(" ", "");45                         a = ZiJin.indexOf("持");46                         b = ZiJin.substring(a);47                         c = b.indexOf(".");48                         d = b.substring(0, c + 3);49                         e = d.indexOf(":");50                         f = d.length();51                         E = d.substring(e + 1, f);52                         list.add(E);53                    } else if (lineTxt.contains("保证金占用:")) {54                         ZiJin = lineTxt.replace(" ", "");55                         a = ZiJin.indexOf("保");56                         b = ZiJin.substring(a);57                         c = b.indexOf(".");58                         d = b.substring(0, c + 3);59                         e = d.indexOf(":");60                         f = d.length();61                         E = d.substring(e + 1, f);62                         list.add(E);63                    } else if (lineTxt.contains("保证金占用 Margin Occupied:")) {64                         ZiJin = lineTxt.replace(" ", "");65                         a = ZiJin.indexOf("保");66                         b = ZiJin.substring(a);67                         c = b.indexOf(".");68                         d = b.substring(0, c + 3);69                         e = d.indexOf(":");70                         f = d.length();71                         E = d.substring(e + 1, f);72                         list.add(E);73                    } else if (lineTxt.contains("保证金占用 Margin Occupied:")) {74                         ZiJin = lineTxt.replace(" ", "");75                         a = ZiJin.indexOf("保");76                         b = ZiJin.substring(a);77                         c = b.indexOf(".");78                         d = b.substring(0, c + 3);79                         e = d.indexOf(":");80                         f = d.length();81                         E = d.substring(e + 1, f);82                         list.add(E);83                    }84                }85            } else {86                 System.out.println("找不到指定的文件");87            }88        } catch (Exception var16) {89             System.out.println("读取文件内容出错");90             var16.printStackTrace();91        }92         return list;93    }94     public static List<String> readTxtFile2(String TxtName, String filePath) {95         ArrayList list = new ArrayList();96 ​97         try {98 ​99             System.out.println("该组合:" + TxtName);
100             File file = new File(filePath);
101             if (file.isFile() && file.exists()) {
102                 InputStreamReader read = new InputStreamReader(new FileInputStream(file), "GBK");
103                 BufferedReader bufferedReader = new BufferedReader(read);
104                 String lineTxt = null;
105 ​
106                 while(true) {
107                     do {
108                         if ((lineTxt = bufferedReader.readLine()) == null) {
109                             read.close();
110                             return list;
111                        }
112                    } while(!lineTxt.contains("可用资金:") && !lineTxt.contains("可用资金 Fund Avail.:") && !lineTxt.contains("可用资金 Fund Avail.:"));
113                     String ZiJin;
114                     int a;
115                     String b;
116                     int c;
117                     String d;
118                     int e;
119                     int f;
120                     String E;
121                     if (lineTxt.contains("可用资金:")) {
122                         ZiJin = lineTxt.replace(" ", "");
123                         ZiJin = lineTxt.replace(" ", "");
124                         a = ZiJin.indexOf("可");
125                         b = ZiJin.substring(a);
126                         c = b.indexOf(".");
127                         d = b.substring(0, c + 3);
128                         e = d.indexOf(":");
129                         f = d.length();
130                         E = d.substring(e + 1, f);
131                         list.add(E);
132                    } else if (lineTxt.contains("可用资金 Fund Avail.:")) {
133                         ZiJin = lineTxt.replace(" ", "");
134                         ZiJin = lineTxt.replace(" ", "");
135                         a = ZiJin.indexOf("可");
136                         b = ZiJin.substring(a);
137                         c = b.lastIndexOf(".");
138                         d = b.substring(0, c + 3);
139                         e = d.indexOf(":");
140                         f = d.length();
141                         E = d.substring(e + 1, f);
142                         list.add(E);
143                    } else if (lineTxt.contains("可用资金 Fund Avail.:")) {
144                         lineTxt.replace(" ", "");
145                         ZiJin = lineTxt.replace(" ", "");
146                         a = ZiJin.indexOf("可");
147                         b = ZiJin.substring(a);
148                         c = b.lastIndexOf(".");
149                         d = b.substring(0, c + 3);
150                         e = d.indexOf(":");
151                         f = d.length();
152                         E = d.substring(e + 1, f);
153                         list.add(E);
154                    }
155                }
156            } else {
157                 System.out.println("找不到指定的文件");
158            }
159        } catch (Exception var16) {
160             System.out.println("读取文件内容出错");
161             var16.printStackTrace();
162        }
163 ​
164         return list;
165    }
166 ​
167     public static void main(String[] argv) {
168         String path = "D:\\批量处理对账单\\对账单\\对账单批量名字集合.txt";
169         List<String> nums = writeToDat(path);
170         List<Datas> listData = new ArrayList();
171         for(int i = 0; i < nums.size(); ++i) {
172             if (!(nums.get(i)).equals("对账单批量名字集合.txt")) {
173                 listData.add(ZuHe(nums.get(i)));
174                 System.out.println("--------==========" + ZuHe(nums.get(i)));
175            }
176        }
177 ​
178         System.out.println("-----------" + listData);
179         ExportExcleClient client = new ExportExcleClient();
180         client.alldata(listData);
181         String url = client.exportExcel();
182         System.out.println(url);
183    }
184 ​
185     public static Datas ZuHe(String TxtName) {
186         String address = "D:\\批量处理对账单\\对账单\\" + TxtName;
187         List<String> r1 = readTxtFile1(TxtName, address);
188         List<String> r2 = readTxtFile2(TxtName, address);
189         int c = TxtName.indexOf(".");
190         String txt = TxtName.substring(0, c);
191         System.out.println(txt);
192         System.out.println(r1);
193         Datas d = null;
194         if (r1.isEmpty() && r2.isEmpty()) {
195             if (r1.isEmpty() && r2.isEmpty()) {
196                 System.out.println(txt + "--" + r1 + "---" + r2);
197                 d = new Datas(txt, "无", "无");
198            }
199        } else {
200             d = new Datas(txt, r1.get(0), r2.get(0));
201        }
202         return d;
203    }
204     public static List<String> writeToDat(String path) {
205         File file = new File(path);
206         ArrayList list = new ArrayList();
207         try {
208             String encoding = "GBK";
209             InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
210             BufferedReader bw = new BufferedReader(read);
211             String line = null;
212 ​
213             while((line = bw.readLine()) != null) {
214                 list.add(line);
215            }
216             bw.close();
217        } catch (IOException var7) {
218             var7.printStackTrace();
219        }
220         return list;
221    }
222 }

以上的代码,大部分都是在2018年左右写成,现再阅读,代码风格甚为稚嫩。我没有做大的修改,原因是,想要留住这些代码最初的样子,就像留住刚毕业那会的记忆一般。整体实现逻辑并不算复杂,但再简单的东西,能解决问题,都是值得分享的东西。在此基础上,还可继续完善与扩展,给需要用到的业务人员带来方便。

这是我开源的第一个小工具,以此为励,在以后的日子里,要更加深入地学习,并将所学与所得,多多分享。在我看来,输入的东西,不一定是自己的,但输出的,一定是自己的。

这,就是我喜欢输出的原因之一。

最后,附上第一个github源码链接:https://github.com/z924931408/auto-put-tool

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vercel部署Gemini pro

一、注册一个vercel账号&#xff08;这个东西类似于第三方的github pages&#xff0c;能部署github中的项目&#xff09; 二、注册结束后&#xff0c;填写github的账号&#xff08;需要事先在该github账号中fork一个gemini的repository&#xff09; 三、babaohuang/GeminiPro…

ssm基于vue框架和elementui组件的手机官网论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本手机官网就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#x…

用C语言采集游戏平台数据并做行业分析

游戏一直深受90/00后的喜爱&#xff0c;有些人因为对游戏的热爱还专门成立了工作室做游戏赚钱&#xff0c;但是游戏行业赚钱走不好就会被割一波韭菜&#xff0c;那么现在什么游戏挣钱&#xff0c;什么游戏好玩认可度高&#xff1f;带着这样的问题我将利用我毕生所学&#xff0c…

【React系列】Redux(一)管理状态

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 在React的开发过程中&#xff0c;Redux对于我们是非常重要的。 但是对于很多人来说&#xff0c;初次接触redux会感觉r…

2024年HCIE认证有什么用?华为HCIE好考吗?

随着信息技术的迅速发展&#xff0c;网络工程师的需求越来越高&#xff0c;而HCIE作为华为认证体系中的最高级别认证&#xff0c;备受从业者关注。本文将深入研究2024年HCIE认证的价值、考试难度以及报名费用等方面的信息。 2024年HCIE认证有什么用? 新的一年即将到来&#x…

jmeter关联依赖---三种

1.正则表达式提取器 2.xpath取样器 3.json提取器

听GPT 讲Rust源代码--compiler(11)

File: rust/compiler/rustc_mir_transform/src/simplify.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_mir_transform/src/simplify.rs文件是Rust编译器中一系列进行MIR&#xff08;中间表示&#xff09;简化的转换的实现。MIR是Rust编译器中用于进行优化和代码生成的中间…

QT_02 窗口属性、信号槽机制

QT - 窗口属性、信号槽机制 1. 设置窗口属性 窗口设置 1,标题 2,大小 3,固定大小 4,设置图标在 widget.cpp 文件中&#xff1a; //设置窗口大小,此时窗口是可以拉大拉小的 //1参:宽度 //2参:高度 this->resize(800, 600); //设置窗口标题 this->setWindowTitle("…

2023 IoTDB Summit:清华大学软件学院长聘副教授龙明盛《IoTDB 新组件:内生机器学习》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

安全狗入选“2023年福建省信息技术应用创新解决方案”名单

近日&#xff0c;福建省数字福建建设领导小组办公室公布了2023年福建省信息技术应用创新解决方案入选项目名单。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借综合且具备突出创新水平的方案入选。 据悉&#xff0c;此次方案征集面向全省信创企业和用户单位&#xff0c;…

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…

勒索事件急剧增长,亚信安全发布《勒索家族和勒索事件监控报告》

近期(12.15-12.21)态势快速感知 近期全球共发生了247起攻击和勒索事件&#xff0c;勒索事件数量急剧增长。 近期需要重点关注的除了仍然流行的勒索家族lockbit3以外&#xff0c;还有本周top1勒索组织toufan。toufan是一个新兴勒索组织&#xff0c;本周共发起了108起勒索攻击&a…

电脑视频需要分屏怎么做

在当今数字时代&#xff0c;人们对于视频的需求越来越高。有时候&#xff0c;我们可能想在同一屏幕上同时播放多个视频&#xff0c;进行对比、观看、剪辑或者其他目的。那么&#xff0c;视频分屏应该怎么做呢&#xff1f; 在本篇文章中&#xff0c;我们将会详细的为你介绍视频分…

JS中模块的导入导出

背景 学习js过程中&#xff0c;发现导入导出有的是使用的export 导出&#xff0c;import导入&#xff0c;有的是使用exports或module.exports导出&#xff0c;使用require导入&#xff0c;不清楚使用场景和规则&#xff0c;比较混乱。 经过了解发现&#xff0c;NodeJS 中&…

JAVA基础学习笔记-day13-数据结构与集合源1

JAVA基础学习笔记-day13-数据结构与集合源1 1. 数据结构剖析1.1 研究对象一&#xff1a;数据间逻辑关系1.2 研究对象二&#xff1a;数据的存储结构&#xff08;或物理结构&#xff09;1.3 研究对象三&#xff1a;运算结构1.4 小结 2. 一维数组2.1 数组的特点 3. 链表3.1 链表的…

CSS免费在线字体格式转换器 CSS @font-face 生成器

今天竟意外发现的一款免费的“网页字体生成器”&#xff0c;功能强大又好用~ 工具地址&#xff1a;https://transfonter.org/ 根据你设置生成后的文件预览&#xff1a; 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成&#xff0c;每个文件最大15MB。转换完成以后还会生成一…

Spring Security 6.x 系列(14)—— 会话管理之源码分析

一、前言 在上篇 Spring Security 6.x 系列(13)—— 会话管理之会话概念及常用配置 Spring Security 6.x 系列(14)—— 会话管理之会话固定攻击防护及Session共享 中了清晰了协议和会话的概念、对 Spring Security 中的常用会话配置进行了说明,并了解会话固定攻击防护…

代表团坐车 - 华为OD统一考试

OD统一考试(B卷) 分值: 100分 题解: Java / Python / C++ 题目描述 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案输出方案数量。 约束: 一个团只能上一辆车,并且代表团…

广播及代码实现

广播&#xff08;Broadcast&#xff09;是一种网络通信方式&#xff0c;它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息&#xff0c;让所有设备都能接收并处理。在广播中&#xff0c;通信的目标是整个网络而不是特定的单个设备。 向子网中…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…