• 关于

    使用变量的注意事项

    的搜索结果

问题

Flink中的广播变量,使用广播变量需要注意什么事项?

Flink中的广播变量,使用广播变量需要注意什么事项?...
茶什i 2019-12-01 22:02:14 6 浏览量 回答数 1

问题

【精品问答】Python字符串面试知识点50问

Python字符串面试知识点总结 1.python中的下标索引怎么用 2.python中的切片操作 3.pythonfind()函数的使用 4.python中index()函数 5.python中replace怎么使用 6.python中s...
珍宝珠 2019-12-01 22:06:38 25 浏览量 回答数 0

回答

是否集成了第三方SDK,查看是否是其它SDk混淆导致的。 关于代码混淆注意事项 摘要:若使用studio新建项目,会自动生成混淆的相关文件,已经入过很多坑,有几点需注意。1.作为library的module,不可进行混淆,否则其他module无法引用,因为会找不到其中被混淆的类,可在主module中配置混淆.2.注意项目中的bean,尤其是实现Serializable接口的类,在用bundle传输时会出现的问题,必须keep其变量:keepclassmembersclass*implementsjava.io.Serializable{*;}3.一定要keep 若使用studio新建项目,会自动生成混淆的相关文件,已经入过很多坑,有几点需注意。 1.作为library的module,不可进行混淆,否则其他module无法引用,因为会找不到其中被混淆的类,可在主module中配置混淆. 2.注意项目中的bean,尤其是实现 Serializable接口的类,在用bundle传输时会出现的问题,必须keep其变量:keepclassmembers class * implements java.io.Serializable {*;} 3.一定要keep安卓的主要组件类名,如activity,service等等。 Keep public class * extends android.app.activity 4.一定keep第三方类库中的所有东东 Keep class com.baidu.**{*;} 5.注意keep Gson,json,R文件,接口,用到 js 调用时注意webview。 答案来源网络,供参考,希望帮助到您
问问小秘 2019-12-02 02:20:06 0 浏览量 回答数 0

阿里云域名特惠专场,热门域名1元抢购!

全网低价特惠,顶级域名低至1元,更有96元/年服务器限时抢购!

回答

是否集成了第三方SDK,查看是否是其它SDk混淆导致的。 关于代码混淆注意事项 摘要:若使用studio新建项目,会自动生成混淆的相关文件,已经入过很多坑,有几点需注意。1.作为library的module,不可进行混淆,否则其他module无法引用,因为会找不到其中被混淆的类,可在主module中配置混淆.2.注意项目中的bean,尤其是实现Serializable接口的类,在用bundle传输时会出现的问题,必须keep其变量:keepclassmembersclass*implementsjava.io.Serializable{*;}3.一定要keep 若使用studio新建项目,会自动生成混淆的相关文件,已经入过很多坑,有几点需注意。 1.作为library的module,不可进行混淆,否则其他module无法引用,因为会找不到其中被混淆的类,可在主module中配置混淆. 2.注意项目中的bean,尤其是实现 Serializable接口的类,在用bundle传输时会出现的问题,必须keep其变量:keepclassmembers class * implements java.io.Serializable {*;} 3.一定要keep安卓的主要组件类名,如activity,service等等。 Keep public class * extends android.app.activity 4.一定keep第三方类库中的所有东东 Keep class com.baidu.**{*;} 5.注意keep Gson,json,R文件,接口,用到 js 调用时注意webview。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!
牧明 2019-12-02 02:16:54 0 浏览量 回答数 0

问题

订阅日志服务数据前的环境准备工作

搭建指南 本文档为日志数据传送服务的搭建指南,介绍如何将日志服务中的日志数据转换为结构化数据,存储在表格存储中,以提供准确、高性能的日志实时检索服务。 更详细的信息介绍请参见 用户手册。 准备...
云栖大讲堂 2019-12-01 20:56:26 1193 浏览量 回答数 0

回答

解决 根据命名规则获取文件名/URL 登录 媒体处理控制台 > 媒体管理 > 媒体库设置 > 工作流,选择所需的工作流,并单击右侧的 查看。移动鼠标到转码/截图等模块,可以看到对应的输出bucket截输出路径,对应的输出文件名就是输出路径,其中自定义变量替换为具体的值即可。对应的URL为:Bucketname.Endpoint/输出路径.后缀。 2 注意: 输出Object中可以设置静态常量和变量,其中静态常量即直接编写,而动态变量需要通过大括号({})引用使用。输出 Object 中可选如下变量: {RunId}: 媒体工作流执行ID; {ObjectPrefix}: 不含Bucket信息的原文件路径; {FileName}: 不含扩展名的原文件名; {ExtName}: 原文件扩展名; Endpoint的意义,参见 Endpoint设置。 控制台获取文件名/URL 登录 媒体处理控制台 > 媒体库,选择所需的视频,并单击 管理 > 媒体地址获取 > TRANSCODE > 复制,即可获取。 2 程序获取文件名/URL 在工作流中配置消息服务的队列或者通知(参见获取工作流通知消息实例。)> 业务端消费对应的消息 > 当收到相应工作流实例“Report”消息,代表转码结束 > 根据输入Object的URL或者媒体ID(MediaId),调用媒体转码API接口。接口参见 查询媒体-使用OSS文件地址 和 查询媒体-使用媒体ID。 根据输入ObjectURL查询转码结果,Java代码示例: static QueryMediaListByURLResponse queryMediaListByURL(DefaultAcsClient client) { QueryMediaListByURLRequest request = new QueryMediaListByURLRequest(); request.setFileURLs(objecturl); request.setIncludePlayList(true); QueryMediaListByURLResponse response = null; try { response = client.getAcsResponse(request); } catch (ServerException e) { throw new RuntimeException("QueryMediaListByURLRequest Server failed"); } catch (ClientException e) { throw new RuntimeException("QueryMediaListByURLRequest Client failed"); } return response; } 根据输入媒体ID查询转码结果,Java代码示例: static QueryMediaListResponse QueryMediaList(DefaultAcsClient client) { QueryMediaListRequest request = new QueryMediaListRequest(); request.setMediaIds("媒体ID"); request.setIncludePlayList(true); QueryMediaListResponse response = null; try { response = client.getAcsResponse(request); } catch (ServerException e) { throw new RuntimeException("QueryMediaListRequest Server failed"); } catch (ClientException e) { throw new RuntimeException("QueryMediaListRequest Client failed"); } return response; } 执行工作流输出文件怎么没有提供CDN地址 场景 视频上传,工作流转码任务触发后,在 媒体处理控制台 > 媒体库 > 管理 > 媒体地址获取 > 媒体地址 不显示媒资文件对应的CDN地址。 3 解决 编辑或者删除对应的工作流,重新配置工作流,在 配置工作流 > 配置内容分发网络(CDN) 中添加CDN加速域名。之后该工作流新创建的转码任务中,新增的CDN域名就会显示在输出文件的URL地址中。 2 原因 只有在新建工作流配置中有CDN域名,对应转码输出后的资源才会带CDN域名地址的链接,如果当时创建工作流不存在CDN域名,之后在bucket中绑定域名并进行加速,这样的域名是不会在输出媒体地址中显示的。 注意事项 媒体地址获取中,原文件地址获取是不能获取到CDN地址的,用户需自己绑定或者代码实现将bucket域名替换为对应的CDN域名。 2 输出文件支持如下变量设置 输出 Object 中可选如下变量: {RunId}:媒体工作流执行ID {ObjectPrefix}:不含Bucket信息的原文件(输入文件)路径 {FileName}:不含扩展名的原文件(输入文件)名 {ExtName}:原文件(输入文件)扩展名 如何触发工作流的执行 当工作流的配置的输入Bucket路径中存在文件的增量输入,对应的工作流就会被触发,进行相关的转码截图任务等。 6 关于如何上传文件到工作流的输入Bucket路径中,参见上传视频文件的方法。
保持可爱mmm 2020-03-30 11:55:21 0 浏览量 回答数 0

回答

它可以正常运行,但仅在非常实际的意义上。为什么在运行该循环后byteArr为空?因为在循环内,您需要依次将其设置为每一行的内容,并且最后一行必须为空。因此,您仅对最后一行获得有效结果。 您可以在循环之前正确创建一个变量byteArr,但是在循环内部必须添加新字节,而不是替换它们。 还有一些注意事项:在文件的“ ..行”中。“``行变量已经是一个字符串,因此,不需要“ txt = str(lines)”。使用和来打开文件通常比较整洁,因为它还会在该代码块的末尾自动将其关闭(实际上,您在这里忘记这样做了)。 byteArr = bytearray() with open('labb9Text.txt', "r") as file: for lines in file: byteArr += bytearray(lines, 'utf-8') print (byteArr) *实际上,这甚至可以更容易地完成,但是前提是确实不需要utf-8编码(也就是说,如果文件已经采用正确的编码): with open('labb9Text.txt', "rb") as file: byteArray = bytearray(file.read()) 它根本不需要任何循环。 回答来源:stackoverflow
is大龙 2020-03-24 21:42:01 0 浏览量 回答数 0

回答

首先,我想您可能要关闭持久性连接,因为它们几乎总是弊大于利。 其次,我想您要仔细检查您的MySQL用户,以确保任何人都无法从远程服务器进行连接。这也是要检查的主要安全事项。 第三,我想说你想打开MySQL Slow Query Log来监视花费很长时间的任何查询,并使用它来确保没有任何查询锁定键表太长时间。 您可以检查的其他一些事情是在CPU负载很高时运行以下查询: SHOW PROCESSLIST; 这将向您显示当前正在运行或正在运行的队列中的任何查询,查询的内容以及查询的状态(如果该查询过长,该命令将截断查询,您可以使用SHOW FULL PROCESSLIST查看完整的查询文本) 。 您还需要注意缓冲区大小,表缓存,查询缓存和innodb_buffer_pool_size(如果使用的是innodb表)之类的东西,因为所有这些内存分配都可能影响查询性能,这可能导致MySQL吃光CPU。 您可能还想对以下内容进行重新阅读,因为它们包含一些有用的信息。 MySQL如何使用内存 MySQL系统变量 使用探查器也是一个很好的主意。您可以在需要时启用一些功能,以向您显示应用程序正在运行的查询,是否存在重复的查询,查询需要花费多长时间等。类似的示例就是我一直在努力的一个示例。PHP Profiler,但是有很多。如果您使用的是Drupal,Joomla或Wordpress之类的软件,您可能想在社区中四处询问,因为可能有可用的模块可以让您获得此信息而无需手动集成任何东西。 来源:stack overflow
保持可爱mmm 2020-05-13 14:10:31 0 浏览量 回答数 0

回答

