文章推荐

Java 反斜杠如何转义的问题

Java 反斜杠如何转义的问题

引用 说明:有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为“/”;反斜杠的符号为“\” 引用 斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符‘/’; 反斜杠(\)则不然,它和紧跟着它的那个字符构成转义字符,如“\n”(表示换行)、“\””(表示字符‘”’)等,所以在字符串中要表示字符'\'要用“\\”来表示,例:如果你这样定义一个字符串String s = “name\sex”是错误的,要这样定义String s = “name\\sex”; 引用 注意:在正则表达式中的“\\”表示和后面紧跟着的那个字符构成一个转义字符(姑且先这样命名),代表着特殊的意义;所以如果你要在正则表达式中表示一个反斜杠\,应当写成“\\\\”。如果你这样获得一个Matcher,Matcher m = Pattern.compile(“\\”).matcher(“\\”)将会报错,你应当这样写Matcher m = Pattern.compile(“\\\\”).matcher(“\\”)才是正确且匹配的 引用 接下来我们来看一下String类中replace(CharSequence target,CharSequence replacement)方法与replaceAll(String regex, String replacement)方法的区别: 我们先看一个例子: public static void main(String[] arg) throws OgnlException { String s ="sdf\\a\\aa"; //把s中的反斜杠\ 替换为\\ System.out.println(s); System.out.println(s.replaceAll("\\\\", "\\\\\\\\")); System.out.println(s.replace("\\", "\\\\")); } 引用 可以看出上面两种都返回相同的替换结果。 这 里的关键是String.replaceAll()是用regular expression 来作为参数的。但是java本身的字符串对于转义符\也有类似的处理。首先,java会把“\\\\”解释成一个字符串(其中包含两个char)。接下来,由于replaceAll是以正则表达式作为参数,所以“\\”被解释成一个regex。对于一个regex来说这就代表着一个字符,就是“\”。对后面的那个8个\来说,最终会被解释成“\\”。 换言之,假设String.replaceAll()是以普通字符串,而不是regex作为参数,那么这样写代码: String target = source.replaceAll('\\', '\\\\'); 就可以了。

... 时间:2017-08-02 分类:java 阅读全文

关于 Java 9 你所需要知道的一切

关于 Java 9 你所需要知道的一切

