string types

delphi2007

1、有3种类型的字符串

    ShortString:255个字符

    AnsiString:表示8位的ansi,DBCS ANSI,MBCS ANSI等。也称为长字符串。

    WideString:表示Unicode;可用于多用户服务、多种语言应用程序。

这三种字符串可以在赋值和表达式等各种操作中混用,也就是说编译器会自动进行这三种之间的类型转换。

Win32平台系统默认为AnsiString。

2、AnsiString

    该类型的变量是一个4字节指针,指向包含字符串内容的在堆上动态分配的内存块。该内存块的前8个字节中,前2个字节记录字符串长度,后2个字节记录引用数量。生存期自管理。

  copy-on-write:当且仅当字符串的引用计数大于1时,如果字符串中任意字符发生变化,那么就产生一个新的字符的副本。

  Char、PChar,AnsiChar,PAnsiChar,AnsiString这几个类型实现对单字节或多字节字符的支持。

  注意:通过S[i]这种方式来访问第i个字符是不靠谱的,应使用相应的方法,大多以Ansi开头的。

 3、WideString

    表示unicode格式的字符串。WideChar,PWideChar,WideString。

    WideString不是引用计数的,但生命周期是自管理的!

4、null结尾的字符串

  用指针方式声明的字符串,都以null(#0)为结束字符。可以通过强转为string,实现字符串常见操作,如2个字符串的连接等。

5、Null-terminated string functions  

Function  
Description  
StrAlloc  
Allocates a character buffer of a given size on the heap.  
StrBufSize  
Returns the size of a character buffer allocated using StrAlloc or StrNew.  
StrCat  
Concatenates two strings.  
StrComp  
Compares two strings.  
StrCopy  
Copies a string.  
StrDispose  
Disposes a character buffer allocated using StrAlloc or StrNew.  
StrECopy  
Copies a string and returns a pointer to the end of the string.  
StrEnd  
Returns a pointer to the end of a string.  
StrFmt  
Formats one or more values into a string.  
StrIComp  
Compares two strings without case sensitivity.  
StrLCat  
Concatenates two strings with a given maximum length of the resulting string.  
StrLComp  
Compares two strings for a given maximum length.  
StrLCopy  
Copies a string up to a given maximum length.  
StrLen  
Returns the length of a string.  
StrLFmt  
Formats one or more values into a string with a given maximum length.  
StrLIComp  
Compares two strings for a given maximum length without case sensitivity.  
StrLower  
Converts a string to lowercase.  
StrMove  
Moves a block of characters from one string to another.  
StrNew  
Allocates a string on the heap.  
StrPCopy  
Copies a Pascal string to a null-terminated string.  
StrPLCopy  
Copies a Pascal string to a null-terminated string with a given maximum length.  
StrPos  
Returns a pointer to the first occurrence of a given substring within a string.  
StrRScan  
Returns a pointer to the last occurrence of a given character within a string.  
StrScan  
Returns a pointer to the first occurrence of a given character within a string.  
StrUpper  
Converts a string to uppercase.  

这些标准函数都可以处理多字节格式的字符串,同Ansi-函数。

这段代码是一个 Spring MVC 控制器方法,用于处理 `/export/issue` 的 HTTP 请求,实现的功能是导出问题数据(exportIssue),并支持异步执行下载任务。下面我将详细解释代码逻辑,并提供优化建议和相关问题。 --- ### ✅ **功能说明** 这个方法实现了以下功能: 1. 从请求头中解析 JWT 信息,获取当前用户信息。 2. 检查用户是否频繁导出,限制导出频率(通过 Redis)。 3. 记录下载日志。 4. 根据传入的 `downloadType` 创建多个下载任务。 5. 使用新线程异步执行这些下载任务,避免阻塞主线程。 6. 返回响应结果。 --- ### ✅ **代码解释** ```java @RequestMapping("/export/issue") @ResponseBody public ObjectRestResponse exportIssue(@RequestBody JSONObject jsonObject, HttpServletRequest request){ ``` - `@RequestMapping`:处理 `/export/issue` 的请求。 - `@ResponseBody`:返回值直接写入 HTTP 响应体中。 - `@RequestBody JSONObject`:接收前端传来的 JSON 数据。 - `HttpServletRequest`:用于获取请求头中的 JWT 信息。 --- ```java IJWTInfo ijwtInfo = infoFromTokenBiz.getUserinFormation(request); String userId = ijwtInfo.getWorkerUserId(); ``` - 从请求中解析出 JWT 用户信息。 - 获取用户 ID。 --- ```java boolean isReturn = incidentApiBiz.ifRedisExport(userId, true); if (!isReturn) { return new ObjectRestResponse().rel(false).data("Current user downloads frequently, please try again later !"); } ``` - 使用 Redis 检查用户是否在短时间内频繁导出数据。 - 如果是,返回提示信息并拒绝请求。 --- ```java tsSystemLogService.createDownLoadLog(userId, AdminCommonConstant.ISSUE_MODEL_TYPE_DOWNLOAD, AdminCommonConstant.LOG_TO_DO_ISSUE, jsonObject.toJSONString()); ``` - 记录操作日志,用于审计或统计。 --- ```java List<TtDownloadTask> list = new ArrayList<>(); String types = jsonObject.getString("downloadType"); List<String> asList = Arrays.asList(types.split(",")); asList.forEach(type -> { list.add(ttDownloadTaskService.createDownloadTask(jsonObject, userId, ijwtInfo.getBizScope(), ijwtInfo.getdataDifference(),type)); }); ``` - 从请求中获取 `downloadType`,按逗号分割成多个类型。 - 遍历每个类型,创建下载任务。 --- ```java new Thread(new Runnable() { @Override public void run() { try { log.info("syncExportIssueTask start:{}", types); ttDownloadTaskService.downIssueTask(list); log.info("syncExportIssueTask end:{}", types); } catch (Exception e) { log.error("syncExportIssueTask error={}", e.getMessage(), e); } } }).start(); ``` - 新建线程异步执行下载任务,防止阻塞主线程。 - 调用 `ttDownloadTaskService.downIssueTask` 执行实际的导出逻辑。 --- ### ✅ **优化建议** 1. **使用线程池替代 new Thread()** 建议使用 `ExecutorService` 或 Spring 的 `@Async` 来管理线程,避免资源浪费和线程爆炸。 2. **异常处理增强** 当前对异常的处理较简单,可以增加重试机制或通知用户导出失败。 3. **返回任务ID** 可以返回一个任务ID,前端轮询查询导出状态或下载链接。 --- ### ✅ **优化后的代码示例(使用 @Async)** ```java @Autowired private AsyncDownloadService asyncDownloadService; @PostMapping("/export/issue") @ResponseBody public ObjectRestResponse exportIssue(@RequestBody JSONObject jsonObject, HttpServletRequest request) { IJWTInfo ijwtInfo = infoFromTokenBiz.getUserinFormation(request); String userId = ijwtInfo.getWorkerUserId(); boolean isReturn = incidentApiBiz.ifRedisExport(userId, true); if (!isReturn) { return new ObjectRestResponse().rel(false).data("下载频繁,请稍后再试!"); } tsSystemLogService.createDownLoadLog(userId, AdminCommonConstant.ISSUE_MODEL_TYPE_DOWNLOAD, AdminCommonConstant.LOG_TO_DO_ISSUE, jsonObject.toJSONString()); String types = jsonObject.getString("downloadType"); List<String> typeList = Arrays.asList(types.split(",")); List<TtDownloadTask> taskList = new ArrayList<>(); typeList.forEach(type -> { taskList.add(ttDownloadTaskService.createDownloadTask(jsonObject, userId, ijwtInfo.getBizScope(), ijwtInfo.getdataDifference(), type)); }); asyncDownloadService.asyncExport(taskList, types); return new ObjectRestResponse().rel(true).data("任务已提交"); } ``` ```java @Service public class AsyncDownloadService { private static final Logger log = LoggerFactory.getLogger(AsyncDownloadService.class); @Async public void asyncExport(List<TtDownloadTask> taskList, String types) { try { log.info("syncExportIssueTask start:{}", types); ttDownloadTaskService.downIssueTask(taskList); log.info("syncExportIssueTask end:{}", types); } catch (Exception e) { log.error("syncExportIssueTask error: {}", e.getMessage(), e); } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值