从命令行运行php非常简单。但有些注意事项需要各位了解下,诸如$_SESSION之类的服务器变量是无法在命令行中使用的,其他代码的运行则和web服务器中完全一样; B、在命令行中执行php文件的好处之一就是可以通过脚本实现一些计划任务(crontab)的执行,而无须通过web服务器。 延伸1: php -v 显示当前PHP版本 php -m 显示当前php加载的有效模块 php -i 输出无html格式的phpinfo php --rf function 延伸2:向php脚本传递参数: 提示:命令行下执行php,是不走Apache/Nginx等这类东西的,没有什么http协议,所以get,post传参数根本不起作用,并且还会报错。有些时候需要在shell命令下把PHP当作脚本执行,比如定时任务。这就涉及到在shell命令下如何给php传参的问题,通常有三种方式传参。 使用$argv or $argc参数接收 echo "接收到{$argc}个参数"; print_r($argv); ?> 使用getopt函数 $param_arr = getopt('a:b:'); print_r($param_arr); ?> C、提示用户输入 fwrite(STDOUT,'Please enter your name:'); echo 'Your name is:'.fgets(STDIN); ?>
珍宝珠 2019-12-02 03:16:33 0 浏览量 回答数 0

问题

【精品问答】大数据常见问题之flink五十问第二期

Flink五十问 第二期分为基础篇与进阶篇 持续关注有惊喜~ 基础篇 1.简单介绍一下Flink 2.Flink相比Spark Streaming有什么区别? 3.Flink的组件栈是怎么样的 4.Flink的基础编程模型了...
茶什i 2019-12-01 22:02:36 263 浏览量 回答数 0

问题

创建高权限账号

为满足不同用户的需求,MySQL 5.5/5.6版本的RDS实例可以创建高权限账号,支持用户在实例内直接执行create、drop、grant等命令,实现更便捷的管理操作。 创建高权限账号后...
云栖大讲堂 2019-12-01 21:37:25 1435 浏览量 回答数 0

回答

本节以 IDE 内的 Todo App 模板小程序为例,介绍支付宝小程序的文件结构, 以及每种文件类型在小程序中的作用。 Todo App 是一个简单的待办事项管理小程序,实现了用户登录、新增自定义待 办事项、划除或恢复待办事项的功能。 app.json app.json 是小程序的全局配置,用于配置小程序的页面列表、默认窗口标题、导 航栏背景色等。更多配置请参见 文档配置。 app.acss 定义了全局样式,作用于当前小程序的所有页面。 上例中的 page 为框架支持的特殊选择器,会匹配框架提供的页面根节点容器。 app.js app.js 用于注册小程序应用,可配置小程序的生命周期,声明全局数据,调用丰 富的 API,如以下获取用户授权及获取用户信息 API 等,更多 API 信息请参见 API 文档。 可以看到,全局的逻辑代码放在 App({})中,声明了全局数据 todos 、 userInfo ,以及全局方法 getUserInfo()。 todos 全局数据中已经存储了一些数据,即 Todo App 小程序中已有的一些待办 事项。 全局方法 getUserInfo() 调用了授权 API my.getAuthCode,以及获取用户信息 API my.getAuthUserInfo ,并将获取到的用户信息存储在 userInfo 中。 小程序页面 此示例中有两个页面,Todo List 页面和 Add Todo 页面,都位于 pages 目录 下。小程序的所有页面路径必须在 app.json 中申明,路径从项目根目录开始且 不能包括后缀名,pages 的第一个页面就是小程序的首页。 每一个页面 由同路径下的四种类型文件组成,即 .json 后缀的配置文件,.axml 后缀的模板文件,.acss 后缀的样式文件,.js 后缀的逻辑脚本文件。 todo List 页面 todos.json 用于配置当前页面的窗口表现。此处定义了使用一个自定义组件 add-button ,指定它的组件名称及对应的路径。自定义组件的具体使用后面会讲 述。 页面配置文件不是必须的。当存在页面配置文件时,各个页面配置项会优先于 app.json 中 window 的同名配置项。当不存在页面配置文件,则直接使用 app.json 中的默认配置。因此,Todo List 页面的标题为 app.json 中指定的 defaultTitle ,即 Todo App。 todos.axml 为页面结构模板文件。使用 ,, ,,, , 来搭建页面结构以及通过 Mustache 语法两对大括号({{}})绑定 todos 数据。  绑定数据请参见此文档  绑定事件请参见此文档 todos.js 是页面的逻辑脚本文件,小程序页面的逻辑代码必需包含在 Page({}) 中。在这个文件中可实现:  监听并处理页面的生命周期函数 onShow onLoad  获取小程序实例以及其他页面实例 getApp getCurrentPages  声明并处理数据 data  响应页面交互事件,调用 API 等  这里需要注意的是 app.todos 是来自 app.js 中全局的变量定义 todos.acss 定义页面局部样式。指定 todos.axml 中不同元素的样式,包括位 置、背景颜色、字体、字体颜色等。 ACSS 语法参见 样式 文档。页面的 .acss 文件不是必须的,但对于相同选择器,页面局部样式会覆盖 app.acss 全局样 式。 Add Todo 页面 add-todo.json 声明自定义组件名称和路径。 add-todo.axml 为页面结构模板文件。 此页面的两个核心功能为: 1. 使用 组件接收用户输入。 2. 是一个自定义组件,可将一些功能完整的代码封装为自定义组件,便于 在其他地方复用。 add-todo.js 为页面逻辑代码。add-todo.acss 同 todos.acss 用法一致,不再 赘述 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library
KaFei 2020-04-27 13:49:46 0 浏览量 回答数 0

问题

【精品问答】关于Java,那些入门级的面试题

Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称,最初推出的时候提出 “Write Once, Run Anywhere” 的理想愿景。现如今&#x...
问问小秘 2020-03-27 18:39:09 1073 浏览量 回答数 3

回答

概述 1.1 媒体工作流的作用 媒体工作流支持截图、转码、转封装、水印、剪辑等功能,使您可以快速、灵活、按需搭建云端音视频处理流程;在媒体工作流开始执行和完成执行时,支持向指定的消息队列或消息通知发送工作流执行信息。具体包括以下功能:输入bucket路径,转码配置,截图配置,发布配置及消息通知配置。 消息服务检测到输入bucket路径中存在资源增量输入,就会触发媒体工作流中的转码或者截图任务进行转码及截图,对应的任务完成,如果您的输入配置中配置了消息服务的通知或者队列即会在工作流执行实例的开始和结束时通过消息服务发送消息供用户业务逻辑判断,而对应的转码或者截图结果将存储到工作流配置的输出bucket中。 1.2 媒体工作流配置流程 用户可以登陆控制台,在工作流管理中选择配置方案—>输入设置—>转码设置/截图设置/分析及转码设置—>发布设置—>配置cdn加速; 1 1.3 配置方案介绍 2 预置配置方案包括了:M3U8切片工作流,预置智能模板工作流,多码率多格式工作流,FLV多码率工作流,M3U8多码率工作流,MP4多码率工作流,以上工作流其实就是分析转码截图任务节点的组合,用户可以根据需求选择对应的组合或者自定义组合。 3 输入设置 2.1 输入设置基础设置 点击输入节点上的“铅笔”按钮—>进入输入配置页面—>选择输入bucket,转码管道,消息类别,填入输入路径,基础配置就完成了。 45 2.2 输入bucket设置 点击“选择”按钮可以进入到OSS文件管理页面,用户可以选择需求的bucket及bucket下的某个文件夹作为输入路径(文件夹选定后,会自动补全到输入路径的文本框中)。 6 输入bucket选择注意事项 在哪个区域新建工作流,对应的输入bucket也只能是对应区域的bucket,别的区域的bucket不能选择; 输入bucket中的可选择bucket,必须源自媒体bucket的输入bucket,媒体bucket如何添加,请看视频点播初始化设置文档; 输入路径是可编辑的,但注意目录的设置不需要以/结尾,如想存储资源到1目录下的2目录,那么对应的输入路径便为1/2/,而不是1/2; 目前工作流只支持在华东1,华东2,华北1,华南1 区域; 2.3 转码管道设置 转码管道,是处理转码作业的管道,选择对应的管道即可。关于管道的具体意义请参考:《视频点播的初始化设置》。 转码管道限制: 目前每个用户在每个服务可用域拥有1个管道; 每个管道可最多可容纳10000个排队作业; 每个管道最多可同时处理的作业不超过分配给该管道的转码资源数; 2.4 消息类别设置 其中消息类别分为:队列和通知。消息类别可以不进行设置。队列创建看【队列创建】; 通知创建看【通知创建】;队列与通知的区别请看【队列与通知的区别】;队列与通知的消息消费看【队列与通知的消息消费】;选择通知后,可以选择对应的通知名称,也可以增加通知。7选择队列后,可以选择对应的队列,也可以增加队列。8 转码设置 3.1 转码设置基础设置 点击转码按钮上的“铅笔”按钮—>进入基础配置页面—>选择转码模板,输出bucket,是否使用水印,填入输出路径,基础配置就完成了。1011 3.2 转码模板设置 点击选择按钮—>进入转码模板页面—>选择转码模板。转码模板分为预置静态模板及自定义模板。视频点播的转码模板源自媒体转码MTS的转码模板,也可以在视频点播初始化设置的时候添加。预置静态模板介绍看【预置静态模板】 12 转码模板选择注意事项 转码为不同的格式,建议选择转码模板,而不是转码封装模板,否则可能会有转码失败的可能。 3.3 输出bucket设置 点击选择按钮—>进入OSS文件管理页面—>选择输出bucket及对应的输出文件夹。13 输出bucket选择注意事项 在哪个区域新建工作流,对应的输出bucket也只能是对应区域的bucket,别的区域的bucket不能选择; 输出bucket中的可选择bucket,必须源自媒体bucket的输出bucket,媒体bucket如何添加,请看视频点播初始化设置文档; 输出路径是可编辑的,但注意目录的设置不需要以/结尾,如想存储资源到1目录下的2目录,那么对应的输出路径便为1/2/,而不是1/2; 目前工作流只支持在华东1,华东2,华北1和华南1 四个区域; 3.4 使用水印设置 水印设置是为用户的转码视频添加水印,用户可以选择对应的水印模板或者不使用水印。水印模板选择后,选择对应的水印图片—>进入OSS管理页面—>选择bucket中的图片。水印模板源自媒体转码MTS的水印模板,也可以在视频点播初始化设置的时候添加。14 注意: 水印图片所在bucket源自媒体bucket中的输出bucket。 4. 截图设置 4.1 截图设置基础设置 点击截图按钮上的“铅笔”标识—>进入截图页面—>选择是否进行多张截图,输出bucket,开始时间,是否设置为封面,是否截取关键帧,设置截图时间间隔,截图数量,输出路径,图片宽度,高度。1516 截图基础配置注意事项: 多张截图:表示是否开启多张截图,多张截图开启后,可以设置截图数量及截图间隔; 开始时间,表示从什么时间点开启截图,注意设置开始时间不要大于视频总时长,不然是不会截图的; 设置封面:表示对应的截图是否设置为封面,如果开启多张截图,默认第一张截图设置为封面; 关键帧:表示是否只截取关键帧的图片,截取非关键帧的图片,图片可能会存在模糊损坏的现象; 图片宽度高度表示截取图片的宽高; 4.1 输出bucket设置 点击选择按钮—>进入OSS文件管理页面—>选择输出bucket及对应的输出文件夹。17 输出bucket选择注意事项 在哪个区域新建工作流,对应的输出bucket也只能是对应区域的bucket,别的区域的bucket不能选择; 输出bucket中的可选择bucket,必须源自媒体bucket的输出bucket,媒体bucket如何添加,请看视频点播初始化设置文档; 输出路径是可编辑的,在选择bucket并选择文件夹后,对应的输出路径默认为:文件夹名称/ {RunId}/{SnapshotTime}/{Count}.jpg,{RunId}表示转码实例id, {SnapshotTime} 为截图时间点,单位为毫秒,此例中对视频第5秒截图,则变量取值为 5000,如果使用多张图片需要使用{Count}占位符,反之不需要; 目前工作流只支持在华东1,华东2,华北1和华南1 四个区域; 5. 分析/转码设置 5.1 分析/转码设置基础设置 点击转码按钮上的“铅笔”标识—>进入基础配置页面—>选择转码模板,输出bucket,是否使用水印,填入输出路径,基础配置就完成了。1819 5.2 转码模板设置 点击选择按钮—>进入转码模板页面—>选择转码模板。转码模板为预置智能模板,对应的转码任务要生效,得转码之前的分析作业执行后,分析得到到适用该视频的转码模板包含了转码设置中选择的模板,对应的转码任务才能执行,否则是不会执行,在执行实例中出现“跳过”的图示结果。预置智能模板介绍看【预置智能模板介绍】;如果想转码任务一定执行,请直接添加转码任务,不要加分析/转码任务并且使用MTS静态模板,不要使用MTS智能模板。 20 转码模板选择注意事项 转码为不同的格式,建议选择转码模板,而不是转码封装模板 5.3 输出bucket设置 点击选择按钮—>进入OSS文件管理页面—>选择输出bucket及对应的输出文件夹。21 输出bucket选择注意事项 在哪个区域新建工作流,对应的输出bucket也只能是对应区域的bucket,别的区域的bucket不能选择; 输出bucket中的可选择bucket,必须源自媒体bucket的输出bucket,媒体bucket如何添加,请看视频点播初始化设置文档; 输出路径是可编辑的,但注意目录的设置不需要以/结尾,如想存储资源到1目录下的2目录,那么对应的输出路径便为1/2/,而不是1/2; 目前工作流只支持在华东1,华东2,华北1和华南1 四个区域; 5.4 使用水印设置 水印设置是为用户的转码视频添加水印,用户可以选择对应的水印模板或者不使用水印。水印模板选择后,选择对应的水印图片—>进入OSS管理页面—>选择bucket中的图片。水印模板源自媒体转码MTS的水印模板,也可以在视频点播初始化设置的时候添加。22 注意: 水印图片所在bucket源自媒体bucket中的输出bucket。 6. 发布设置 点击发布边上的铅笔按钮—>进入发布页面—>选择媒体发布类型,基础配置就完成了。媒体发布类型分为自动及手动,默认为手动。2324 发布设置注意事项: 自动与手动的区别为:自动表示工作流处理后生成的object的acl 为default状态,这个状态表示object的权限继承自bucket的权限,当bucket是公共读的时候,object的acl 也是公共读,bucket私有,object acl 也是私有的;手动表示工作流处理后生成的object的acl为私有的,必须通过鉴权才能访问该object资源; 已有的媒体视频要修改发布状态,可以在媒体库中点击发布,进行发布;25 7. 配置cdn加速 点击下一步按钮—>进入配置内容分发网络(CDN)页面—>如果不存在cdn域名就点击添加,快速添加点播加速域名。26 注意:只有在新建工作流配置中有cdn 域名,对应转码输出后的资源才会带cdn域名地址的链接,如果当时创建工作流不存在CDN域名,之后在bucket中手动绑定域名并进行加速,这样的域名是不会在输出媒体地址中显示的。27
保持可爱mmm 2020-03-30 11:56:10 0 浏览量 回答数 0