Java SE 9 搭载了模块化、REPL、编译器优化以及很多其他功能,一直以来 Java 的版本命名和发布周期也将发生重大变化。     Java 9 - 正式的名称是 Java 平台标准版版本号 9 - 终于发布了,Java 开发工具包(JDK) 也已经可供开发者下载。 新版本增加了几个重要且富有争议的功能,同时它也是一直以来遵循 Java 版本命名规范和发布周期的最后一个版本。 Java EE 8 也已经发布,详情可以参考以下的这两篇文章: 新版本企业 Java 带来哪些变化:https://www.infoworld.com/article/3226777/java/java-ee-8-is-here-what-you-need-to-know.html#tk.ifw-infsb Kotlin 是什么?详解 Java 的替代者:https://www.infoworld.com/article/3224868/java/what-is-kotlin-the-java-alternative-explained.html#tk.ifw-infsb) 下载 Java 9 JDK JDK 9 套件下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle 发布的 JDK 9 GA 博文:http://jdk.java.net/9/。 Java 9 的关键新特性 在 Java SE 8 发布将近三年后,Java SE 9 终于发布,它带来几个重大的架构变化,以及一系列的改进。 Java 9 的模块化是颠覆性 基于 Jigsaw 项目,这个新的富有争议性的模块化能力肯定会引来最前沿 Java 开发者的兴趣和尝试,即使会有更保守的开发者决定等待模块化的成熟。 模块化-以 Java 平台模块系统的形式-将 JDK 分成一组模块,可以在运行时,编译时或者构建时进行组合。模块化被称为一个“可传递”的更改,它支持对模块间依赖的理解。 Java 9 的模块化能让开发者更容易的组合和维护复杂的应用程序。同时,它也使 Java 在改进安全和性能的同时能够更好的适配到更小的设备中。 Java 9 的模块化包含应用打包,JDK 自身模块化,以及将源码重新组织成多个模块。构建系统在构建时编译模块和识别模块边界的能力也得到增强。JDK 和 Java 运行时环境(JRE)的镜像经过重构以处理模块化。另外,JavaFX UI 控件和 CSS APIs 现在也支持模块化方式访问。 Java 9 支持很多配置,因此,可伸缩性,安全性和应用程序性能应该得到改善。让 Java 更容易适配到小型设备中是模块化的关键推动力。 通过模块化,开发者将能够更好的使用 Java SE(标准版本) 和 Java EE(企业版本) 构建和维护函数库和大型应用。但在 Java 9 开发期间,Oracle,IBM,Red Hat 和其他公司关于如何在 Java 平台实施这样的重大改动有很大的分歧。模块化系统本身在五月份被否决,取得一定进展后,在六月份第二次投票中才获得批准。 即使主要的 Java 供应商之间已经取得了一致,但关于模块化能给 Java 开发者带来多大好处,专家们褒贬不一。无论如何,Java 9 现在已经支持模块化了。 为了更容易的将代码迁移到模块化的 Java 9,Java 9 允许开发者对类路径中的代码进行非法的反射访问,这一能力被 JRE 用来搜索类和资源文件,当然,这个能力在 Java 9 之后将会禁用。 改进的 Java 9 代码编译 Java 9 的升级带来了几个代码编译的新功能,其中最主要的是 AoT(ahead-of-time)编译。虽然仍处于试验阶段,但这个功能使得 Java 应用在被虚拟机启动之前能够先将 Java 类编译为原生代码。此功能旨在改进小型和大型应用程序的启动时间,同时对峰值性能的影响很小。 JIT(Just-in-time)编译器速度很快,但是 Java 项目现在变得很大很复杂,因此 JIT 编译器需要花费较长时间才能热身完,而且有些 Java 方法还没法编译,性能方面也会下降。AoT 编译就是为了解决这些问题而生的。 但是 Java 技术供应商 Excelsior 的营销总监 Dmitry Leskov 担心 AoT 编译技术不够成熟,希望 Oracle 能够等到 Java 10 时有个更稳定版本才发布。 Java 9 同时还提供了 Oracle 智能编译部署的阶段二功能。这个功能包括改进了 s javac 工具的稳定性和可移植性,从而能够被 JVM 默认使用。这个工具也将会做得更通用,从而可以使用在除 JDK 之外的其他大型项目中。JDK 9 还更新了 javac 编译器以便能够将 java 9 代码编译运行在低版本 Java 中。 另一个新的同时也是试验性的功能是 JVMCI(Java-level JVM Compiler Interface)。通过这个接口,用 Java 编写的编译器可以被 JVM 当作动态编译器使用。JVMCI 的 API 提供访问虚拟机结构,安装编译过的代码,以及插入 JVM 编译系统中的机制。 使用 Java 编写的 JVM 编译器相比已有的用 C 或者 C++ 编写的编译器,能够在保持高质量的同时更容易维护和改进。因此,使用 Java 编写的编译器本身应该更容易维护和改进。其他使用 Java 编写编译器的尝试包含 Graal 项目和 Metropolis 项目。 新的编译器控制能力旨在为 JVM 编译器提供细粒度和方法上下文相关的控制,让开发者在运行时不降低性能的前提下修改编译器控制选项。这个工具还支持为 JVM 编译器存在的 bug 提供解决方法。 Java 9 终于有了 REPL Java 9 的另一个特性是拥有了 REPL(read-eval-print loop)工具,这是另一个 Java 的长期目标,在 Kulia 项目中经过多年研发后终于在 Java 9 中得以实现。 Java 9 的 REPL 名为 jShell,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。 命令行工具的功能包含 tab 自动补全和自动添加分号。jShell API 支持在 IDE 和其他工具中使用 jShell 功能,虽然这个工具本身不是 IDE。 REPL 的缺失是高校想要把 Java 从学校课程中剔除的一个原因(像 Python 和 Scala 之类的语言早就有 REPL 了)。但 Scala 语言的创始人 Martin Odersky 质疑 Java 中 REPL 的作用,他说 Java 是面向语句的,而 REPL 是面向表达式的。 Java 9 增强了 Steam API Java 的 Steam 让开发者能够快速运算,从而能够有效的利用数据并行计算。Java 8 提供的 Steam 能力能够利用多核架构实现声明式的数据处理。 在 Java 9 中,Stream API 通过新增方法, 实现有限制的从 Stream 中添加或者移除元素,遍历 Stream 中的元素,以及通过扩展 Java SE API 集合实现从空值创建流的功能。 Java 9 支持代码缓存的分割 JDK 9 支持将代码缓存分割成段,从而提高性能并实现扩展功能,例如细粒度锁。由于使用专门的迭代器忽略非方法代码,分离非方法,剖析和非剖析代码,结果扫描时间将得到改进。某些基准的执行时间也得到改进。 通过 Nashorn 项目 Java 9 更好的支持 Javascript Nashorn 项目在 JDK 9 中得到改进,它为 Java 提供轻量级的 Javascript 运行时。Nashorn 项目跟随 Netscape 的 Rhino 项目,目的是为了在 Java 中实现一个高性能但轻量级的 Javascript 运行时。Nashorn 项目使得 Java 应用能够嵌入 Javascript。它在 JDK 8 中为 Java 提供一个 Javascript 引擎。 JDK 9 包含一个用来解析 Nashorn 的 ECMAScript 语法树的 API。这个 API 使得 IDE 和服务端框架不需要依赖 Nashorn 项目的内部实现类,就能够分析 ECMAScript 代码。 Java 9 引入 HTTP/2 客户端 API Java 9 引入了 beta 版的 HTTP/2 客户端 API,升级了 Web 核心 HTTP 协议,这个 API 同时也支持 WebSocket。 HTTP/2 API 可以用来代替 HttpURLConnection API,后者存在一些缺点,包括当初是为现在已经失效的协议所设计,早于 HTTP/1,接口定义太抽象以及使用起来不容易。 Java 9 改进了对 HTML5 和 Unicode 的支持 在 JDK 9 中,Javadoc 文档工具经过增强现在支持生成 HTML5 标记文档。Unicode 8.0 编码标准也得到支持,该标准新增 8000 个字符,10 个块和 6 个脚本。 Java 9 新增 DTLS 安全 API 为了安全,Java 9 新增支持 DTLS(Datagram Transport Layer Security) 的 API。这个协议用来在客户端服务器通信中防止窃听,篡改,消息伪造等。客户端和服务端模式都提供了实现。 Java 9 废弃和移除的 API Java 9 废弃或者移除了几个不常用的功能。其中最主要的是 Applet API,现在是标记为废弃的。随着对安全要求的提高,主流浏览器已经取消对 Java 浏览器插件的支持。HTML5 的出现也进一步加速了它的消亡。开发者现在可以使用像 Java Web Start 这样的技术来代替 Applet,它可以实现从浏览器启动应用程序或者安装应用程序。 同时,appletviewer 工具也被标记为废弃。 Java 9 还废弃了并行标记扫描(CMS,Concurrent Mark Sweep)垃圾回收器,在未来的发布版本中将进一步停止支持。其目的是加速 HotSpot 虚拟机中其他垃圾回收器的发展。低暂停 G1(low-pause G1) 回收器将是 CMS 的长期替代品。 同时,之前在 JDK 8 中废弃的垃圾收集组合在 JDK 9 中已经删除。这包括很少使用的组合,例如增量 CMS,ParNew + SerialOld,DefNew + CMS,这些给垃圾收集器的代码库增加了额外的复杂性。 Java 9 也忽略了 Java 导入语句的警告,以有助于大型代码库维持更干净的 lint 警告。在这些代码库中,废弃的功能通常还需要继续使用一段时间,代码中导入废弃类或者方法,如果是开发者有意为之,并且通过注解抑制这些警告信息,那么警告信息将不会显示出来。 在 Java 9 中同时移除的还有通过 Multiple JRE(mJRE)功能在启动时选择 JRE 版本 的功能。这个功能很少使用,同时使 Java 启动器的实现复杂化,自从在 JDK 5 开始出现以来,一直没有完整的文档描述。 Oracle 已经移除 JVM TI(Tool Interface)hprof(Heap Profiling) 代理,它在 JVM 中已经被代替。jhat 工具也被移除,它早已被更好用的堆栈可视化和分析工具所代替。 Java 9 是当前时间线的终结者,新的时间线从此展开 Java 9 的带来了很多新功能。Oracle 最近透漏 Java 9 将是最后一个遵循 Java 名称命名规范和主版本发布周期的版本。 从现在开始,Java 的计划发布周期是 6 个月,下一个 Java 的主版本将于 2018 年 3 月发布,命名为 Java 18.3,紧接着再过六个月将发布 Java 18.9。 Java 新的发布周期也意味着 JDK 9 将不会被作为长期支持版本。相反,下一个长期支持发布版本是 Java 18.9。 Java 更快的发布周期意味着开发者将不需要像以前一样为主要发布版本望眼欲穿。这也意味着开发者将可能跳过 Java 9 和它的不成熟的模块化功能,只需要再等待 6 个月就可以迎来新版本,这将有可能解决开发者的纠结,Simon Maple 这样说,他是 Java 工具供应商 ZeroTurnaround 的 Java 支持者。 原文:Java 9 is here: Everything you need to know 作者:Paul Krill 译者:顾浩鑫 原文:http://blog.csdn.net/csdnnews/article/details/78109908

Paul Krill 时间:2017-09-28 分类:java se 9 阅读全文

需要学会使用的快捷键

需要学会使用的快捷键

MyEclipse快捷键 alt + shift + j java方法添加注释快捷键 ctrl + / 表示两个斜杠注释 ctrl+shitft+/ 文档注释 alt+/ 提示 Ctrl+Shift+F4 关闭所有打开的Editer F8 一直执行到下一个断点。 Alt+Shift+R 重命名 Alt+/ 代码助手完成一些代码的插入 ,自动显示提示信息 Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+← 前一个编辑的页面 Alt+→ 下一个编辑的页面(当然是针对上面那条来说了) Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性 Ctrl+L 定位在某行 Ctrl+O 快速显示 OutLine Ctrl+W 关闭当前Editer **生成set、get方法的快捷键 shift+alt+s+r** 类注释的快捷键shift+alt+j // 能够添加作者名,是计算机名称 Ctrl+T 搜索当前接口的实现类 Ctrl+M 最大最小化窗口 查找和定位快捷键: Ctrl + Shift + T 查找工作空间workspace构建路径中的可找到Java类文件, 不要为找不到类而痛苦,而且可是使用“*”“?”等通配符 Ctrl + Shift + R 查找文件 Ctrl + Shift + G 查找类、方法和属性的引用,这是一个非常实用的快捷键, 例如修改引用某个方法代码,可以快速定位所有引用此方法的位置。 Ctrl + H 当知道方法名时,可以通过此来查找。 编辑相关快捷键 注释 Ctrl + / 快速修复 Ctrl + 1 删除当前行 Ctrl + d 格式化文档 Ctrl + Shift + f 插入空行 Shift + Enter 编辑窗口最大化 Ctrl + m 显示大纲 Ctrl + o 查看,定位快捷键 查找Java类文件 Ctrl + Shift + T 查找引用 Ctrl+Shift+G 后退历史记录 Alt+ ←、Alt+ → 快速查找选定的内容 Ctrl+K 重构快捷键 重命名 Alt+Shift+R InteliJ IDEA快捷键   一.找文件找代码找引用相关 双击shift 在项目的所有目录查找,就是你想看到你不想看到的和你没想过你能看到的都给你找出来 ctrl+f 当前文件查找特定内容 ctrl+shift+f 当前项目查找包含特定内容的文件 ctrl+n 查找类 ctrl+shift+n 查找文件 ctrl+e 最近的文件 alt+F7 非常非常频繁使用的一个快捷键,可以帮你找到你的函数或者变量或者类的所有引用到的地方 二.编辑相关 shift+enter 另起一行 ctrl+r 当前文件替换特定内容 ctrl+shift+r 当前项目替换特定内容 shift+F6 非常非常省心省力的一个快捷键,可以重命名你的类、方法、变量等等, 而且这个重命名甚至可以选择替换掉注释中的内容 ctrl+d 复制当前行到下一行 ctrl+x 剪切当前行 alt+insert 非常非常以及相当方便的一个组合键       Sublime Text3的快捷键 我把本文出现的Sublime Text按其类型整理在这里,以便查阅。 通用(General) ↑↓←→:上下左右移动光标,注意不是不是KJHL! Alt:调出菜单 Ctrl + Shift + P:调出命令板(Command Palette) Ctrl + `:调出控制台 编辑(Editing) Ctrl + Enter:在当前行下面新增一行然后跳至该行 Ctrl + Shift + Enter:在当前行上面增加一行并跳至该行 Ctrl + ←/→:进行逐词移动 Ctrl + Shift + ←/→进行逐词选择 Ctrl + ↑/↓移动当前显示区域 Ctrl + Shift + ↑/↓移动当前行 选择(Selecting) Ctrl + D:选择当前光标所在的词并高亮该词所有出现的位置,再次Ctrl + D选择该词出现的下一个位置, 在多重选词的过程中,使用Ctrl + K进行跳过,使用Ctrl + U进行回退,使用Esc退出多重编辑 Ctrl + Shift + L:将当前选中区域打散 Ctrl + J:把当前选中区域合并为一行 Ctrl + M:在起始括号和结尾括号间切换 Ctrl + Shift + M:快速选择括号间的内容 Ctrl + Shift + J:快速选择同缩进的内容 Ctrl + Shift + Space:快速选择当前作用域(Scope)的内容 查找&替换(Finding&Replacing) F3:跳至当前关键字下一个位置 Shift + F3:跳到当前关键字上一个位置 Alt + F3:选中当前关键字出现的所有位置 Ctrl + F/H:进行标准查找/替换,之后: Alt + C:切换大小写敏感(Case-sensitive)模式 Alt + W:切换整字匹配(Whole matching)模式 Alt + R:切换正则匹配(Regex matching)模式 Ctrl + Shift + H:替换当前关键字 Ctrl + Alt + Enter:替换所有关键字匹配 Ctrl + Shift + F:多文件搜索&替换 跳转(Jumping) Ctrl + P:跳转到指定文件,输入文件名后可以: @ 符号跳转:输入@symbol跳转到symbol符号所在的位置 # 关键字跳转:输入#keyword跳转到keyword所在的位置 : 行号跳转:输入:12跳转到文件的第12行。 Ctrl + R:跳转到指定符号 Ctrl + G:跳转到指定行号 窗口(Window) Ctrl + Shift + N:创建一个新窗口 Ctrl + N:在当前窗口创建一个新标签 Ctrl + W:关闭当前标签,当窗口内没有标签时会关闭该窗口 Ctrl + Shift + T:恢复刚刚关闭的标签 屏幕(Screen) F11:切换普通全屏 Shift + F11:切换无干扰全屏 Alt + Shift + 2:进行左右分屏 Alt + Shift + 8:进行上下分屏 Alt + Shift + 5:进行上下左右分屏 分屏之后,使用Ctrl + 数字键跳转到指定屏,使用Ctrl + Shift + 数字键将当前屏移动到指定屏 Ctrl+X:删除当前行 Tab 向右缩进。 Shift+Tab 向左缩进 Ctrl+K+U 改为大写 Ctrl+K+L 改为小写  

other 时间:2017-10-12 分类:快捷键 阅读全文

play 内置标签

play 内置标签

标签使用说明 1 标签皆可应用在页面和js代码中 2 使用?.可避免当对象为空时出现NullPointerException导致页面渲染失败 3 取值使用${}格式 ${flash?.errCode}//从flash对象中取值 ${jumpUrl}//action返回页面参数 ${session?.user?.userName}//从session中获取用户名 4 可通过指定全限定类名直接调用静态方法、字段等 ${utils.DateUtils?.getTime()}//通过调用DateUtils中的静态方法获取当前时间 ${utils.DateUtils?.FORMAT_YMD}//获取DateUtils中的字段值 5 闭合标签#{a}首页#{/a},非闭合标签#{input /} 6 注释使用%{注释文本}% 常用标签 a:链接到router表中对应的路由 #{a @Application.index()}首页#{/a} [首页](“@{Application.index()}”) [首页](“application/index”) authenticityToken: 用来生成一个包含token信息的可以放到任何form的隐藏域,用来防止跨站点的请求伪造攻击。后台form提交路由函数中直接调用checkAuthenticity(),校验不通过会跳转到默认的错误页面。 #{authenticityToken /} <input type="hidden" name="authenticityToken" value="1c6d92fed96200347f06b7c5e1a3a28fa258ef7c"> doLayout: 模板继承标签,子元素通过#{extends '父元素相对路径'/}来进行页面的嵌套 <!--父页面文件common/common.html--> <div class="container"> <div class="header">头部</div> <!--此处用来引用子页面,类似jsp中的include标签--> #{doLayout /} <div class="footer">底部</div> </div> extends:继承父标签 <!--子页面front/index.html--> #{extends 'common/common.html' /} <div class="child">子页面内容区</div> if...else:用来在页面中进行逻辑判断,if可单用也可配合使用,可用页面js中 #{if user==null}登录#{/if} #{elseif user!=null && !user?.auther}认证#{/elseif} #{else}登录成功#{/else} list:用来迭代后台集合数据,items指定集合数据,as指定别名 #if{userList!=null && userList.size()>0} #{list items:userList,as:'user'} <tr> <td>${user_index}</td>//本次迭代的索引值 <td>${(page?.currPage - 1)*page?.pageSize+_index}</td>//分页数据中的索引值 <td>${user?.name}</td> ... </tr> #{/list} #{/if} 或者 #if{userList!=null && userList.size()>0} #{list items:userList} <tr> <td>${user_index}</td>//本次迭代的索引值 <td>${(page?.currPage - 1)*page?.pageSize+_index}</td>//分页数据中的索引值 <td>${_?.name}</td> ... </tr> #{/list} #{/if} %{}:代码块,可用来直接编写源代码,可直接在页面通过${}引用 %{utils.DateUtils date = new utils.DateUtils();}% # ${date?.currentTime()?.format('yyyy-MM-dd HH:mm:ss') # ${constants.Constants.money?.format('###,##0.00')} # ${constants.Constants.money?.formatCurrency('CNY')} 输入图片说明 get|set #{set title:'标题'/} #{get 'title'/} @{‘’}:静态资料导入标签 <link href="@{'/public/stylesheets/main.css'}" rel="stylesheet"/> <link href='/public/stylesheets/main.css' rel="stylesheet"/> form:表单 #{form @login(), method:'POST', id:'sub'} #{/form} <form action="/indexaction/login?x-http-method-override=POST" method="post" accept-charset="utf-8" enctype="application/x-www-form-urlencoded" id="sub"> <input type="hidden" name="authenticityToken" value="84aec43e817adbb56496c312236b1e49ad250efd"> </form> include:类似jsp中的include标签 #{include 'Application/index.html'/} 标签内置常用函数 format():格式化日期、金额等 ${money?.format('###,##0.00')} ${money?.formatCurrency('CNY')} ${date?.format('yyyy-MM-dd HH:mm:ss')} raw():以html格式显示 ${content?.raw()} 作者:编程与艺术 链接:http://www.jianshu.com/p/50a7a7909fb1 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

akuma 时间:2017-10-12 分类:play 阅读全文

redis Jedis序列化自定义存储list对象和map数据

redis Jedis序列化自定义存储list对象和map数据

1,redis缓存配置类   package com.redis; import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * Redis Cache * * 暂时只有add, get, returnResource方法;没有delete, flush等方法; * * @author fanht * @date 2017年10月24日 上午10:45:31 * */ public abstract class Cache { protected static Logger logger = Logger.getLogger(Cache.class); private static JedisPool jedisPool = null; private static Jedis jedis = null; /** * 初始化Redis连接池 */ private static void initialPool() { String[] serverArray = { "127.0.0.1", "0" }; for (int i = 0; i < serverArray.length; i++) { try { int timeout = 3000; jedisPool = new JedisPool(new JedisPoolConfig(), serverArray[i], 6379, timeout); break; } catch (Exception e) { logger.error("初始化Redis连接池(" + serverArray[i] + ") 失败 : " + e); } } } /** * 在多线程环境同步初始化 */ private synchronized static void poolInit() { if (jedisPool == null) { initialPool(); } } /** * 同步获取Jedis实例 * * @return Jedis */ private synchronized static Jedis getJedis() { if (jedis == null) { if (jedisPool == null) poolInit(); try { if (jedisPool != null) { jedis = jedisPool.getResource(); // jedis.auth("master"); // 密码 } } catch (Exception e) { logger.error("获取jedis实例失败 : " + e); e.printStackTrace(); } } return jedis; } /** * 释放jedis资源 * * @param jedis */ public static void returnResource(final Jedis jedis) { if (jedis != null && jedisPool != null) { jedisPool.returnResource(jedis); } } /** * 添加缓存 * * @param key * @param value * 可以是String,List,Map 等 */ public static void add(String key, Object value) { getJedis(); try { jedis.set(key.getBytes(), ObjectTranscoder.serialize(value)); } catch (Exception e) { logger.error("添加缓存失败" + e); } } /** * 添加缓存 * * @param key * @param expiration * 3h, 2mn, 2mi, 2min, 7s或组合2d4h10s, 2d3h10s * Pattern.compile("(([0-9]+?)((d|h|mi|min|mn|s)))+?"); * @param value * 可以是String,List,Map 等 */ public static void add(String key, Object value, String expiration) { getJedis(); try { jedis.setex(key.getBytes(), Time.parseDuration(expiration), ObjectTranscoder.serialize(value)); } catch (Exception e) { logger.error("添加过期时间失败 : " + e); } } /** * 获取 * * @param key * @return object */ public static Object get(String key) { if (jedis == null || !jedis.exists(key.getBytes())) { return null; } byte[] in = jedis.get(key.getBytes()); return ObjectTranscoder.deserialize(in); } }     2,序列化工具类   package com.redis; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * @author fanht * @date 2017年10月24日 上午10:46:04 * */ public class ObjectTranscoder { /** * 序列化参数 * @param value object * @return byte */ public static byte[] serialize(Object value) { if (value == null) { throw new NullPointerException("参数不能为空"); } byte[] rv = null; ByteArrayOutputStream bos = null; ObjectOutputStream os = null; try { bos = new ByteArrayOutputStream(); os = new ObjectOutputStream(bos); os.writeObject(value); os.close(); bos.close(); rv = bos.toByteArray(); } catch (IOException e) { throw new IllegalArgumentException("该对象不可序列化", e); } finally { try { if (os != null) os.close(); if (bos != null) bos.close(); } catch (Exception e2) { e2.printStackTrace(); } } return rv; } /** * 反序列化参数 * @param in byte * @return object */ public static Object deserialize(byte[] in) { Object rv = null; ByteArrayInputStream bis = null; ObjectInputStream is = null; try { if (in != null) { bis = new ByteArrayInputStream(in); is = new ObjectInputStream(bis); rv = is.readObject(); is.close(); bis.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (is != null) is.close(); if (bis != null) bis.close(); } catch (Exception e2) { e2.printStackTrace(); } } return rv; } }     3,时间工具类   package com.redis; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author fanht * @date 2017年10月24日 下午4:13:13 * */ public class Time { private static final Pattern p = Pattern.compile("(([0-9]+?)((d|h|mi|min|mn|s)))+?"); private static final Integer MINUTE = 60; private static final Integer HOUR = 60 * MINUTE; private static final Integer DAY = 24 * HOUR; /** * 解析时间 * * @param duration * 3h, 2mn, 2mi, 2min, 7s或组合2d4h10s, 2d3h10s * Pattern.compile("(([0-9]+?)((d|h|mi|min|mn|s)))+?"); * @return 秒数 */ public static int parseDuration(String duration) { if (duration == null) { return 30 * DAY; } Matcher matcher = p.matcher(duration); int seconds = 0; if (!matcher.matches()) { throw new IllegalArgumentException("无效的时间格式 : " + duration); } matcher.reset(); while (matcher.find()) { if (matcher.group(3).equals("d")) { seconds += Integer.parseInt(matcher.group(2)) * DAY; } else if (matcher.group(3).equals("h")) { seconds += Integer.parseInt(matcher.group(2)) * HOUR; } else if (matcher.group(3).equals("mi") || matcher.group(3).equals("min") || matcher.group(3).equals("mn")) { seconds += Integer.parseInt(matcher.group(2)) * MINUTE; } else { seconds += Integer.parseInt(matcher.group(2)); } } return seconds; } }     4,测试类   package com.redis; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author fanht * @date 2017年10月23日 下午6:00:40 * */ public class Main { public static void main(String[] args) throws InterruptedException { // new RedisClient().show(); cache(); } public static <T> void cache() throws InterruptedException { Cache.add("abc", "abc"); System.err.println(Cache.get("abc")); List list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); Cache.add("list", list); List<T> list1 = (List<T>) Cache.get("list"); for (Object obj : list1) { System.err.print(obj); } System.err.println(); Map map = new HashMap<>(); map.put("a", "a"); map.put("b", "b"); map.put("c", "c"); Cache.add("map", map); map = (HashMap) Cache.get("map"); // for (String key : map.keySet()) { System.err.print(map.get("a")); System.err.print(map.get("b")); System.err.print(map.get("c")); System.err.println(); // } // Cache.set("123", "123"); // Cache.set("123", 123); // Cache.set("123", 123L); // Cache.set("123", list); // Cache.set("123", map); Cache.add("test", "test-000001", "1mn10s"); int i = 0; while (true) { i++; Thread.sleep(1000); System.err.println(i + ":" + Cache.get("test")); if (Cache.get("test") == null) break; } } }  

akuma 时间:2017-10-24 分类:redis 阅读全文

新买的车被女朋友刮了该不该让她赔?男子发帖吐槽,没想到“女友”出现了!

新买的车被女朋友刮了该不该让她赔?男子发帖吐槽,没想到“女友”出现了!

  近日,网上有个帖子火了。本来是个求助帖,男主问广大网友自己的新车被女朋友刮擦了该怎么提赔偿,没想到男子口中的“女友”出现在了求助帖的回复区,这下事情不简单了!   新买的车被女朋友刮了 该不该让她赔 楼主 昨天晚上和女朋友出去吃饭,她刚考出驾照,说回家的时候让我把车借她开一下。吃完饭送她回家,快到她家的时候就要和我换,她要自己试试看开回去,我拗不过她只能随她。开回去的路上就一直开的很慢,动不动就刹车,转弯也不打灯,不知道驾驶证怎么拿到的。 到她家楼下,侧方停车,她一个方向盘打得,我的车屁股一下子就擦到了后面那辆车。这辆车我买来也就两个月多点,现在又擦了自己又擦了别人,想让她稍微给点钱补一下,毕竟感觉不能太惯着了,我要怎么跟她说会好一点?     帖子女主回复: 清风独影ABC:渣男!谁是你女朋友了???而且开车是他一定叫我开的!某男别自作多情好吗,解释一下,我和这个男的没有任何关系,就是我朋友介绍给我,说在一个外企当小领导的,满有责任心的,也很上进,比我大几岁,昨天晚上就一起出去吃饭,请我就吃了个味德麻辣烫,我也没说啥,也还行。回家路上,他就说我刚考出驾照,可以带我练一练,我就有点怕,不大好意思,也和他不太熟。他就非得让我开,试试,我没办法就稍微开了一段,侧边停车的时候不小心蹭到了,我也不好意思,他当时就不开心了,说怎么这么猛,看也不看清楚,刚买的车唧唧歪歪的。当时我就道了歉,也觉得蛮对不起他的。 今天突然在版里看到这个帖子,真是个渣男!给你500块修车去吧!拉黑!!!!           我是野山   认证市民 客户端用户 威望: 852 注册时间: 2015-01-07 发私信 关注TA    

嘉兴19楼 时间:2017-11-07 分类:新闻 阅读全文

纯js轻量级图片放大显示插件

纯js轻量级图片放大显示插件

lightense-images是一款可以将缩略图片在屏幕中间放大显示的纯js插件。该图片放大插件的效果类似于Medium.com上的图片放大预览效果。它的特点有: 轻量级,压缩后的版本仅2KB。 点击缩略图后,以lightbox的方式来显示放大图片。 可以自定义背景遮罩层的颜色和透明度。 在页面滚动时自动将大图恢复为缩略图。 使用方法 在页面中引入lightense.js文件。 <script type="text/javascript" src="@{'public/javascripts/lightense.es6'}"></script> 初始化插件 可以使用下面的方法来初始化该图片放大插件。 // 調用图片放大插件 window.addEventListener('load', function () { var el = document.querySelectorAll('img'); Lightense(el); }, false); 你可以为图片元素设置data-background属性来修改背景遮罩层的颜色和透明度。 <img src="${about?.headPicture}" data-background="rgba(0, 10, 45, 0.6)">              得到的效果类型下图: 你也可以在超链接元素中通过data-image属性来指定要打开的图片。 <a class="lightense" data-image="${about?.headPicture}">点击打开图片</a> lightense-images图片放大插件的github地址为:https://github.com/sparanoid/lightense-images

akuma 时间:2017-11-11 分类:html,js 阅读全文

Linux常用命令记录

Linux常用命令记录

应用位置:cd /www/v1.2/ [root@iZ2zeebwkoa6uq5wp3055eZ ~]# cd /www/v1.2/ [root@iZ2zeebwkoa6uq5wp3055eZ v1.2]# ls D:\tmpExcel hcplat_hp01 hcplat_hp02 hcplat_hp03 hcplat_hp04 shutdown.sh startup.sh hcplat_hp01、hcplat_hp02、hcplat_hp03、hcplat_hp04   启动Tomcat: 进入Tomcat,bin目录:cd /www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/bin/ [root@iZ2zeebwkoa6uq5wp3055eZ v1.2]# cd /www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/bin/ [root@iZ2zeebwkoa6uq5wp3055eZ bin]# ls bootstrap.jar commons-daemon.jar digest.bat hs_err_pid24225.log hs_err_pid24295.log shutdown.bat tomcat-native.tar.gz catalina.bat commons-daemon-native.tar.gz digest.sh hs_err_pid24237.log hs_err_pid24305.log shutdown.sh tool-wrapper.bat catalina.sh configtest.bat D:\tmpExcel hs_err_pid24252.log hs_err_pid24316.log startup.bat tool-wrapper.sh catalina.sh.20170329 configtest.sh hs_err_pid24196.log hs_err_pid24268.log setclasspath.bat startup.sh version.bat catalina-tasks.xml daemon.sh hs_err_pid24209.log hs_err_pid24284.log setclasspath.sh tomcat-juli.jar version.sh [root@iZ2zeebwkoa6uq5wp3055eZ bin]# ./startup.sh 启动:./startup.sh 停止Tomcat: 进入Tomcat,bin目录:cd /www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/bin/ 停止:./shutdown.sh   如果上述方法不能停止Tomcat: 搜索hp应用进程:ps -ef|grep hcplat [root@iZ2zeebwkoa6uq5wp3055eZ bin]# ps -ef|grep hcplat root 12133 1 8 Nov10 ? 05:45:49 /www/v1.2/hcplat_hp03/jdk1.8.0_121/jre//bin/java -Djava.util.logging.config.file=/www/v1.2/hcplat_hp03/apache-tomcat-8.0.42/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms2048m -Xmx2048m -Xss1024K -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -verbose:gc -Xloggc:/www/v1.2/hcplat_hp03/monitor/gc.log2017-11-10 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -noclassgc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/www/v1.2/hcplat_hp03/monitor/hp.hump2017-11-10-13-45 -Djava.rmi.server.hostname=10.30.142.7 -Dcom.sun.management.jmxremote.port=8131 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/www/v1.2/hcplat_hp03/apache-tomcat-8.0.42/endorsed -classpath /www/v1.2/hcplat_hp03/apache-tomcat-8.0.42/bin/bootstrap.jar:/www/v1.2/hcplat_hp03/apache-tomcat-8.0.42/bin/tomcat-juli.jar -Dcatalina.base=/www/v1.2/hcplat_hp03/apache-tomcat-8.0.42 -Dcatalina.home=/www/v1.2/hcplat_hp03/apache-tomcat-8.0.42 -Djava.io.tmpdir=/www/v1.2/hcplat_hp03/apache-tomcat-8.0.42/temp org.apache.catalina.startup.Bootstrap start root 19557 1 7 Nov03 ? 18:03:06 /www/v1.2/hcplat_hp02/jdk1.8.0_121/jre//bin/java -Djava.util.logging.config.file=/www/v1.2/hcplat_hp02/apache-tomcat-8.0.42/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms2048m -Xmx2048m -Xss1024K -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -verbose:gc -Xloggc:/www/v1.2/hcplat_hp02/monitor/gc.log2017-11-03 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -noclassgc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/www/v1.2/hcplat_hp02/monitor/hp.hump2017-11-03-17-40 -Djava.rmi.server.hostname=10.30.142.7 -Dcom.sun.management.jmxremote.port=8121 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/www/v1.2/hcplat_hp02/apache-tomcat-8.0.42/endorsed -classpath /www/v1.2/hcplat_hp02/apache-tomcat-8.0.42/bin/bootstrap.jar:/www/v1.2/hcplat_hp02/apache-tomcat-8.0.42/bin/tomcat-juli.jar -Dcatalina.base=/www/v1.2/hcplat_hp02/apache-tomcat-8.0.42 -Dcatalina.home=/www/v1.2/hcplat_hp02/apache-tomcat-8.0.42 -Djava.io.tmpdir=/www/v1.2/hcplat_hp02/apache-tomcat-8.0.42/temp org.apache.catalina.startup.Bootstrap start root 19668 1 8 Nov03 ? 19:33:40 /www/v1.2/hcplat_hp04/jdk1.8.0_121/jre//bin/java -Djava.util.logging.config.file=/www/v1.2/hcplat_hp04/apache-tomcat-8.0.42/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms2048m -Xmx2048m -Xss1024K -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -verbose:gc -Xloggc:/www/v1.2/hcplat_hp04/monitor/gc.log2017-11-03 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -noclassgc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/www/v1.2/hcplat_hp04/monitor/hp.hump2017-11-03-17-40 -Djava.rmi.server.hostname=10.30.142.7 -Dcom.sun.management.jmxremote.port=8141 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/www/v1.2/hcplat_hp04/apache-tomcat-8.0.42/endorsed -classpath /www/v1.2/hcplat_hp04/apache-tomcat-8.0.42/bin/bootstrap.jar:/www/v1.2/hcplat_hp04/apache-tomcat-8.0.42/bin/tomcat-juli.jar -Dcatalina.base=/www/v1.2/hcplat_hp04/apache-tomcat-8.0.42 -Dcatalina.home=/www/v1.2/hcplat_hp04/apache-tomcat-8.0.42 -Djava.io.tmpdir=/www/v1.2/hcplat_hp04/apache-tomcat-8.0.42/temp org.apache.catalina.startup.Bootstrap start root 20423 1 7 Oct27 ? 1-04:58:18 /www/v1.2/hcplat_hp01/jdk1.8.0_121/jre//bin/java -Djava.util.logging.config.file=/www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms2048m -Xmx2048m -Xss1024K -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -verbose:gc -Xloggc:/www/v1.2/hcplat_hp01/monitor/gc.log2017-10-27 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -noclassgc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/www/v1.2/hcplat_hp01/monitor/hp.hump2017-10-27-17-14 -Djava.rmi.server.hostname=10.30.142.7 -Dcom.sun.management.jmxremote.port=8911 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/endorsed -classpath /www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/bin/bootstrap.jar:/www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/bin/tomcat-juli.jar -Dcatalina.base=/www/v1.2/hcplat_hp01/apache-tomcat-8.0.42 -Dcatalina.home=/www/v1.2/hcplat_hp01/apache-tomcat-8.0.42 -Djava.io.tmpdir=/www/v1.2/hcplat_hp01/apache-tomcat-8.0.42/temp org.apache.catalina.startup.Bootstrap start root 23468 13009 0 13:40 pts/0 00:00:00 grep hcplat 强制停止:kill -9 进程id   Nginx目录:cd /usr/local/nginx/ [root@iZ2zeebwkoa6uq5wp3055eZ bin]# cd /usr/local/nginx/ [root@iZ2zeebwkoa6uq5wp3055eZ nginx]# ls client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp 启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 停止:ps -ef|grep nginx [root@iZ2zeebwkoa6uq5wp3055eZ nginx]# ps -ef|grep nginx root 1109 13009 0 13:47 pts/0 00:00:00 grep nginx www 11417 17725 0 Nov03 ? 00:00:50 nginx: worker process www 11418 17725 0 Nov03 ? 00:00:53 nginx: worker process www 11419 17725 0 Nov03 ? 00:01:03 nginx: worker process www 11420 17725 0 Nov03 ? 00:01:15 nginx: worker process www 11421 17725 0 Nov03 ? 00:01:57 nginx: worker process www 11422 17725 0 Nov03 ? 00:01:28 nginx: worker process www 11423 17725 0 Nov03 ? 00:02:47 nginx: worker process www 11424 17725 0 Nov03 ? 00:02:56 nginx: worker process root 17725 1 0 Oct12 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 最下方才是nginx进程 Kill 进程id 如果不能停止,使用强制停止:pkill -9 进程id Nginx配置文件:conf/nginx.conf 编辑:Vi nginx.conf 按i进入编辑模式 保存并退出:按esc后输入 :wq 强制保存 :wq! 退出:按esc后输入 :q 强制退出 :q! 重启配置文件:进入nginx目录sbin下,输入命令./nginx -s reload   Redis目录: cd /usr/local/redis/ [root@iZ2zeebwkoa6uq5wp3055eZ nginx]# cd /usr/local/redis/ [root@iZ2zeebwkoa6uq5wp3055eZ redis]# ls bin conf db logs [root@iZ2zeebwkoa6uq5wp3055eZ redis]# 启动:进入bin目录 ./redis-server ../conf/redis.conf 停止:上述ps命令查询后kill命令杀死进程。

akuma 时间:2017-11-13 分类:Linux,命令 阅读全文

Linux htop工具使用详解

Linux htop工具使用详解

一.Htop的使用简介 大家可能对top监控软件比较熟悉,今天我为大家介绍另外一个监控软件Htop,姑且称之为top的增强版,相比top其有着很多自身的优势。如下: 两者相比起来,top比较繁琐 默认支持图形界面的鼠标操作 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行 杀进程时不需要输入进程号等 二.软件的获取与安装 Htop的安装,既可以通过源码包编译安装,也可以配置好yum源后网络下载安装 2.1源码安装     在htop的项目官方网站上:http://sourceforge.net/projects/htop/直接下载即可 由于我已经安装过了,因此大家看个以上每个编译过程后面都会^c,是不执行此行操作Ctrl+c取消的,此处只是告知如何编译安装的,各人的环境不同,可能编译过程中会出现错误,根据错误,解决后即可。 2.2 yum和rpm包安装 个人推荐yum安装,能够自动的解决软件包依赖关系,安装即可。 三.Htop的使用 安装完成后,命令行中直接敲击htop命令,即可进入htop的界面 各项从上至下分别说明如下: 左边部分从上至下,分别为,cpu、内存、交换分区的使用情况,右边部分为:Tasks为进程总数,当前运行的进程数、Load average为系统1分钟,5分钟,10分钟的平均负载情况、Uptime为系统运行的时间。 以上各项分别为: PID:进行的标识号 USER:运行此进程的用户 PRI:进程的优先级 NI:进程的优先级别值,默认的为0,可以进行调整 VIRT:进程占用的虚拟内存值 RES:进程占用的物理内存值 SHR:进程占用的共享内存值 S:进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态 %CPU:该进程占用的CPU使用率 %MEM:该进程占用的物理内存和总内存的百分比 TIME+:该进程启动后占用的总的CPU时间 COMMAND:进程启动的启动命令名称 F1:显示帮助信息 h, ? F1 查看htop使用说明 S F2 htop 设定 / F3 搜索进程 \ F4 增量进程过滤器 t F5 显示树形结构 <, > F6 选择排序方式 [ F7 可减少nice值可以提高对应进程的优先级 ] F8 可增加nice值,降低对应进程的优先级 k F9 可对进程传递信号 q F10 结束htop u 只显示一个给定的用户的过程 U 取消标记所有的进程 H 显示或隐藏用户线程 K 显示或隐藏内核线程 F 跟踪进程 P 按CPU 使用排序 M 按内存使用排序 T  按Time+ 使用排序 l 显示进程打开的文件 I 倒转排序顺序 s 选择某进程,按s:用strace追踪进程的系统调用 F2 Htop设定 鼠标点击Setup或者按下F2 之后进入htop 设定的页面, Setup 选项下的: 1.Meters 设定顶端的 显示信息,分为左右两侧,Left column 表示左侧的显示的信息,Right column表示右侧显示的信息,如果要新加选项,可以选择Available meters添加,F5新增到上方左侧,F6新增到上方右侧。Left column和Right column下面的选项,可以选定信息的显示方式,有LED、Bar(进度条)、Text(文本模式),可以根据个人喜好进行设置 2. Display options 选择要显示的内容,按空格 x表示显示,选择完后,按F10保存 3.Colors 设定界面以什么颜色来显示,个人认为用处不大,各人喜好不同,假如我们选择Black on White后显示效果如下 4.Colums 作用是增加或取消要显示的各项内容,选择后F7(向上移动)、F8(向下移动)、F9(取消显示、F10(保存更改))此处增加了PPID、PGRP,根据各人需求,显示那些信息。 F3 搜索进程 在界面下按F3或直接输入”/”就可以直接进入搜索模式,是按照进程名进行搜索的。例如 搜索到的进程会用设定的颜色标记出来,方便查看 F4:过滤器 相当于模糊查找,不区分大小写,下方输入要搜索的内容后,则界面只显示搜索到的内容,更加方便查看,例如: F5:以树形方式显示 F6:排序方式 按下F6后会跳转至上图界面,让您选择以什么方式进行排序,在Sort by下选择您要以什么来排序 F7,F8:调整进程nice值 F7表示减小nice值(增大优先级),F8增大nice值(减小优先级),选择某一进程,按F7或F8来增大或减小nice值,nice值范围为-20-19,此处我把apache的nice值调整到了19 F9:杀死进程 选择某一进程按F9即可杀死此进程,很方便 F10:退出htop 四.结束 以上就是htop的基本用法,感谢您的观看,相信大家能够感觉到Htop比top的优势。如果有什么错误之处,麻烦留言告知,方便下次更改,谢谢。

akuma 时间:2017-12-08 分类:Linux 阅读全文

深入理解Java:注解(Annotation)基本概念

深入理解Java:注解(Annotation)基本概念

什么是注解(Annotation):   Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。   Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。从某些方面看,annotation就像修饰符一样被使用,并应用于包、类 型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在Annotation的“name=value”结构对中。   Annotation的成员在Annotation类型中以无参数的方法的形式被声明。其方法名和返回值定义了该成员的名字和类型。在此有一个特定的默认语法:允许声明任何Annotation成员的默认值:一个Annotation可以将name=value对作为没有定义默认值的Annotation成员的值,当然也可以使用name=value对来覆盖其它成员默认值。这一点有些近似类的继承特性,父类的构造函数可以作为子类的默认构造函数,但是也可以被子类覆盖。   Annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息。需要注意的是,这里存在着一个基本的规则:Annotation不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行。另外,尽管一些annotation通过java的反射api方法在运行时被访问,而java语言解释器在工作时忽略了这些annotation。正是由于java虚拟机忽略了Annotation,导致了annotation类型在代码中是“不起作用”的; 只有通过某种配套的工具才会对annotation类型中的信息进行访问和处理。本文中将涵盖标准的Annotation和meta-annotation类型,陪伴这些annotation类型的工具是java编译器(当然要以某种特殊的方式处理它们)。 什么是metadata(元数据):   元数据从metadata一词译来,就是“关于数据的数据”的意思。   元数据的功能作用有很多,比如:你可能用过Javadoc的注释自动生成文档。这就是元数据功能的一种。总的来说,元数据可以用来创建文档,跟踪代码的依赖性,执行编译时格式检查,代替已有的配置文件。如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:     1. 编写文档:通过代码里标识的元数据生成文档     2. 代码分析:通过代码里标识的元数据对代码进行分析     3. 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查   在Java中元数据以标签的形式存在于Java代码中,元数据标签的存在并不影响程序代码的编译和执行,它只是被用来生成其它的文件或针在运行时知道被运行代码的描述信息。   综上所述:     第一,元数据以标签的形式存在于Java代码中。     第二,元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。     第三,元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。     第四,元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部。  Annotation和Annotation类型:   Annotation:   Annotation使用了在java5.0所带来的新语法,它的行为十分类似public、final这样的修饰符。每个Annotation具有一个名字和成员个数>=0。每个Annotation的成员具有被称为name=value对的名字和值(就像javabean一样),name=value装载了Annotation的信息。   Annotation类型:   Annotation类型定义了Annotation的名字、类型、成员默认值。一个Annotation类型可以说是一个特殊的java接口,它的成员变量是受限制的,而声明Annotation类型时需要使用新语法。当我们通过java反射api访问Annotation时,返回值将是一个实现了该 annotation类型接口的对象,通过访问这个对象我们能方便的访问到其Annotation成员。后面的章节将提到在java5.0的 java.lang包里包含的3个标准Annotation类型。 注解的分类:   根据注解参数的个数,我们可以将注解分为三类:     1.标记注解:一个没有成员定义的Annotation类型被称为标记注解。这种Annotation类型仅使用自身的存在与否来为我们提供信息。比如后面的系统注解@Override;     2.单值注解     3.完整注解     根据注解使用方法和用途,我们可以将Annotation分为三类:     1.JDK内置系统注解     2.元注解     3.自定义注解  系统内置标准注解:   注解的语法比较简单,除了@符号的使用外,他基本与Java固有的语法一致,JavaSE中内置三个标准注解,定义在java.lang中:     @Override:用于修饰此方法覆盖了父类的方法;     @Deprecated:用于修饰已经过时的方法;     @SuppressWarnnings:用于通知java编译器禁止特定的编译警告。   下面我们依次看看三个内置标准注解的作用和使用场景。    @Override,限定重写父类方法:   @Override 是一个标记注解类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种Annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override即可。下面的代码是一个使用@Override修饰一个企图重载父类的displayName()方法,而又存在拼写错误的实例: public class Fruit { public void displayName(){ System.out.println("水果的名字是:*****"); } } class Orange extends Fruit { @Override public void displayName(){ System.out.println("水果的名字是:桔子"); } } class Apple extends Fruit { @Override public void displayname(){ System.out.println("水果的名字是:苹果"); } } Orange 类编译不会有任何问题,Apple 类在编译的时候会提示相应的错误。@Override注解只能用于方法,不能用于其他程序元素。 @Deprecated,标记已过时:   同 样Deprecated也是一个标记注解。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。而且这种修饰具有一定的 “延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为 @Deprecated,但编译器仍然要报警。   值得注意,@Deprecated这个annotation类型和javadoc中的 @deprecated这个tag是有区别的:前者是java编译器识别的,而后者是被javadoc工具所识别用来生成文档(包含程序成员为什么已经过 时、它应当如何被禁止或者替代的描述)。   在java5.0,java编译器仍然象其从前版本那样寻找@deprecated这个javadoc tag,并使用它们产生警告信息。但是这种状况将在后续版本中改变,我们应在现在就开始使用@Deprecated来修饰过时的方法而不是 @deprecated javadoc tag。   下面一段程序中使用了@Deprecated注解标示方法过期,同时在方法注释中用@deprecated tag 标示该方法已经过时,代码如下: class AppleService { public void displayName(){ System.out.println("水果的名字是:苹果"); } /** * @deprecated 该方法已经过期,不推荐使用 */ @Deprecated public void showTaste(){ System.out.println("水果的苹果的口感是:脆甜"); } public void showTaste(int typeId){ if(typeId==1){ System.out.println("水果的苹果的口感是:酸涩"); } else if(typeId==2){ System.out.println("水果的苹果的口感是:绵甜"); } else{ System.out.println("水果的苹果的口感是:脆甜"); } } } public class FruitRun { /** * @param args */ public static void main(String[] args) { Apple apple=new Apple(); apple.displayName(); AppleService appleService=new AppleService(); appleService.showTaste(); appleService.showTaste(0); appleService.showTaste(2); } } AppleService类的showTaste() 方法被@Deprecated标注为过时方法,在FruitRun类中使用的时候,编译器会给出该方法已过期,不推荐使用的提示。 SuppressWarnnings,抑制编译器警告:   @SuppressWarnings 被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。在java5.0,sun提供的javac编译器为我们提供了-Xlint选项来使编译器对合法的程序代码提出警告,此种警告从某种程度上代表了程序错误。例如当我们使用一个generic collection类而又没有提供它的类型时,编译器将提示出"unchecked warning"的警告。通常当这种情况发生时,我们就需要查找引起警告的代码。如果它真的表示错误,我们就需要纠正它。例如如果警告信息表明我们代码中的switch语句没有覆盖所有可能的case,那么我们就应增加一个默认的case来避免这种警告。   有时我们无法避免这种警告,例如,我们使用必须和非generic的旧代码交互的generic collection类时,我们不能避免这个unchecked warning。此时@SuppressWarning就要派上用场了,在调用的方法前增加@SuppressWarnings修饰,告诉编译器停止对此方法的警告。   SuppressWarning不是一个标记注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告 名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。   annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值。实例如下: public class FruitService { @SuppressWarnings(value={ "rawtypes", "unchecked" }) public static List<Fruit> getFruitList(){ List<Fruit> fruitList=new ArrayList(); return fruitList; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static List<Fruit> getFruit(){ List<Fruit> fruitList=new ArrayList(); return fruitList; } @SuppressWarnings("unused") public static void main(String[] args){ List<String> strList=new ArrayList<String>(); } } 在这个例子中SuppressWarnings annotation类型只定义了一个单一的成员,所以只有一个简单的value={...}作为name=value对。又由于成员值是一个数组,故使用大括号来声明数组值。注意:我们可以在下面的情况中缩写annotation:当annotation只有单一成员,并成员命名为"value="。这时可以省去"value="。比如将上面方法getFruit()的SuppressWarnings annotation就是缩写的。    SuppressWarnings注解的常见参数值的简单说明:     1.deprecation:使用了不赞成使用的类或方法时的警告;     2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型;     3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;     4.path:在类路径、源文件路径等中有不存在的路径时的警告;     5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;     6.finally:任何 finally 子句不能正常完成时的警告;     7.all:关于以上所有情况的警告。

akuma 时间:2018-01-10 分类:annotation 阅读全文

关于博主

博主

博主:AKUMA

职业:网站后端开发程序员

简介:一个找不到工作的Java程序员.