回答

反射机制什么是反射机制简单来说,放射可以帮助我们在动态运行的时候,对于任意一个类,可以获得其所有的方法(包括 public protected private 默认状态的),所有的变量 (包括 public protected private 默认状态的)。是不是很强大呢。 反射机制有什么作用呢?获取某些类的一些变量,调用某些类的私有方法。(例如在Android开发中我们可以用来开启 WiFi 热点,调用 WifiManager 中的 setWifiApEnabled() 方法 )增加代码的灵活性。很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术.假如有这样一个类 Person,它拥有多个成员变量,country,city,name,province,height,age 等,同时它拥有多个 构造方法,多个方法,这些变量,方法的访问权限既有 public 也有 private 的。下面我们以这个为例子,一起看怎样使用反射获得相应的 Filed,Constructor,Method。 public class Person { public String country; public String city; private String name; private String province; private Integer height; private Integer age; public Person() { System.out.println("调用Person的无参构造方法"); } private Person(String country, String city, String name) { this.country = country; this.city = city; this.name = name; } public Person(String country, Integer age) { this.country = country; this.age = age; } private String getMobile(String number) { String mobile = "010-110" + "-" + number; return mobile; } private void setCountry(String country) { this.country=country; } public void getGenericHelper(HashMap<String, Integer> hashMap) { } public Class getGenericType() { try { HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); Method method = getClass().getDeclaredMethod("getGenericHelper",HashMap.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); if (null == genericParameterTypes || genericParameterTypes.length < 1) { return null; } ParameterizedType parameterizedType=(ParameterizedType)genericParameterTypes[0]; Type rawType = parameterizedType.getRawType(); System.out.println("----> rawType=" + rawType); Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); if (actualTypeArguments==genericParameterTypes || actualTypeArguments.length<1) { return null; } for (int i = 0; i < actualTypeArguments.length; i++) { Type type = actualTypeArguments[i]; System.out.println("----> type=" + type); } } catch (Exception e) { } return null; } @Override public String toString() { return "Person{" + "country='" + country + '\'' + ", city='" + city + '\'' + ", name='" + name + '\'' + ", province='" + province + '\'' + ", height=" + height + '}'; } } 使用反射获得所有构造方法(包括私有的,非私有的)默认权限的指的是没有修饰符修饰的 几个重要的方法讲解方法 描述public Constructor getConstructor(Class… parameterTypes) 获得指定的构造方法,注意只能获得 public 权限的构造方法,其他访问权限的获取不到public Constructor getDeclaredConstructor(Class… parameterTypes) 获得指定的构造方法,注意可以获取到任何访问权限的构造方法。public Constructor[] getConstructors() throws SecurityException 获得所有 public 访问权限的构造方法public Constructor[] getDeclaredConstructors() throws SecurityException 获得所有的构造方法,包括(public, private,protected,默认权限的)看了上面的几个方法,其实很好区分 后缀带 s 的返回对象时数组类型,是可以获得相应权限的所有方法的,如 Constructor getConstructor() 方法 和 Constructor获得所有的构造方法public static void printConstructor(String className) { try { Class<?> aClass = Class.forName(className); Constructor<?>[] constructors = aClass.getConstructors(); print(constructors); Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors(); print(declaredConstructors); } catch (ClassNotFoundException e) { e.printStackTrace(); } }print: private com.example.reflectdemo.Person(java.lang.String,java.lang.String,java.lang.String) print: public com.example.reflectdemo.Person() print:public com.example.reflectdemo.Person(java.lang.String,java.lang.Integer) print:public com.example.reflectdemo.Person(java.lang.String,java.lang.Integer) 对比 Person 里面所有的构造方法,可以知道我们代码的逻辑是正确的 获得指定的构造方法public static Constructor getConstructor(String className, Class<?>... clzs) { try { Class<?> aClass = Class.forName(className); Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(clzs); print(declaredConstructor); // if Constructor is not public,you should call this declaredConstructor.setAccessible(true); return declaredConstructor; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } public class TestHelper { public static final String TAG="xujun"; public static final String CLASS_NAME = "com.example.reflectdemo.Person"; public static final String CHINA = "China"; public static void testConstructor(){ ReflectHelper.printConstructor(CLASS_NAME); Constructor constructor = ReflectHelper.getConstructor(CLASS_NAME, String.class, Integer.class); try { Object meinv = constructor.newInstance(CHINA, 12); Person person = (Person) meinv; Log.i(TAG, "testConstructor: =" + person.toString()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } 我们将可以看到以下的输出结果 testConstructor: =Person [country=China, city=null, name=null, province=null, height=null, age=12] 可以看到 country=China,age=12 这说明我们成功通过反射调用 Person 带两个参数的沟改造方法。 注意事项如果该方法,或者该变量不是 public 访问权限的,我们应该调用相应的 setAccessible(true) 方法,才能访问得到 //if Constructor is not public,you should call thisdeclaredConstructor.setAccessible(true);12使用反射获得所有的 Filed 变量获得所有的 Filed 变量public static void printFiled(String className) { try { Class<?> aClass = Class.forName(className); Field[] fields = aClass.getFields(); PrintUtils.print(fields); Field[] declaredFields = aClass.getDeclaredFields(); PrintUtils.print(declaredFields); } catch (ClassNotFoundException e) { e.printStackTrace(); } } 获得指定的成员变量现在假如我们要获得 Person 中的私有变量 age ,我们可以通过以下的代码获得,同时并打印出所有的成员变量。 public static Field getFiled(String className, String filedName) { Object o = null; try { Class<?> aClass = Class.forName(className); Field declaredField = aClass.getDeclaredField(filedName); // if not public,you should call this declaredField.setAccessible(true); return declaredField; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return null; } public static void testFiled(){ ReflectHelper.printFileds(CLASS_NAME); Person person = new Person(CHINA, 12); Field field = ReflectHelper.getFiled(CLASS_NAME, "age"); try { Integer integer = (Integer) field.get(person); PrintUtils.print("integer="+integer); } catch (IllegalAccessException e) { e.printStackTrace(); } } 我们可以看到以下的输出结果 print: public java.lang.String com.example.reflectdemo.Person.country print: public java.lang.String com.example.reflectdemo.Person.city print: public java.lang.String com.example.reflectdemo.Person.country print: public java.lang.String com.example.reflectdemo.Person.city print: private java.lang.String com.example.reflectdemo.Person.name print: private java.lang.String com.example.reflectdemo.Person.province print: private java.lang.Integer com.example.reflectdemo.Person.height print: private java.lang.Integer com.example.reflectdemo.Person.age print:integer=12 使用反射执行相应的 Method主要有以下几个方法, public Method[] getDeclaredMethods()public Method[] getMethods() throws SecurityExceptionpublic Method getDeclaredMethod()public Method getMethod(String name, Class获取所有的 Method public static void printMethods(String className) { try { Class<?> aClass = Class.forName(className); Method[] declaredMethods = aClass.getDeclaredMethods(); PrintUtils.print(declaredMethods); } catch (ClassNotFoundException e) { e.printStackTrace(); } } print: public java.lang.String com.example.reflectdemo.Person.toString() print: public java.lang.Class com.example.reflectdemo.Person.getGenericType() print: private void com.example.reflectdemo.Person.setCountry(java.lang.String) print: public void com.example.reflectdemo.Person.getGenericHelper(java.util.HashMap) print: private java.lang.String com.example.reflectdemo.Person.getMobile(java.lang.String) 对比 Person 里面的所有方法,毫无疑问我们的代码逻辑是正确的。 获取指定的 Method我们可以使用 getDeclaredMethod(String name, Class public static void testMethod(){ ReflectHelper.printMethods(CLASS_NAME); Person person=new Person(); Method method = ReflectHelper.getMethod(CLASS_NAME, "setCountry", String.class); try { // 执行方法,结果保存在 person 中 Object o = method.invoke(person, CHINA); // 拿到我们传递进取的参数 country 的值 China String country=person.country; PrintUtils.print(country); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public class ReflectHelper { private static final String TAG = "ReflectHelper"; public static Method getMethod(String className, String methodName, Class<?>... clzs) { try { Class<?> aClass = Class.forName(className); Method declaredMethod = aClass.getDeclaredMethod(methodName, clzs); declaredMethod.setAccessible(true); return declaredMethod; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } } 执行上面的函数,将可以看到下面的结果 print:China 即我们成功利用反射调用 Person 的 setCountry 方法,并将值成功改变。 使用反射操作数组/** * 利用反射操作数组 * 1 利用反射修改数组中的元素 * 2 利用反射获取数组中的每个元素 */ public static void testArrayClass() { String[] strArray = new String[]{"5","7","暑期","美女","女生","女神"}; Array.set(strArray,0,"帅哥"); Class clazz = strArray.getClass(); if (clazz.isArray()) { int length = Array.getLength(strArray); for (int i = 0; i < length; i++) { Object object = Array.get(strArray, i); String className=object.getClass().getName(); System.out.println("----> object=" + object+",className="+className); } } } —-> object=帅哥,className=java.lang.String —-> object=7,className=java.lang.String —-> object=暑期,className=java.lang.String —-> object=美女,className=java.lang.String —-> object=女生,className=java.lang.String —-> object=女神,className=java.lang.String 从结果可以说明,我们成功通过 Array.set(strArray,0,”帅哥”) 改变数组的值。 使用反射获得泛型类型public static void getGenericHelper(HashMap map) { } 现在假设我们有这样一个方法,那我们要怎样获得 HashMap 里面的 String,Person 的类型呢? 对于 Java Type还不熟悉的可以先读这一篇博客 java Type 详解 public static void getGenericType() { try { Method method =TestHelper.class.getDeclaredMethod("getGenericHelper",HashMap.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); // 检验是否为空 if (null == genericParameterTypes || genericParameterTypes.length < 1) { return ; } // 取 getGenericHelper 方法的第一个参数 ParameterizedType parameterizedType=(ParameterizedType)genericParameterTypes[0]; Type rawType = parameterizedType.getRawType(); System.out.println("----> rawType=" + rawType); Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); if (actualTypeArguments==genericParameterTypes || actualTypeArguments.length<1) { return ; } // 打印出每一个类型 for (int i = 0; i < actualTypeArguments.length; i++) { Type type = actualTypeArguments[i]; System.out.println("----> type=" + type); } } catch (Exception e) { } } 执行上面的代码,输出结果 —-> rawType=class java.util.HashMap —-> type=class java.lang.String —-> type=class com.example.reflectdemo.Person 怎样获得 Metho,Field,Constructor 的访问权限 ( public,private,ptotected 等)其实很简单,我们阅读文档可以发现他们都有 getModifiers() 方法,该方法放回 int 数字, 我们在利用 Modifier.toString() 就可以得到他们的访问权限 int modifiers = method.getModifiers();Modifier.toString(modifiers);
hiekay 2019-12-02 01:41:01 0 浏览量 回答数 0

问题

【教程免费下载】面向机器学习的自然语言标注

前言 本书的读者是那些使用计算机来处理自然语言的人。自然语言是指人类所说的任何一种语言,可以是当代语言(如英语、汉语、西班牙语),也可以指过去曾经使用过的语言(如拉丁语...
知与谁同 2019-12-01 22:07:43 1333 浏览量 回答数 0

回答

ZIP文件解压 OSS 控制台新增了对 ZIP 文件自动解压的功能,这个功能需要结合函数计算共同完成,目前只对 ZIP 后缀的文件进行处理,下面介绍配置过程和相关注意事项: 架构图 OSS 控制台配置 如何修改触发器 如何修改目标目录 如何删除触发器 扩展函数功能 大文件支持 架构图 ZIP文件 ZIP文件 OSS OSS 函数计算 函数计算 ZIP文件上传 自动触发函数(缺省支持PUT和POST请求) 解压文件 OSS控制台配置 打开 OSS 的控制台,选择某个 Bucket,在 Bucket 主页选择函数计算,如下图:001 注意:如果没开通函数计算,会提示开通函数后,才能进行下面的操作。 点击 ZIP 包解压按钮,进入 OSS 触发器编辑页面,如下图:002页面属性讲解: 服务授权:授予函数计算读写 OSS 该 Bucket 下的执行函数的权限,需要点击确认进入 RAM 进行授权后使用,每个触发器都需要重新设置一次。 触发器角色:授予 OSS 访问函数计算权限,仅需要设置一次即可。 前缀:当具备某前缀的文件可以触发函数执行,建议用户设置一定要设置,如果不设置,缺省对该 Bucket 下全部的 ZIP 文件都匹配到,有可能会触发循环执行。详细描述 目标目录:解压后的 ZIP 文件存放的目录,如果不设置,缺省会解压到当前 Bucket 下。 费用知晓: ZIP 包解压的功能是增值服务,在解压过程中,函数计算会根据解压执行时间计算费用。 如何修改触发器 当用户设置好触发器后,想进行修改,点击列表的编辑按钮,页面会跳转到函数计算触发器的修改页面进行编辑,如下图所示: 003 用户可以修改事件触发、前缀和后缀名,强烈建议不要修改后缀,因为系统根据后缀已经默认创建了系统函数,来保证业务逻辑的正常运转。 如何修改目标目录 如果用户想修改目标解压的目录,需要在函数计算的环境变量中修改,路径是,点击函数概览,点击函数属性的修改,修改环境变量的值即可,详见下图:004 如何删除触发器 如果用户想删除该功能,从 OSS 控制台点击函数触发器列表的编辑按钮,在函数计算的触发器页面,点击删除即可,删除触发器后,建议同时删除该函数,删除后的 ZIP 解压功能将无法提供运行。 扩展函数功能 通过 OSS 控制台生成的 ZIP 解压功能,是在用户的函数计算里自动生成了一个系统函数,用户可以根据自己的需求来修改函数代码,例如,用户的 ZIP 文件较小,处理的时间较小,可以选择更小规格的内存执行来节省费用,同样,如果用户的 ZIP 文件较大,例如 1GB 以上,建议把超时时间设置更长,以免出现超时现象。 另外,如果解压的文件不仅仅是 ZIP 格式,用户可以根据业务需要,扩展函数代码,目前函数计算提供的缺省函数是 Python2.7语言. 大文件支持 如果压缩文件包含太多文件,解压函数可能会超时,造成解压不完全。函数计算结合 Serverless 工作流服务提供了一个海量文件解压方案,可以在应用中心使用应用(目前该应用仅在上海,北京,杭州,深圳可用)。
1934890530796658 2020-03-27 17:25:36 0 浏览量 回答数 0

问题

【精品问答】Java基础测试题(附答案)

Java作为市场最大的语言,一直受开发者关注,很多开发者也是将其应用于各个领域。那么,对于Java基础知识你还掌握多少呢?下面来检测下吧! Java源程序文件的后缀是&...
游客pklijor6gytpx 2019-12-01 22:00:58 577 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 邮件组件CDONTS 功能简介ASP本身没有发送邮件的能力,但如果希望用ASP来发送E-MAIL(例如:你有一个消息,希望在此页被访问后自动将该消息E-MAIL给留言的上网者),那么你需要安装一个ASP组件。并借助这些组件来帮你实现邮件的自动发送、回复等工作,我们可以提供CDONTS组件。CDONTS.DLL 在注册之后,可以使用ASP发送E-MAIL,来实现动态的EMAIL通信,这经常在定单与电子商务中应用。在IIS5下,可以使用CDONTS。它容易使用的并且性能良好。步骤如下:1、检查你是否安装了SMTP服务。OPTION PACK 缺省安装时是包括SMTP服务的。SMTP服务安装后,在 的system32目下会有一个文件叫CDONTS.DLL。2、你可以用下面的简单脚本通过ASP发送E-MAIL  set newmail=server.CreateObject("cdonts.newmail")newmail.From="webmaster@www.yourdomain.com"newmail.To ="test@test.com"newmail.Subject="主题"newmail.Body = "asp mail"newmail.BodyFormat =0newmail.MailFormat =0newmail.Send  response.write "send ok!"set newmail=nothing3、发送附件CDONTS 的 一 个 常 用 特 性 是 用 来 在 E-MAIL 中 发 送 附 件 。 代 码 也 不 难 写 。CDONTS发信组件注意事项由于万网企业邮局具有反垃圾邮件,包括防伪装邮件功能,因此可能根据发信人来源地址屏蔽了您的网站邮件投递。建议您将发信脚本中发件人地址(From参数)设置为:xxx@www.yourdomain.com,这样可以保证正常投递邮件。文件上传组件Upload功能简介本Upload组件目前只支持单文件上传,可以为任意扩展名,可以在上传后保存名字。上传文件的最大大小为1M,需要在程序中指定上传目录并由我们工程师添加权限。支持上传文件名修改和使用变量文件名。1、 上传界面 产品名称: 上传产品图片 (只能上传gif,jpg文件) 2、 上传程序testup.asp<%If Request.ServerVariables("REQUEST_METHOD") = "POST" ThenVirPath="productimg" 'productimg 是你的站点上的一个存储HTTP上传文件的目录RealPath=Server.MapPath(VirPath) & "\"Set objupload=Server.CreateObject("hichinafso.Upload")objupload.Maxsize=1000000 '设定最大上传值objupload.Path=RealPath '设定上传的目录objupload.Upload '调用UPload方法,获取表单中提交的所有数据 filevalue=objUpload.Form("FileName") '获取文件名filename=objUpload.filename("FileName")fieldvalue=objUpload.Form("fieldname") '取得fieldname表单项的值'response.write filename'response.endif trim(filename)="" thenfilename="no_pro_img.gif" '指向一个“无产品”的图片elseextendname=right(filename,3)if extendname="jpg" or extendname="gif" thenabcd=1elseresponse.write "错误!请输入图片的扩展名gif或jpg"response.endend ifvarfilename=FileNameobjUpload.Save "FileName",2,varfilename' 这里使用单独保存的方法:' "FileName" 是HTML的表单上传FILE名称,本例就是' 2代表覆盖,如果在SAVE之前,先调用文件组件判断此目录下是否有同名文件则不会出现覆盖' 现象,或者保证新文件名为唯一标识' "aaFAN.gif" 是我们上传后修改的文件名。'objUpload.SaveAllend ifend ifresponse.write "上传文件成功!" & "你上传的产品名称为:" & fieldvalue & " 文件名为:" & filename & ""%>如果问题还未能解决,请联系售后技术支持。      
2019-12-01 23:21:59 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 邮件组件CDONTS 功能简介ASP本身没有发送邮件的能力,但如果希望用ASP来发送E-MAIL(例如:你有一个消息,希望在此页被访问后自动将该消息E-MAIL给留言的上网者),那么你需要安装一个ASP组件。并借助这些组件来帮你实现邮件的自动发送、回复等工作,我们可以提供CDONTS组件。CDONTS.DLL 在注册之后,可以使用ASP发送E-MAIL,来实现动态的EMAIL通信,这经常在定单与电子商务中应用。在IIS5下,可以使用CDONTS。它容易使用的并且性能良好。步骤如下:1、检查你是否安装了SMTP服务。OPTION PACK 缺省安装时是包括SMTP服务的。SMTP服务安装后,在 的system32目下会有一个文件叫CDONTS.DLL。2、你可以用下面的简单脚本通过ASP发送E-MAIL  set newmail=server.CreateObject("cdonts.newmail")newmail.From="webmaster@www.yourdomain.com"newmail.To ="test@test.com"newmail.Subject="主题"newmail.Body = "asp mail"newmail.BodyFormat =0newmail.MailFormat =0newmail.Send  response.write "send ok!"set newmail=nothing3、发送附件CDONTS 的 一 个 常 用 特 性 是 用 来 在 E-MAIL 中 发 送 附 件 。 代 码 也 不 难 写 。CDONTS发信组件注意事项由于万网企业邮局具有反垃圾邮件,包括防伪装邮件功能,因此可能根据发信人来源地址屏蔽了您的网站邮件投递。建议您将发信脚本中发件人地址(From参数)设置为:xxx@www.yourdomain.com,这样可以保证正常投递邮件。文件上传组件Upload功能简介本Upload组件目前只支持单文件上传,可以为任意扩展名,可以在上传后保存名字。上传文件的最大大小为1M,需要在程序中指定上传目录并由我们工程师添加权限。支持上传文件名修改和使用变量文件名。1、 上传界面 产品名称: 上传产品图片 (只能上传gif,jpg文件) 2、 上传程序testup.asp<%If Request.ServerVariables("REQUEST_METHOD") = "POST" ThenVirPath="productimg" 'productimg 是你的站点上的一个存储HTTP上传文件的目录RealPath=Server.MapPath(VirPath) & "\"Set objupload=Server.CreateObject("hichinafso.Upload")objupload.Maxsize=1000000 '设定最大上传值objupload.Path=RealPath '设定上传的目录objupload.Upload '调用UPload方法,获取表单中提交的所有数据 filevalue=objUpload.Form("FileName") '获取文件名filename=objUpload.filename("FileName")fieldvalue=objUpload.Form("fieldname") '取得fieldname表单项的值'response.write filename'response.endif trim(filename)="" thenfilename="no_pro_img.gif" '指向一个“无产品”的图片elseextendname=right(filename,3)if extendname="jpg" or extendname="gif" thenabcd=1elseresponse.write "错误!请输入图片的扩展名gif或jpg"response.endend ifvarfilename=FileNameobjUpload.Save "FileName",2,varfilename' 这里使用单独保存的方法:' "FileName" 是HTML的表单上传FILE名称,本例就是' 2代表覆盖,如果在SAVE之前,先调用文件组件判断此目录下是否有同名文件则不会出现覆盖' 现象,或者保证新文件名为唯一标识' "aaFAN.gif" 是我们上传后修改的文件名。'objUpload.SaveAllend ifend ifresponse.write "上传文件成功!" & "你上传的产品名称为:" & fieldvalue & " 文件名为:" & filename & ""%>如果问题还未能解决,请联系售后技术支持。      
2019-12-01 23:21:59 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 邮件组件CDONTS 功能简介ASP本身没有发送邮件的能力,但如果希望用ASP来发送E-MAIL(例如:你有一个消息,希望在此页被访问后自动将该消息E-MAIL给留言的上网者),那么你需要安装一个ASP组件。并借助这些组件来帮你实现邮件的自动发送、回复等工作,我们可以提供CDONTS组件。CDONTS.DLL 在注册之后,可以使用ASP发送E-MAIL,来实现动态的EMAIL通信,这经常在定单与电子商务中应用。在IIS5下,可以使用CDONTS。它容易使用的并且性能良好。步骤如下:1、检查你是否安装了SMTP服务。OPTION PACK 缺省安装时是包括SMTP服务的。SMTP服务安装后,在 的system32目下会有一个文件叫CDONTS.DLL。2、你可以用下面的简单脚本通过ASP发送E-MAIL  set newmail=server.CreateObject("cdonts.newmail")newmail.From="webmaster@www.yourdomain.com"newmail.To ="test@test.com"newmail.Subject="主题"newmail.Body = "asp mail"newmail.BodyFormat =0newmail.MailFormat =0newmail.Send  response.write "send ok!"set newmail=nothing3、发送附件CDONTS 的 一 个 常 用 特 性 是 用 来 在 E-MAIL 中 发 送 附 件 。 代 码 也 不 难 写 。CDONTS发信组件注意事项由于万网企业邮局具有反垃圾邮件,包括防伪装邮件功能,因此可能根据发信人来源地址屏蔽了您的网站邮件投递。建议您将发信脚本中发件人地址(From参数)设置为:xxx@www.yourdomain.com,这样可以保证正常投递邮件。文件上传组件Upload功能简介本Upload组件目前只支持单文件上传,可以为任意扩展名,可以在上传后保存名字。上传文件的最大大小为1M,需要在程序中指定上传目录并由我们工程师添加权限。支持上传文件名修改和使用变量文件名。1、 上传界面 产品名称: 上传产品图片 (只能上传gif,jpg文件) 2、 上传程序testup.asp<%If Request.ServerVariables("REQUEST_METHOD") = "POST" ThenVirPath="productimg" 'productimg 是你的站点上的一个存储HTTP上传文件的目录RealPath=Server.MapPath(VirPath) & "\"Set objupload=Server.CreateObject("hichinafso.Upload")objupload.Maxsize=1000000 '设定最大上传值objupload.Path=RealPath '设定上传的目录objupload.Upload '调用UPload方法,获取表单中提交的所有数据 filevalue=objUpload.Form("FileName") '获取文件名filename=objUpload.filename("FileName")fieldvalue=objUpload.Form("fieldname") '取得fieldname表单项的值'response.write filename'response.endif trim(filename)="" thenfilename="no_pro_img.gif" '指向一个“无产品”的图片elseextendname=right(filename,3)if extendname="jpg" or extendname="gif" thenabcd=1elseresponse.write "错误!请输入图片的扩展名gif或jpg"response.endend ifvarfilename=FileNameobjUpload.Save "FileName",2,varfilename' 这里使用单独保存的方法:' "FileName" 是HTML的表单上传FILE名称,本例就是' 2代表覆盖,如果在SAVE之前,先调用文件组件判断此目录下是否有同名文件则不会出现覆盖' 现象,或者保证新文件名为唯一标识' "aaFAN.gif" 是我们上传后修改的文件名。'objUpload.SaveAllend ifend ifresponse.write "上传文件成功!" & "你上传的产品名称为:" & fieldvalue & " 文件名为:" & filename & ""%>如果问题还未能解决,请联系售后技术支持。      
2019-12-01 23:21:59 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 邮件组件CDONTS 功能简介ASP本身没有发送邮件的能力,但如果希望用ASP来发送E-MAIL(例如:你有一个消息,希望在此页被访问后自动将该消息E-MAIL给留言的上网者),那么你需要安装一个ASP组件。并借助这些组件来帮你实现邮件的自动发送、回复等工作,我们可以提供CDONTS组件。CDONTS.DLL 在注册之后,可以使用ASP发送E-MAIL,来实现动态的EMAIL通信,这经常在定单与电子商务中应用。在IIS5下,可以使用CDONTS。它容易使用的并且性能良好。步骤如下:1、检查你是否安装了SMTP服务。OPTION PACK 缺省安装时是包括SMTP服务的。SMTP服务安装后,在 的system32目下会有一个文件叫CDONTS.DLL。2、你可以用下面的简单脚本通过ASP发送E-MAIL  set newmail=server.CreateObject("cdonts.newmail")newmail.From="webmaster@www.yourdomain.com"newmail.To ="test@test.com"newmail.Subject="主题"newmail.Body = "asp mail"newmail.BodyFormat =0newmail.MailFormat =0newmail.Send  response.write "send ok!"set newmail=nothing3、发送附件CDONTS 的 一 个 常 用 特 性 是 用 来 在 E-MAIL 中 发 送 附 件 。 代 码 也 不 难 写 。CDONTS发信组件注意事项由于万网企业邮局具有反垃圾邮件,包括防伪装邮件功能,因此可能根据发信人来源地址屏蔽了您的网站邮件投递。建议您将发信脚本中发件人地址(From参数)设置为:xxx@www.yourdomain.com,这样可以保证正常投递邮件。文件上传组件Upload功能简介本Upload组件目前只支持单文件上传,可以为任意扩展名,可以在上传后保存名字。上传文件的最大大小为1M,需要在程序中指定上传目录并由我们工程师添加权限。支持上传文件名修改和使用变量文件名。1、 上传界面 产品名称: 上传产品图片 (只能上传gif,jpg文件) 2、 上传程序testup.asp<%If Request.ServerVariables("REQUEST_METHOD") = "POST" ThenVirPath="productimg" 'productimg 是你的站点上的一个存储HTTP上传文件的目录RealPath=Server.MapPath(VirPath) & "\"Set objupload=Server.CreateObject("hichinafso.Upload")objupload.Maxsize=1000000 '设定最大上传值objupload.Path=RealPath '设定上传的目录objupload.Upload '调用UPload方法,获取表单中提交的所有数据 filevalue=objUpload.Form("FileName") '获取文件名filename=objUpload.filename("FileName")fieldvalue=objUpload.Form("fieldname") '取得fieldname表单项的值'response.write filename'response.endif trim(filename)="" thenfilename="no_pro_img.gif" '指向一个“无产品”的图片elseextendname=right(filename,3)if extendname="jpg" or extendname="gif" thenabcd=1elseresponse.write "错误!请输入图片的扩展名gif或jpg"response.endend ifvarfilename=FileNameobjUpload.Save "FileName",2,varfilename' 这里使用单独保存的方法:' "FileName" 是HTML的表单上传FILE名称,本例就是' 2代表覆盖,如果在SAVE之前,先调用文件组件判断此目录下是否有同名文件则不会出现覆盖' 现象,或者保证新文件名为唯一标识' "aaFAN.gif" 是我们上传后修改的文件名。'objUpload.SaveAllend ifend ifresponse.write "上传文件成功!" & "你上传的产品名称为:" & fieldvalue & " 文件名为:" & filename & ""%>如果问题还未能解决,请联系售后技术支持。      
2019-12-01 23:22:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 邮件组件CDONTS 功能简介ASP本身没有发送邮件的能力,但如果希望用ASP来发送E-MAIL(例如:你有一个消息,希望在此页被访问后自动将该消息E-MAIL给留言的上网者),那么你需要安装一个ASP组件。并借助这些组件来帮你实现邮件的自动发送、回复等工作,我们可以提供CDONTS组件。CDONTS.DLL 在注册之后,可以使用ASP发送E-MAIL,来实现动态的EMAIL通信,这经常在定单与电子商务中应用。在IIS5下,可以使用CDONTS。它容易使用的并且性能良好。步骤如下:1、检查你是否安装了SMTP服务。OPTION PACK 缺省安装时是包括SMTP服务的。SMTP服务安装后,在 的system32目下会有一个文件叫CDONTS.DLL。2、你可以用下面的简单脚本通过ASP发送E-MAIL  set newmail=server.CreateObject("cdonts.newmail")newmail.From="webmaster@www.yourdomain.com"newmail.To ="test@test.com"newmail.Subject="主题"newmail.Body = "asp mail"newmail.BodyFormat =0newmail.MailFormat =0newmail.Send  response.write "send ok!"set newmail=nothing3、发送附件CDONTS 的 一 个 常 用 特 性 是 用 来 在 E-MAIL 中 发 送 附 件 。 代 码 也 不 难 写 。CDONTS发信组件注意事项由于万网企业邮局具有反垃圾邮件,包括防伪装邮件功能,因此可能根据发信人来源地址屏蔽了您的网站邮件投递。建议您将发信脚本中发件人地址(From参数)设置为:xxx@www.yourdomain.com,这样可以保证正常投递邮件。文件上传组件Upload功能简介本Upload组件目前只支持单文件上传,可以为任意扩展名,可以在上传后保存名字。上传文件的最大大小为1M,需要在程序中指定上传目录并由我们工程师添加权限。支持上传文件名修改和使用变量文件名。1、 上传界面 产品名称: 上传产品图片 (只能上传gif,jpg文件) 2、 上传程序testup.asp<%If Request.ServerVariables("REQUEST_METHOD") = "POST" ThenVirPath="productimg" 'productimg 是你的站点上的一个存储HTTP上传文件的目录RealPath=Server.MapPath(VirPath) & "\"Set objupload=Server.CreateObject("hichinafso.Upload")objupload.Maxsize=1000000 '设定最大上传值objupload.Path=RealPath '设定上传的目录objupload.Upload '调用UPload方法,获取表单中提交的所有数据 filevalue=objUpload.Form("FileName") '获取文件名filename=objUpload.filename("FileName")fieldvalue=objUpload.Form("fieldname") '取得fieldname表单项的值'response.write filename'response.endif trim(filename)="" thenfilename="no_pro_img.gif" '指向一个“无产品”的图片elseextendname=right(filename,3)if extendname="jpg" or extendname="gif" thenabcd=1elseresponse.write "错误!请输入图片的扩展名gif或jpg"response.endend ifvarfilename=FileNameobjUpload.Save "FileName",2,varfilename' 这里使用单独保存的方法:' "FileName" 是HTML的表单上传FILE名称,本例就是' 2代表覆盖,如果在SAVE之前,先调用文件组件判断此目录下是否有同名文件则不会出现覆盖' 现象,或者保证新文件名为唯一标识' "aaFAN.gif" 是我们上传后修改的文件名。'objUpload.SaveAllend ifend ifresponse.write "上传文件成功!" & "你上传的产品名称为:" & fieldvalue & " 文件名为:" & filename & ""%>如果问题还未能解决,请联系售后技术支持。      
2019-12-01 23:21:59 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 邮件组件CDONTS 功能简介ASP本身没有发送邮件的能力,但如果希望用ASP来发送E-MAIL(例如:你有一个消息,希望在此页被访问后自动将该消息E-MAIL给留言的上网者),那么你需要安装一个ASP组件。并借助这些组件来帮你实现邮件的自动发送、回复等工作,我们可以提供CDONTS组件。CDONTS.DLL 在注册之后,可以使用ASP发送E-MAIL,来实现动态的EMAIL通信,这经常在定单与电子商务中应用。在IIS5下,可以使用CDONTS。它容易使用的并且性能良好。步骤如下:1、检查你是否安装了SMTP服务。OPTION PACK 缺省安装时是包括SMTP服务的。SMTP服务安装后,在 的system32目下会有一个文件叫CDONTS.DLL。2、你可以用下面的简单脚本通过ASP发送E-MAIL  set newmail=server.CreateObject("cdonts.newmail")newmail.From="webmaster@www.yourdomain.com"newmail.To ="test@test.com"newmail.Subject="主题"newmail.Body = "asp mail"newmail.BodyFormat =0newmail.MailFormat =0newmail.Send  response.write "send ok!"set newmail=nothing3、发送附件CDONTS 的 一 个 常 用 特 性 是 用 来 在 E-MAIL 中 发 送 附 件 。 代 码 也 不 难 写 。CDONTS发信组件注意事项由于万网企业邮局具有反垃圾邮件,包括防伪装邮件功能,因此可能根据发信人来源地址屏蔽了您的网站邮件投递。建议您将发信脚本中发件人地址(From参数)设置为:xxx@www.yourdomain.com,这样可以保证正常投递邮件。文件上传组件Upload功能简介本Upload组件目前只支持单文件上传,可以为任意扩展名,可以在上传后保存名字。上传文件的最大大小为1M,需要在程序中指定上传目录并由我们工程师添加权限。支持上传文件名修改和使用变量文件名。1、 上传界面 产品名称: 上传产品图片 (只能上传gif,jpg文件) 2、 上传程序testup.asp<%If Request.ServerVariables("REQUEST_METHOD") = "POST" ThenVirPath="productimg" 'productimg 是你的站点上的一个存储HTTP上传文件的目录RealPath=Server.MapPath(VirPath) & "\"Set objupload=Server.CreateObject("hichinafso.Upload")objupload.Maxsize=1000000 '设定最大上传值objupload.Path=RealPath '设定上传的目录objupload.Upload '调用UPload方法,获取表单中提交的所有数据 filevalue=objUpload.Form("FileName") '获取文件名filename=objUpload.filename("FileName")fieldvalue=objUpload.Form("fieldname") '取得fieldname表单项的值'response.write filename'response.endif trim(filename)="" thenfilename="no_pro_img.gif" '指向一个“无产品”的图片elseextendname=right(filename,3)if extendname="jpg" or extendname="gif" thenabcd=1elseresponse.write "错误!请输入图片的扩展名gif或jpg"response.endend ifvarfilename=FileNameobjUpload.Save "FileName",2,varfilename' 这里使用单独保存的方法:' "FileName" 是HTML的表单上传FILE名称,本例就是' 2代表覆盖,如果在SAVE之前,先调用文件组件判断此目录下是否有同名文件则不会出现覆盖' 现象,或者保证新文件名为唯一标识' "aaFAN.gif" 是我们上传后修改的文件名。'objUpload.SaveAllend ifend ifresponse.write "上传文件成功!" & "你上传的产品名称为:" & fieldvalue & " 文件名为:" & filename & ""%>如果问题还未能解决,请联系售后技术支持。      
2019-12-01 23:21:59 0 浏览量 回答数 0

回答

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。 这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。- 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。 Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类。 Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。 Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。 Error 用来指示运行时环境发生的错误。 例如,JVM 内存溢出。一般地,程序不会从错误中恢复。 异常类有两个主要的子类:IOException 类和 RuntimeException 类。 在 Java 内置类中(接下来会说明),有大部分常用检查性和非检查性异常。 Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中。 标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。 Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。 异常 描述 ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。 ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。 IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。 IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 IllegalStateException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 IllegalThreadStateException 线程没有处于请求操作所要求的适当状态时抛出的异常。 IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。 NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 SecurityException 由安全管理器抛出的异常,指示存在安全侵犯。 StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 UnsupportedOperationException 当不支持请求的操作时,抛出该异常。 下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。 异常 描述 ClassNotFoundException 应用程序试图加载类时,找不到相应的类,抛出该异常。 CloneNotSupportedException 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 IllegalAccessException 拒绝访问一个类的时候,抛出该异常。 InstantiationException 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 InterruptedException 一个线程被另一个线程中断,抛出该异常。 NoSuchFieldException 请求的变量不存在 NoSuchMethodException 请求的方法不存在 异常方法 下面的列表是 Throwable 类的主要方法: 序号 方法及说明 1 public String getMessage() 返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。 2 public Throwable getCause() 返回一个Throwable 对象代表异常原因。 3 public String toString() 使用getMessage()的结果返回类的串级名字。 4 public void printStackTrace() 打印toString()结果和栈层次到System.err,即错误输出流。 5 public StackTraceElement [] getStackTrace() 返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。 6 public Throwable fillInStackTrace() 用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。 捕获异常 使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。 try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下: try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 } Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。 如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。 实例 下面的例子中声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常。 ExcepTest.java 文件代码: // 文件名 : ExcepTest.java import java.io.*; public class ExcepTest{ public static void main(String args[]){ try{ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } } 以上代码编译运行输出结果如下: Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the block 多重捕获块 一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。 多重捕获块的语法如下所示: try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型3 异常的变量名3){ // 程序代码 } 上面的代码段包含了 3 个 catch块。 可以在 try 语句后面添加任意数量的 catch 块。 如果保护代码中发生异常,异常被抛给第一个 catch 块。 如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。 如果不匹配,它会被传递给第二个 catch 块。 如此,直到异常被捕获或者通过所有的 catch 块。 实例 该实例展示了怎么使用多重 try/catch。 try { file = new FileInputStream(fileName); x = (byte) file.read(); } catch(FileNotFoundException f) { // Not valid! f.printStackTrace(); return -1; } catch(IOException i) { i.printStackTrace(); return -1; } throws/throw 关键字: 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。 也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。 下面方法的声明抛出一个 RemoteException 异常: import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition } 一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。 例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException: import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition } finally关键字 finally 关键字用来创建在 try 代码块后面执行的代码块。 无论是否发生异常,finally 代码块中的代码总会被执行。 在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。 finally 代码块出现在 catch 代码块最后,语法如下: try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 } 实例 ExcepTest.java 文件代码: public class ExcepTest{ public static void main(String args[]){ int a[] = new int[2]; try{ System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } finally{ a[0] = 6; System.out.println("First element value: " +a[0]); System.out.println("The finally statement is executed"); } } } 以上实例编译运行结果如下: Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 First element value: 6 The finally statement is executed 注意下面事项: catch 不能独立于 try 存在。 在 try/catch 后面添加 finally 块并非强制性要求的。 try 代码后不能既没 catch 块也没 finally 块。 try, catch, finally 块之间不能添加任何代码。 声明自定义异常 在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。 所有异常都必须是 Throwable 的子类。 如果希望写一个检查性异常类,则需要继承 Exception 类。 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。 可以像下面这样定义自己的异常类: class MyException extends Exception{ } 只继承Exception 类来创建的异常类是检查性异常类。 下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。 一个异常类和其它任何类一样,包含有变量和方法。 实例 以下实例是一个银行账户的模拟,通过银行卡的号码完成识别,可以进行存钱和取钱的操作。 InsufficientFundsException.java 文件代码: // 文件名InsufficientFundsException.java import java.io.*; //自定义异常类,继承Exception类 public class InsufficientFundsException extends Exception { //此处的amount用来储存当出现异常(取出钱多于余额时)所缺乏的钱 private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } } 为了展示如何使用我们自定义的异常类, 在下面的 CheckingAccount 类中包含一个 withdraw() 方法抛出一个 InsufficientFundsException 异常。 CheckingAccount.java 文件代码: // 文件名称 CheckingAccount.java import java.io.*; //此类模拟银行账户 public class CheckingAccount { //balance为余额,number为卡号 private double balance; private int number; public CheckingAccount(int number) { this.number = number; } //方法:存钱 public void deposit(double amount) { balance += amount; } //方法:取钱 public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; } else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } //方法:返回余额 public double getBalance() { return balance; } //方法:返回卡号 public int getNumber() { return number; } } 下面的 BankDemo 程序示范了如何调用 CheckingAccount 类的 deposit() 和 withdraw() 方法。 BankDemo.java 文件代码: //文件名称 BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); }catch(InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } } 编译上面三个文件,并运行程序 BankDemo,得到结果如下所示: Depositing $500... Withdrawing $100... Withdrawing $600... Sorry, but you are short $200.0 InsufficientFundsException at CheckingAccount.withdraw(CheckingAccount.java:25) at BankDemo.main(BankDemo.java:13) 通用异常 在Java中定义了两种类型的异常和错误。 JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。 程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。
游客2q7uranxketok 2021-02-07 20:08:10 0 浏览量 回答数 0

问题

OSS同步工具,首发,用于本地磁盘或目录同到阿里云OSS

OSS同步工具,用于本地磁盘或目录同到阿里云OSS 跨平台首发,兼容window和linux 你可以使用本程序于商业,但请保留作者名字 本程序分为精简版 和  完整版 1&...
mingge322 2019-12-01 21:59:14 8045 浏览量 回答数 4

问题

Java基础测试题|挑战你的底线

1、填空题 1、Java源程序文件的后缀是_____,Java字节码文件的后缀名称是_____。 2、Java程序实现可移值性,依靠的是_____。 3、Java语言的三个分支是:_____。...
游客pklijor6gytpx 2019-12-01 22:01:00 2559 浏览量 回答数 3

问题

消息服务的日志导出工具是什么?

提供日志导出功能,将保存在OSS的日志导出到阿里云日志服务进行查询、分析。 环境依赖 此工具适用于Python 2.6/2.7 版本,Windows平台和Linux平台均可使用。 使用帮助 1...
轩墨 2019-12-01 22:10:45 1534 浏览量 回答数 0

回答

http://blog.csdn.net/zdy0_2004/article/details/462881831.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件。在日志文件中存放程序流程中的一些重要信息,包括:变量名称及其值、消息结构定义、函数返回值及其执行情况、脚本执行及调用情况等。通过阅读日志文件,我们能够较快地跟踪程序流程,并发现程序问题。因此,熟练掌握日志系统的编写方法并快速地阅读日志文件,是对一个软件开发工程师的基本要求。 本文详细地介绍了Linux下一个简单的日志系统的设计方法,并给出了其C代码实现。本文为相关开发项目Linux下软件日志系统的编写提供了有益的参考。2.日志系统的框架结构 一个完整的日志系统包括三大部分:配置文件、软件程序和日志文件,它们之间的关系如图1所示。 3.生成日志文件的程序流程 基于日志系统的框架结构,生成日志文件的程序流程如图2所示。 图2 生成日志文件的程序流程 在实际的软件程序中,为了在程序的不同地方打印不同的日志,要将生成日志的代码封装为函数,作为API供程序调用。 如果软件没有成功生成日志,那么就不要让其继续执行后续流程,而是要查找问题的原因,直到日志生成正常为止。4.日志文件命名及日志信息格式 对于日志文件的命名,不同的软件开发项目有不同的规定。一般说来,日志文件都是以log作为后缀,如本文中的日志文件命名为:WriteLog.log。 对于每条日志信息的格式,对于不同的软件来说,也会有所不同。在本文中,日志信息的格式有以下两种(具体使用哪一种通过配置项决定): 第一种:日志生成时间函数名[日志等级]日志具体信息 第二种:日志生成时间日志具体信息5.配置文件说明 本文中使用的配置文件为Config.ini,它包括了两部分信息,如下所示:其中,“EMPLOYEEINFO”段是指员工信息,包含员工姓名和员工年龄两个配置项。程序会将员工姓名和员工年龄读入,并输出到日志文件中。 “LOG”段是指日志信息,包含日志等级、日志代码位置标识和输出日志文件的目录三个配置项。对于“LogLevel”配置项,只有代码中日志等级不低于配置值的日志信息才会被输出到日志文件中(例如,LogLevel=4,那么只有Fatal、Error、Warn、Info和Trace等级的日志会被输出到日志文件中)。“LogPosition”配置项的值用于控制是否在日志文件中显示“文件名/函数名/代码行数”信息,1则显示,0则不显示。“LogDir”配置项的值表示生成的日志文件存放的目录。6.重要程序流程 (1) 从配置文件中读取各个配置项的值 该操作的流程如图3所示,具体请参见《Linux下配置文件读取操作流程及其C代码实现》(http://blog.csdn.net/zhouzhaoxiong1227/article/details/45563263)一文。 图4 向日志文件中写入日志信息程序流程该流程的具体代码请参考本文附录中的完整程序代码中的WriteLogFile函数。7.程序测试设计及文件上传 为了测试本日志系统的功能是否正确,在main函数中设计了以下三类日志信息: 第一类:打印程序的版本号及编译时间。 第二类:打印Fatal、Error、Warn、Info、Trace、Debug、All这七个等级的日志各一条。 第三类:调用GetEmployeeInfo函数打印读取到的员工姓名和年龄。将本程序“WriteLog.c”上传到Linux的“/home/zhou/zhouzx/test”目录下,并在该目录下建立“etc”和“log”目录,将配置文件“Config.ini”上传到“etc”下。文件及目录布局如图5所示。 图5 文件及目录布局8.代码编译及运行 在Linux下使用“gcc -g -o WriteLog WriteLog.c”命令对程序进行编译,生成“WriteLog”文件。 下面来运行程序。 (1) 将配置文件中的各个配置项的值设置如下:对照配置文件和日志文件,我们可以看到,“LogLevel”设置的是为4,因此只有日志等级不低于4的日志被输出到了日志文件中;“LogPosition”设置的是为0,因此在日志文件中不显示“文件名/函数名/代码行数”的信息。为了验证本日志系统功能的正常与否,要对程序进行多组测试,9.总结 本文对Linux下一个简单的日志系统的设计方法进行了详细的介绍(其C代码实现请见附录),代码中的写日志相关函数可作为API供其它需要进行类似操作的程序调用。在使用本日志系统的过程中,有以下注意事项: 第一,配置文件中“LOG”段只包括了日志等级、日志代码位置标识和输出日志文件的目录三个配置项。在实际的软件开发项目中,还会有更多的配置参数,像存放的日志文件的最大个数、每个日志文件的大小阈值、每个已写入完成的日志文件的命名等。可以在本程序的基础上进一步扩展来实现复杂的日志功能。 第二,本文中对日志信息的写入采用的是直接在日志文件后面追加的方式,因此每次测试之前,要在“log”目录下删除上一次产生的“WriteLog.log”文件,否则新的日志信息会写入旧的日志文件中。 第三,由于写日志函数WriteLogFile的入参较多,每次调用的时候编写代码较为繁琐,因此使用一个宏WRITELOGFILE来代替,且只需要带上日志等级和日志消息两个参数即可,其它的如代码文件名、函数名和代码行数直接使用系统自定义的宏即可。附录:完整的程序代码
杨冬芳 2019-12-02 03:06:27 0 浏览量 回答数 0

回答

如何掌握牢靠Go语言的容器? 容器相对来说更偏重细节一些,如果想掌握的更牢靠的话呢,还是要多看一下代码,重点给大家几个提示 Go语言的并发初步有哪两个特别重要的特点? **GO语言的协程并发操作或者说协程的资源池,其调度策略有两个: ** 1、没有优先级,没有API能设置优先级,正是因为它一切都是靠Go语言自身的一个调度器来听调度,才能保证它的高效率,这点非常重要。 2、调度的策略是可抢占的,假如说一个任务它长时间的占用CPU,那么它是有可能被购入天的这个调度器给其抢占过来,让其其的任务来做运行,这是两个最重要的特点。 GO语言调度的单元goroutine的应用场景是什么? 使用JAVA或者C编写网络程序时,一个线程来处理一个http请求, 但是对于资源的利用率不高。而Go语言实现了轻量级线程的机制,GO语言在底层封装了所有的系统调用,自己实现了一个调度器,这种设计在操作系统的代码中非常多见。比如现代的操作系统基本都会封装一个软件的Timer,同时可以提供上万个软Timer同时工作,而这只是基于数量很少的硬件timer实现的,而GO语言中的并发也是如此,他是基于线程的调度池,这种调度的单元在Go语言中被称为goroutine。 GO语言与其它并发模型最大的区别是什么? 宏观GO语言与其它并发模型最大的不同,就是其推荐使用通信的这种方式来替代共享内存。当资源需要在goroutine之间进行共享的时候,实际上就是这个资源,或者说这个信息通过通道在goroutine之间进行通信的过程。因为这个锁,一般来说都是用在这个共享内存当中的,因为如果说大家阅读GO语言的相关代码,就可以看到这个channel,它实际上是基于锁来保证并发安全。 然而,这也不代表GO语言当中只能使用channel来进行一些操作,其也具备锁这方面的知识。因为现实当中,这个锁还是有一定它现实的意义和现实的要求,因为这个锁它最关键的一个意义就是它能保证资源能在并发的操作当中有一个合理的调度情况和调度策略。其中跟这个最重要,或者说最关联性最强的一个概念就是原子操作。 GO语言中的原子操作具体实现过程是怎样的? 对于原子操作,在其逻辑下,按照它书面的定义上来讲,是指不会被调度器打断的操作。对原子操作实际上就是不存在中间状态的一种操作,要不就全成功,要不全失败,这个在我们在用并发方式来调动某任务,或者说来设计某种并发系统的情况下,这种名字操作我发现是非常重要的设计理念之一。 并发与并行具体概念及实际区分是怎样的? 有一个比较重要的一个概念,就是并发与并行,其实并发与并行,它实际上具体的含义是不一样的,并发实际上是把任务在不同的时间点交给同样一个处理器来进行处理,在同一个时间点,任务不会同时进行,只是任务感觉自己正在执行,因为其那会儿可能正在堵塞状态或者说是就绪状态,其不知道自己被暂停了,以为已经被调度走了,可能自己没有感知,但是实际上CPU所有权已经不在这个任务身上了。 并行比并发更高级一些,它实际上是把每个任务都交给独立的处理器去进行完成,但同一时间点,任务在一定程度上实际上是同时在执行的。一般来说,并发的性能是要比并行更重要一些,在1.5版本之前,我们需要人工去设置GO调度器最多能运行在多少个CPU上,但是在最新的GO版本当中,已经不需要这个相关的操作。 详细介绍一下并发程序中的竞争态? 并发系统设计最初始的这一个概念就是并发程序设计当中一个竞合的概念,或者也叫竞争态。假如说我要记录一个文件的阅读量,但是这个文件或者说这个网页,可能它的阅读渠道有非常多,有可能通过引擎通过微信通过APP等等这些渠道,这些渠道的话呢,它的阅读也都是并发的,这就会涉及到同样一个变量,被多个协程的所共同访问的情况。具体代码如下: 对于GO语言并发体系中的主推的通信机制是什么? channel是GO语言并发体系中的主推的通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写为 chan int。 GO语言当中,它实际上是大家协同的机制,通过这种方式让几个goroutine之间做达到一个协调的效果,那么每个goroutine当中,实际上channel都是一个特殊的类型,它实际上是可以发送数据。比如现在想发送一个int类型的数据,那么channel就要定义一个发送int数据的一个管道。 那么GO语言当中,提倡使用通讯的方式来代替共享内存的方式来做goroutine,或者说并发之间的一个协同。channel如果我们后续阅读它的代码就会知道,它是保证协程安全,并且它遵循这个先入先出的原则来让这个储蓄方读取获得数据,而且它能保证顺序,正是这两个特性,可以让这个channel替代共享内存,因为它的如果顺序有所改变的话,它实际上也是有会有问题。 详细介绍GO语言中关于通道的声明涉及哪些方面? 1.经典方式声明 通过使用chan类型,其声明方式如下: var name chan type 其中type表示通道内的数据类型;name:通道的变量名称,不过这样创建的通道只是空值 nil,一般来说都是通道都是通过make函数创建的。 2.make方式 make函数可以创建通道格式如下: name := make(chan type) 3.创建带有缓冲的通道 后面会讲到缓冲通道的概念,这里先说他的定义方式 name := make(chan type, size) 其中type表示通道内的数据类型;name:通道的变量名称,size代表缓冲的长度。 具体介绍通道数据收发的详细过程有哪些? 通道的数据发送 通道当中发送数据的操作服务是这样的这样的一个大于号加上一个减号。 chan <- value 注意,如果是发送给一个没有缓冲的一个通道。假如说数据没有被接收的话,那么这个发送操作将持续被注册,也就是说就是channel这个语句就直接被注册到这,假如说没有任何的协程去读到他或者其他语句去读到这个产品,那么这个语句就被注册掉了。但GO语言是能发现的,如果其一直在堵塞的话,那实际上就造成死锁,GO语言的编译器实际上能发现的有点错误。 假如说,首先创建一个int型的通道,然后直接尝试发送一个数据给它,编译会报错,然后呢,数据的这个数据的接收的话,实际上就是把这个点号的位置跟那个大于号的位置做了一个调换。其实把这个双方的位置做了一个调换之后,是实际上就是都做了一个允许的操作。这其中的话呢,还有一种比较特殊的一个读取操作是其可以忽略到接收到的数据,因为不管管道中发出的数据,如果没读的话就堵塞到这,那么如果你觉得这个语句你也不需要,那么你可以把那个变量给它忽略掉。 2.通道的数据接收 通道接收数据的操作符也是<-,具体有以下几种方式 - 1) 阻塞接收数据 阻塞模式接收数据时,将接收变量作为<-操作符的左值,格式如下: data := <-ch 执行该语句时将会阻塞,直到接收到数据并赋值给 data 变量。 如需要忽略接收的数据,则将data变量省略,具体格式如下: <-ch - 2) 非阻塞接收数据 使用非阻塞方式从通道接收数据时,语句不会发生阻塞,格式如下: data, ok := <-ch 非阻塞的通道接收方法可能造成高的 CPU 占用,因此使用非常少。一般只配合select语句配合定时器做超时检测时使用。 关于通道数据收发有哪些需要注意的事项? 通道数据在进行输入收发的时候,必须要在两个不同的goroutine当中进行,因在同一个goroutine当中,收发的这些语句实际上都是堵塞的,你可能在同一个goroutine当中,它的这个函数已经在那边阻塞住了,或者说程序已经在那边阻塞住了,它已经停在那了,你后面有一句你能执行不到,所以说通道的收发必须在两个不同的goroutine之间来进行,在同一个goroutine之间的这个收发操作的话,实际上是没有意义的。 接收将持续堵塞,直到发送方发送出去,如果接收方接收,然后通道中没有发送方数据时,接收方也会发送,直到发送方到发送数据为止。就是刚才说的这个一体两面,这个发送方假如说没有人读的话,发送方会堵塞,假如说没有人写的话,那么接收方也会发生堵塞,这两边实际上都会有一个堵塞的情况。那么这个通道的收发的话呢,一般来说一次只能收一一个元素,假如说这个是一个有缓冲的一个通道,我通过一次不操作的话,实际上也只不过读出一个元素。不能把它一些缓冲区所有元素都读出来。 聊一下生产者消费者模式具体内容有哪些? 介绍一下生产者消费者模式,从GO语言的这个并发模型来看,也就是说假如说咱们站在一个比较高的一个高度来看,其实利用channel的确能达到共享内存的目的。这个channel的性质与在读写状态且保证顺序的共享内存并无不同。甚至我们可以说这个是基于消息队列的封装程度可以比共享内存来的更安全,所以说呢,这个在这个GO语言当中,或者说在GO语言的这个设计风格当中的话呢,其这个生产者消费者模式实现起来会相对来说比较简单一些。我们先介绍一下什么是生产者消费者。 就这个这这张图当中的话呢,就是一个典型的那种消费的问题, 就是说我是生产者的话我会生产一些产品,然后放到这个仓库当中,消费者的话会从那个仓库当中去取商品,这个可以说是消息队列,还有包括卡夫卡那些比较经典的相应队列当中,都会用到的这么一个设计模式,或者说其们从本质上来说的话,都是基于这样一个设计模式,交易的生产者是谁?消费者是谁?这个消息队列的话是。这个生产者消费者模式的话呢,实际上也成为有缓冲有限缓冲问题,它是一个并发的一个经典的案例,因为我们知道这个商品仓库的库房大小是有限的,也就是说生产者不能无限的去生产商品,一旦这个库房爆掉的话,它是它是必须要中止自己的生产,消费者也是不能无限地获取消息。 假如仓库是空的话,那这个消费者的这个相关的情况也需要被阻塞。那么怎么在这个生产者跟消费者之间保证商品不丢失。这就是生产者与消费者之间最核心的内容。先来看一下这个Java当中生产者消费者的这种实现到底是什么样的。这个可以说是一个最经典的这么样一个实现。这个Java当中是没有channel,那么它只能通过什么呢,只能通过信号量和一个一个log,也就是说一个忽视服务态度,这两个这两个配合信号量和所配合才能共同完成,这样一个生产者消费者这么一个相关的工作。 GO语言并发实战详细过程梳理 在现在这个远程办公的这一个大的背景下,积累了大量重复的文件,因为很可能大家都不断的在不同的群里发相同的文件,发相同的这个报表,以及一些相同的视频等等这些需要学习的材料,那么怎么把这些文件都找出来,然后把这些相同文件都给删掉了,这实际上是并发课的一个实践的一个内容,因为这个创业型的这个方案的话,它的代码相对来说比较长。 如何使用GO语言清理PC机中的文件,详细代码及注释如下: package main import ( // "fmt" // fmt 包使用函数实现 I/O 格式化(类似于 C 的 printf 和 scanf 的函数), 格式化参数源自C,但更简单 "io/ioutil" //"sync" //"time" ) func PrintRepreatFile(path string, fileNameSizeMap map[string]int64, exFileList []string) { fs, _ := ioutil.ReadDir(path) for _, file := range fs { if file.IsDir() { PrintRepreatFile(path+"/"+file.Name(), fileNameSizeMap, exFileList)//遍历整个文件系统,如果是目录则递归调用 } else { if file.Size() > 1000000 {//设定文件清理阈值,如果大于一定大小再进行清理 fileSize := fileNameSizeMap[file.Name()]//通过查哈希表的方式来确定,有无重名且大小相同的文件。 if fileSize == file.Size() { fmt.Println(path + "/" + file.Name())//如果有则打印出来 exFileList = append(exFileList, path+file.Name())//将结果记入切片当中 } else { fileNameSizeMap[file.Name()] = file.Size() } } } } } func main() { //方式一 fileNameSizeMap := make(map[string]int64, 10000) exFileList := make([]string, 100, 1000) PrintRepreatFile("E:/test", fileNameSizeMap, exFileList) } 这个程序在GO语言的环境下可以直接运行使用,其中有几个知识点,也是咱们前文提到过的,首先是切片的大小一定要设定的相对合适一些,如果容量不够大造成频繁扩容非常浪费资源。二是哈希表也就是map没有并发安全的属于,在我们这个未引入并发的程序中可以使用,如果有并发操作,那么map不再适用了。 可能很多人被GO语言的在并发性能所吸引入坑的,GO语言之父也就是UNIX之父Ken Thompson明显给出了很多建议,根据笔者在操作系统方面的相关经验来看,GO语言设计中经常参考UNIX内核的设计思路。比如硬定时器的数量有限,无法满足系统实际运行需要,所以在内核代码中就会看到基于硬件定时器的软件定时器的方案,而软件定时器的数量可以比硬件定时器多几百倍。 这样的理念明显融合到了 goroutine之中,由于其它编程语言往往直接通过系统级别的线程来实现并发功能,但是这样的方式往往会是大马拉小车,造成系统资源的浪费。因此GO语言封装了所有的系统操作,实现了更加轻量级的协程-goroutine。只要使用关键字(go)就可以启动协程,对比C++、JAVA的多线程并发模型,GO的协程更简单明了。 当然协程之间的消息通信与并发控制也是非常重要的一环。在GO语言借鉴了Message Queue的消息队列机制替代共享内存的方式进行协程间通信,其中管道channel作为基本的数据类型,保证并发时的操作安全。而且管道的引入还带来很多实践中非常实用的功能,比如可以方便实现生产者、消费者等并发设计模式,而这些设计模式在其它使用共享存内存的并发模型中实现起相关功能来非常的繁锁。 在GO语言中在调用函数前加入go 关键字,就能启动一个协程,也就是一个并发,但是我们上面的程序如果把调用方式改为: go PrintRepreatFile("E:/test", fileNameSizeMap, exFileList) 你会发现程序会直接退出,什么都没做,所以GO语言的并发对于初学者来说还是有一定门槛的,比如上例中如果想设计成一个并行的程序,如何让多个协程共同来帮忙找出重复的文件其实还是要费一番周折的。
剑曼红尘 2020-04-13 11:06:46 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT