java遍历目录及子目录下的文件

java遍历目录及子目录下的文件 http://blog.csdn.net/suncheng_hong/article/details/1671632 package com.daacc.common; import java.io.File; public class FileManager { String dir = ""; String temp = ""; public String[] serachFiles(String dir) { File root = new File(dir); File[] filesOrDirs = root.listFiles(); String[] result = new String[10]; for (int i = 0; i < filesOrDirs.length; i++) { if (filesOrDirs[i].isDirectory()) { serachFiles(filesOrDirs[i].getAbsolutePath()); } else { result[i] = filesOrDirs[i].getName(); temp += filesOrDirs[i].getName() + ","; } } return temp.split(","); } /** * @param args */ public static void main(String[] args) { FileManager fm = new FileManager(); String[] files = fm.serachFiles("D:/abc"); for (int i = 0; i < files.length; i++) { System.out.println("files[" + i + "]" + files[i]); } } }

2012-09-04 · 1 min · 107 words · -

Emacs的缓冲区(Buffers)、窗口(Windows)和框架(Frames)

Emacs的缓冲区(Buffers)、窗口(Windows)和框架(Frames) 概念上,Emacs在两个方面有别于一般程序。首先,“窗口"的概念不同。其次,Emacs的"缓冲区"是脱离窗口或框架独立存在的。 (Emacs里的frame相当于Microsoft Windows的window概念。A frame can show several windows, each showing a buffer.) 1 窗口与框架 我们所看到的Emacs"窗口"并非Emacs的窗口,而是Emacs的图形窗口框架(GUI windows frames)。理解这个概念是必须的,因为在未有图形化窗口之前,Emacs已经可以在"终端"运行了,用Windows的术语来说,就是"控制台"程序。看看下面的图,就明白了。 1.1 缓冲区,独立于窗口与框架之外 本质上,窗口和框架只是显示缓冲区内容的工具。缓冲区内可以包含文件内容,可以是Emacs内部自定义的,譬如*Messages*,*scratch*,或*help*等,也可以是用户自定制而其中内容未写入文件的。 许多图形界面的应用程序是将图形窗口 (Emacs中称之为Frames)与一些文件紧密联系在一起的,而Emacs的将缓冲区与图形窗口分离的方式是强大又灵活的。实际上,我们在大部分时间里宁愿使用一个Emacs Frame,而使用C-x b来切换缓冲区,这要比在多个Frame中采用鼠标切换或采用切分窗口等方式更容易,尽管它们在一些情况下存有优点。 1.2 更深入地了解缓冲区 你知道该怎样获知Emacs中开了几个缓冲区及它们的详细信息吗?有三种方法可以实现: C-x C-b,显示缓冲区列表; 缓冲区菜单,列举了打开的缓冲区以及导向它们的快捷命令; 在Emacs的窗口中,摁下Ctrl键,点击鼠标左键,可以弹出缓冲区列表。 Emacs自行定义了一些缓冲区,它们的名字,通常是像*buffername*,*help*,*scratch*这样的格式,并且缓冲区列表本身就是Emacs自定义的缓冲区,如下图: 当你启动Emacs的时候,会产生*Messages*和*scratch*两个缓冲区。*Messages*是用来显示从Emacs启动开始的所有命令信 息的缓冲区,*scratch*是草稿缓冲区,你可以在其中乱写东西,但不会被保存,除非用户使用C-x C-W命令。 在用户使用 Emacs编辑文件时,所读取的文件会被复制到同名的缓冲区内。如果用户需要帮助,那么也可以打开*help*缓冲区。可打开的缓冲区的数量是没有限制 的。大部分时间,仅有一两个缓冲区被显示,还有好多即使你没看到,但它们也是存在的。你可以把缓冲区想象为一堆页面,其中仅有一页是当前页,你可以切换到 令一页,或者创建新页。每个缓冲区都关联一个主模式,它决定了在该缓冲区内,Emacs的行为。譬如,text模式,被设计为书写文档的;Lisp模式, 是用于书写Lisp程序的。用户可以在一个Emacs窗口或框架中显示多个缓冲区,要紧是记住你创建的所有缓冲区。 2 在多缓冲区模式下工作 如果你想创建一个包含文件内容的缓冲区,可以C-x C-f,Emacs会自动创建一个缓冲区并将你带入其中。如果你已经在一个缓冲区打开了这份文件的副本, 那么C-x C-f会把你带入那个已存在的缓冲区中,在此请仔细体会一下,Emacs给你带来的好处吧!而如果你要打开的文件不存在,Emacs会为你创建 一个新文件的缓冲区,并将你带入其中。 请记住: C-x C-f是打开一个文件,该命令后总是跟随这目录/文件名的,如果要打开的文件不存在,就创建新文件。 2.1 切换缓冲区 你有意识到模式行并不显示文件名,而仅仅显示缓冲区名吗?其他一些版本的Emacs可以两个名字都显示,但GNUEmacs只显示缓冲区名,这是因为通常情况下,文件名和缓冲区名是一致的,除非你去修改它们。 要在不同缓冲区之间移动,就C-x b吧。Emacs会给你提供一个默认的最近隐掉的缓冲区名,回车就可以进入。或者输入你想进入的缓冲区名字的前几个字,然后摁Tab键,Emacs会自动为你补全缓冲区名,回车进入即可。 请记住: C-x,b之后则跟随一个缓冲区的名字。如果相应缓冲区不存在,Emacs会自动创建一个新的空缓冲区,与C-x C-f的不同之处是,新建的缓冲区不与文件关联,在退出Emacs时,Emacs不会提醒你要保存缓冲区。 查看已打开的缓冲区,还有以下两种可选方式: C-x C-b,这种方法可用于终端环境中的Emacs; 在Emacs窗口中,摁下Ctrl键,点击鼠标左键。该方法只对图形化的Emacs有效。 2.2 删除缓冲区 为什么要删除缓冲区? 你的Emacs中开的缓冲区太多了,想去掉几个; 对已有文档的修改具有灾难性,将这个缓冲区干掉就可以了。 要删除缓冲区,可键入C-x k,Emacs会显示当前被显示的缓冲区名,也可键入想删除的缓冲区的名字,然后回车。如果已与文件建立关联的缓冲区,内容有了 改动,Emacs会提示你保存一下。其他情况,则缓冲区就永远的消失了。而键入M-xkill-some-buffers可成批删除缓冲区,系统会一个一 个列举已存在的缓冲区,问你是不是把它kill掉,你只需要回答`yes’or`no’就可以了。当所有的缓冲区都被kill掉之后,Emacs不会屏幕空着的,它会创建一个新的*scratch*缓冲区。 ...

2012-09-03 · 1 min · 146 words · -

Parasoft Jtest

Parasoft Jtest http://www.parasoft.com/jsp/products/jtest.jsp> Parasoft Jtest is an integrated Development Testing solution for automating a broad range of practices proven to improve development team productivity and software quality. It focuses on practices for validating Java code and applications, and it seamlessly integrates with Parasoft SOAtest to enable end-to-end functional and load testing of today’s complex, distributed applications and transactions. Jtest facilitates: Static analysis — static code analysis, data flow static analysis, and metrics analysis Peer code review process automation—preparation, notification, and tracking Unit testing — JUnit and Cactus test creation, execution, optimization, and maintenance Runtime error detection — race conditions, exceptions, resource & memory leaks, security attack vulnerabilities, and more This provides teams a practical way to prevent, expose, and correct errors in order to ensure that their Java code works as expected. To promote rapid remediation, each problem detected is prioritized based on configurable severity assignments, automatically assigned to the developer who wrote the related code, and distributed to his or her IDE with direct links to the problematic code and a description of how to fix it. ...

2012-09-03 · 2 min · 232 words · -

IDEA JavaDoc

IDEA JavaDoc http://www.intellij.org.cn/bbs/viewtopic.php?t=1817&start=0 在类或者函数前输入 /** 然后回车,就可以生成啦。 Javadoc Sync plugin可以快速生成所有的注释,使用稍微麻烦点,步骤如下: 打开设置面板,选择inspection,然后找到"javadoc issues",选择相应的配置项 回到编辑窗口,会有警告提示,将光标置于类名上,按下Alt+Enter,选择生成javadoc就可以啦。 如果你想设置生成的javadoc内容,设置面板有一个javadoc sync settings,进行设置即可。

2012-09-02 · 1 min · 15 words · -

JAVA读文本文件

JAVA读文本文件 一行一行的读~~ public static void main(String[] args) throws Exception { FileReader reader = new FileReader("D:\url.txt"); BufferedReader br = new BufferedReader(reader); String s1 = null; while((s1 = br.readLine()) != null) { System.out.println(s1); } br.close(); reader.close(); }

2012-09-02 · 1 min · 35 words · -

Emacs24隐藏工具栏菜单栏和滚动条无效的问题

Emacs24隐藏工具栏菜单栏和滚动条无效的问题 http://blog.csdn.net/cherylnatsu/article/details/7663163 前不久发布了Emacs 24.1,下载下来编译安装后发现这样一个问题,以前旧的.emacs文件里明确设置了不显示工具栏菜单栏滚动条,但是它还是都显示了出来,旧的配置是这样的。 (tool-bar-mode nil) (menu-bar-mode nil) (scroll-bar-mode nil) 后来经过提醒才发现,新版这里已经不能用nil了,必须用0 改成: (tool-bar-mode 0) (menu-bar-mode 0) (scroll-bar-mode 0) 就好了。

2012-08-31 · 1 min · 19 words · -

tcp, quic

tcp, quic, 流量复制 tcp, quic @startuml [tcp client] as tc [tq] as tq note left: tcp server:2000 [qt] as qt note left: quic server: 2001 [tcp server] as ts note left: tcp server: 2002 tc --> tq tq --> qt qt --> ts @enduml t2q2t https://github.com/flano-yuki/t2q2t.git

2012-08-31 · 1 min · 46 words · -

设置Chrome以https方式访问指定网址

设置Chrome以https方式访问指定网址 1、打开Chrome,在地址栏键入 chrome://net-internals 回车 2、在HSTS选项卡下的Domain中输入你想要实现这个强制跳转的域名,如 google.com.hk 3、勾选上Include subdomains,这样可以确保指定网址的所有二级域名都被重定向到https。 4、点击Add按钮,完成。

2012-08-30 · 1 min · 9 words · -

SuperCSV

SuperCSV Super CSV是一个速度奇快、免费跨平台的 CVS 格式数据的读写库,可以方便的处理对象、Map、列表的读写操作,以及自动化的类型转换和数据检查功能。 InputStreamReader freader = new InputStreamReader(new FileInputStream( new File("csv/test1.csv")), "GB2312"); ICsvBeanReader reader = new CsvBeanReader(freader, CsvPreference.EXCEL_PREFERENCE); //获取头部信息 String[] headers = reader.getCSVHeader(true); //获取数据部分 UserBean bean = null; while ((bean = reader.read(UserBean.class, headers, UserBean.readProcessors)) != null) { System.out.print(bean.getName() + "t"); System.out.print(bean.getAge() + "t"); System.out.print(bean.getBirthday() + "t"); System.out.println(bean.getAddress()); } java csv: Commons CSV (Sandbox) Skife CSV opencsv GenJava-CSV Super Csv JavaCSV CSVBeans

2012-08-28 · 1 min · 63 words · -

ArrayBlockingQueue

ArrayBlockingQueue ArrayBlockingQueue 是一个基于数组的阻塞队列实现,此队列按 FIFO (先进先出) 原则对元素进行排序, 在 ArrayBlockingQueue 内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长数组外,ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。 ArrayBlockingQueue 在生产者放入数据和消费者获取数据,都是共用同一个锁对象,由此也意味着两者无法真正并行运行,这点尤其不同于 LinkedBlockingQueue, 按照实现原理来分析 ArrayBlockingQueue 完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行。Doug Lea 之所以没这样去做,也许是因为 ArrayBlockingQueue 的数据写入和获取操作已经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其在性能上完全占不到任何便宜。 ArrayBlockingQueue 和 LinkedBlockingQueue 间还有一个明显的不同之处在于,前者在插入或删除元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的 Node 对象。这在长时间内需要高效并发地处理大批量数据的系统中,其对于 GC 的影响还是存在一定的区别。而在创建 ArrayBlockingQueue 时,我们还可以控制对象的内部锁是否采用公平锁,默认采用非公平锁。 队列的头部是在队列中存在时间最长的元素。队列的尾部是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 这是一个典型的 “有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致放入操作受阻塞;试图从空队列中检索元素将导致类似阻塞。 此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了"不平衡性"。 ArrayBlockingQueue 在构造时需要指定容量,并可以选择是否需要公平性,如果公平参数被设置true,等待时间最长的线程会优先得到处理 (其实就是通过将 ReentrantLock 设置为 true 来达到这种公平性的: 即等待时间最长的线程会先操作) 。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队列,此队列按 FIFO (先进先出) 原则对元素进行排序。 PriorityBlockingQueue PriorityBlockingQueue 是一个带优先级的队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限 (看了一下源码,PriorityBlockingQueue 是对 PriorityQueue 的再次包装,是基于堆数据结构的,而 PriorityQueue 是没有容量限制的,与ArrayList一样,所以在优先阻塞队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError) ,但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,往入该队列中的元素要具有比较能力。 最后,DelayQueue (基于PriorityQueue来实现的) 是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。 下面是延迟接口: ...

2012-08-26 · 2 min · 366 words · -

Java 线程池, thread pool, Executors, ThreadPoolExecutor

Java 线程池, thread pool, Executors, ThreadPoolExecutor Executors ThreadPoolExecutor ExecutorService 在 Java 1.5 引入 ExecutorService 之后,基本上已经不建议直接创建 Thread 对象,而是统一使用 ExecutorService。毕竟从接口的易用程度上来说 ExecutorService 就远胜于原始的 Thread,更不用提 java.util.concurrent 提供的数种线程池,Future 类,Lock 类等各种便利工具。 在操作系统中,线程是一个非常重要的资源,频繁创建和销毁线程会降低系统性能。Java 线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程。ThreadPoolExecutor Executors Executors 提供了一些创建线程池的工具方法。 ExecutorService es = Executors.newSingleThreadExecutor() 源码实现: new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()) corePoolSize 和maximumPoolSize都为1,也就是创建了一个固定大小是1的线程池,workQueue是 new LinkedBlockingQueue<Runnable>() 也就是队列的大小是Integer.MAX_VALUE,可以认为是队列的大小不限制。 由此可以得出通过该方法创建的线程池,每次只能同时运行一个线程,当有多个任务同时提交时,那也要一个一个排队执行。 Executors.newFixedThreadPool(int nThreads) 源码实现: new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()) 类似Executors.newSingleThreadExecutor()也是创建了一个固定大小的线程池,但是可以指定同时运行的线程数量为nThreads。 Executors.newCachedThreadPool() 源码实现: new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue()) ...

2012-08-26 · 4 min · 704 words · -

开源许可证, Open Source License, BSD, MIT, Apache,GPL

开源许可证, Open Source License, BSD, MIT, Apache,GPL 开源许可证(Open Source License) 由宽松到严紧排序,常用的开源许可证有: MIT BSD Apache LGPL GPL MIT、BSD 许可证都源自大学,体现了简单、开放和包容的特点。 MIT、BSD、Apache 三者都支持闭源的后续开发。 GPL、LGPL 传染性开源,编译的代码里用了这里的代码,都必须开源。 MIT 分发软件时,必须保留原始的许可证声明,与 BSD (二条款版) 基本一致。 https://opensource.org/licenses/mit-license.php 来源于大学,MIT 许可证是史上最为简洁和慷慨(permissive)的开源协议之一。作者只想保留版权, 而无任何其他了限制. 也就是说, 你必须在你的发行版里包含原许可协议的声明, 无论你是以二进制发布的还是以源代码发布的。 简言之: 用户可以拿你的代码做任何想做的事情 用户在项目副本中要包含版权声明和许可声明 你无需承担任何责任 应用案例有:JQuery、Rails 等 BSD (二条款版) 分发软件时,必须保留原始的许可证声明。 来源于大学,BSD可证与MIT差不多,也非常简单、慷慨。 BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。 但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件: 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。 BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。 BSD (三条款版) 分发软件时,必须保留原始的许可证声明。不得使用原始作者的名字为软件促销。 Apache 2 分发软件时,必须保留原始的许可证声明。凡是修改过的文件,必须向用户说明该文件修改过;没有修改过的文件,必须保持许可证不变。 来自apache,类似MIT许可证,但它重视专利权。 Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似: 需要给代码的用户一份Apache Licence 如果你修改了代码,需要再被修改的文件中说明。 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。 Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。 应用案例有:Apache 家族、SVN、NuGet 等等。 ...

2012-08-25 · 1 min · 164 words · -

Java 反编译

Java 反编译 Java Decompiler “Java Decompiler”, 由 Pavel Kouznetsov开发,目前最新版本为0.2.5. 它由 C++开发,并且官方可以下载windows、linux和苹果Mac Os三个平台的可执行程序。 http://jd.benow.ca/ http://www.oschina.net/p/java+decompiler DJ Java Decompiler(不免费) DJ Java Decompiler 是个反编译的工具,可以将编译过的 CLASS 文件编译还原成为 Java 原始文件,并且不需要额外安装 JVM (Java Virtual Machine) 或是JDK 的工具模组即可使用。不单如此,它也兼具有 Java 程序编辑工具的角色,提供一些辅助功能便于程序撰写与修改。 DJ Java Decompiler 在 Windows 95、Windows 98、Windows 2000、Windows XP、Windows 2003、Windows Vista、 Windows 7等多种平台上均可以运行的 Java 反编译器和汇编器。DJ Java Decompiler 能够反复编译复杂的 Java 小程序和二进制文件,生产出准确的源代码。它不仅是 Java 反编译器和汇编器,也是一个功能齐全的使用有着着色语法的图形用户界面的 Java 编辑器。 这款软件十分适合用来学习编程,而且它能够让用户保存、打印、编辑和编译生成的 Java 代码。 另外,DJ Java Decompiler 是一个独立的 windows 应用程序,它不要求安装Java,所以运行使用相当方便,大家不妨试一下。 个人觉得比较好的功能有: 可以直接打开jar 档, 查看jar 包里原文件 ...

2012-08-24 · 1 min · 75 words · -

ArrayList Capacity

ArrayList Capacity http://topic.csdn.net/t/20061223/10/5250896.html 任何一个 ArrayList 对象都有一个 capacity 属性,用来指示该 ArrayList 的容量,用"容量"这个词容易引起像本贴楼主那样的误解,我觉得用"容纳能力"比较贴切。 我们知道ArrayList的内部是采用数组来存储元素的,由于java数组都是定长的,所以这个数组的大小一定是固定的,这个大小就是capacity。我们可以肯定capacity一定是大于或等于ArrayList的size,那么当size不断增加到了要超过capacity的时候,ArrayList就不得不重新创建新的capacity来容纳更多的元素,这时需要首先建立一个更长的数组,将原来的数组中的元素复制到新数组中,再删除原来的数组。可见当ArrayList越来越大时,这种操作的消耗也是越来越大的。 为了减少这种不必要的重建capacity的操作,当我们能肯定ArrayList大致有多大 (或者至少会有多大) 时,我们可以先让ArrayList把capacity设为我们期望的大小,以避免多余的数组重建。 假设ArrayList自动把capacity设为10,每次重建时将长度递增原来的三分之二,那么当我们需要大约存储50个元素到ArrayList中时,就会大约需要重建数组4次,分别是在增加第11、第17、第26、第39个元素的时候进行的。如果我们一开始就让ArrayList的capacity为50,那么不需要任何数组重建就能完成所有插入操作了。 java允许我们在构造ArrayList的同时指定capacity,如new ArrayList(50),也允许在以后将它设得更大,而增大capacity就是使用ensureCapacity()方法。注意: capacity只能比原来的更大,而不能比原来的更小,否则java会忽略该操作。ArrayList的初始默认capacity为10,所以给capacity指定小于10的整数是毫无意义的。 最后说说ArrayList的size,前面说过,size一定小于等于capactiy,而且更重要的是,访问超过size的位置将抛出异常,尽管这个位置可能没有超过capacity。ensureCapacity()只可能增加capacity,而不会对size有任何影响。要增加size,只能用add()方法。 https://blog.csdn.net/vandavidchou/article/details/104306445

2012-08-20 · 1 min · 20 words · -

JAVA 正则表达式 分组与捕获

JAVA 正则表达式 分组与捕获 import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Fenzhu { public static void main(String[] args) { Pattern p = Pattern.compile("(/d{3,5})([a-z]{2})"); String s = "123aa-34345bb-234cc-00"; Matcher m = p.matcher(s); while(m.find()) { System.out.println("m.group():"+m.group()); //打印所有 System.out.println("m.group(1):"+m.group(1)); //打印数字的 System.out.println("m.group(2):"+m.group(2)); //打印字母的 System.out.println(); } System.out.println("捕获个数:groupCount()="+m.groupCount()); } } 1 概述 1.1 什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。 捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,通常所说的捕获组指的是普通捕获组。语法如下: 普通捕获组: (Expression) 命名捕获组: (?Expression) 普通捕获组在大多数支持正则表达式的语言或工具中都是支持的,而命名捕获组目前只有.NET、PHP、Python等部分语言支持,据说Java会在7.0中提供对这一特性的支持。上面给出的命名捕获组的语法是.NET中的语法,另外在.NET中使用(?’name’Expression)与使用(?Expression)是等价的。在PHP和Python中命名捕获组语法为: (?PExpression)。 ...

2012-08-19 · 3 min · 574 words · -

java正则表达式的中的问号

java正则表达式的中的问号 java正则表达式中的 ? 是惰性匹配,具体的看下面的例子: Pattern pattern = Pattern.compile("<.*>"); Matcher matcher =pattern.matcher("主页"); System.out.println(matcher.replaceAll("")); 将输出空,因为没有加问号,此时进行的是最长匹配(贪婪匹配) 可以做如果更改 Pattern pattern = Pattern.compile("<.*>"); Matcher matcher =pattern.matcher("主页[color=red]</a[/color]"); System.out.println(matcher.replaceAll("")); 将输出: 主页</a 如果把程序修改为: Pattern pattern = Pattern.compile("<.*?>"); Matcher matcher =pattern.matcher("主页"); System.out.println(matcher.replaceAll("")); 将输出: 主页 不加 ? 表示贪婪,加 ? 表示勉强,区别如下: 勉强是从左边一个一个地吃直到匹配为止,不加 ?的是一口吃掉整个字符串,然后从最后一个一个地吐出来直到匹配为止 字符串 a=====b=====b=== a.*b 将匹配满足条件最长的字符串 a=====b=====b 工作方式: 首先将: a=====b=====b=== 全部吃掉,从右边一个一个地吐出来 1. a=====b=====b=== 不匹配,吐出一字符 a=====b=====b== 不匹配,再吐出一字符 a=====b=====b= 不匹配,再吐出一字符 a=====b=====b 匹配了,结束。如果再不匹配继续吐,直到没有字符了,匹配失败 a.*? 将匹配满足条件最短的字符串 a=====b 工作方式: 从左边一个一个地吃掉字符 ...

2012-08-19 · 1 min · 83 words · -

Java正则表达式

Java正则表达式 大写字母和数字组成的10个字符 private static final Pattern pattern = Pattern.compile("([A-Z]|[0-9]){10}"); pattern.matcher("abcd1234567").matches(); 3位数字 d{3} 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符 (例如字符a到z) 以及特殊字符 (元字符) 组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。 // 反斜杠 /t 间隔 (’/u0009’) /n 换行 (’/u000A’) /r 回车 (’/u000D’) /d 数字 等价于[0-9] /D 非数字 等价于[^0-9] /s 空白符号 [/t/n/x0B/f/r] /S 非空白符号 [^/t/n/x0B/f/r] /w 单独字符 [a-zA-Z_0-9] /W 非单独字符 [^a-zA-Z_0-9] /f 换页符 /e Escape /b 一个单词的边界 /B 一个非单词的边界 /G 前一个匹配的结束 ^为限制开头 ^java 条件限制为以Java为开头字符 $为限制结尾 java$ 条件限制为以java为结尾字符 . 条件限制除/n以外任意一个单独字符 java.. 条件限制为java后除换行外任意两个字符 加入特定限制条件「[]」 [a-z] 条件限制在小写a to z范围中一个字符 [A-Z] 条件限制在大写A to Z范围中一个字符 [a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符 [0-9] 条件限制在小写0 to 9范围中一个字符 [0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符 [0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集) ...

2012-08-19 · 3 min · 538 words · -

Debian系统回收站无法清空解决办法

Debian系统回收站无法清空解决办法 Debian系统回收站无法清空: (1) 切换到root身份 su - (2) chown -R wiloon /home/wiloon/.local/share/Trash (3) 退出su权限 exit (4) chmod -R +w /home/wiloon/.local/share/Trash (5) 接下来就可以去清空回收站了 rm -rf /home/wiloon/.local/share/Trash/files/*

2012-08-16 · 1 min · 24 words · -

pacakge-info.java

pacakge-info.java http://strong-life-126-com.iteye.com/blog/806246 翻看以前的笔记,看到一个特殊的java文件: pacakge-info.java,虽然有记录,但是不全,就尝试着追踪一下该问题, 分享一下流水账式的结果。 首先,它不能随便被创建。在Eclipse中, package-info文件不能随便被创建,会报"Type name is notvalid"错误,类名无效,Java变量定义规范是: 字母、数字、下划线,还有那个不怎么常用的$符号 (顺带说下,Java是支持中文名称的变量,习惯挑战的同学可以尝试下,分享一下这方面的经验) ,这个中划线可不再之列,那怎么创建这个文件呢? 很简单,用记事本创建一个,然后拷贝进去再改一下就成了,更直接的办法就是从别的项目中拷贝过来一个,这更方便。 其次,服务的对象很特殊。一个类是一类或一组事物的描述,比如Dog这个类,就是描述旺财的,那package-info这个类是描述啥的呢?它总要有一个被描述或被陈述的对象,它是描述和记录本包信息。 最后,类不能带有public、private访问权限。package-info.java再怎么特殊,也是一个类文件,也会被编译成package-info.class,但是在package-info.java中只能声明默认访问权限的类,也就是友好类。 其实还有几个特殊的地方,比如不可以继承,没有接口,没有类间关系 (关联、组合、聚合等等) 等。 这个文件的特殊性说完了,那再说说它有什么作用,它有三个作用: 为标注在包上Annotation提供便利; 声明友好类和包常量; 提供包的整体注释说明。 我们来建立一个项目演示这三个作用,建立一个package-info的Java Project,在com.company包三个类:package-info.java 是我们重点关注的,PkgAnnotation.java是一个标注在包上的注解定义,Client.java模拟业务操作类。其结构如下图: 为标注在包上Annotation提供便利 首先定义一个包类型的注解,它只能放置的一个包上: Java代码 /** 定义只能标注在package上的注解 */ @Target(ElementType.PACKAGE) @Retention(RetentionPolicy.RUNTIME) public @interface PkgAnnotation { } 再定义一个package-info类,这个是一个特殊的类,先看代码: Java代码 @PkgAnnotation package com.company; 很简单,就这么个文件,里面啥都没有,就这两句话,没有class类,没有常变量声明。接着写一个模拟交易类,代码如下: Java代码 public class Client { public static void main(String[] args) { //可以通过I/O操作或配置项获得包名 String pkgName = “com.company”; Package pkg = Package.getPackage(pkgName); //获得包上的注解 Annotation[] annotations = pkg.getAnnotations(); //遍历注解数组 for(Annotation an:annotations){ if(an instanceof PkgAnnotation){ ...

2012-08-15 · 1 min · 156 words · -

QCad

QCad QCad QCad是开放源代码的LINUX CAD软件,它使用户能够在LINUX中快速、稳定、方便的使用CAD。使用QCad的用 QCAD界面户不用有CAD编程的基础知识就能够轻松使用QCad。 Qcad 是一个用于 2D 和制图的计算机辅助设计 (CAD) 软件包。它对 Linux, Mac OS X, Unix 和 Microsoft Windows 可用。Qcad 被 RibbonSoft 开发和已经在 GPL 下分发。QCad 2,设计来"使 Qcad 更多产的、更加用户友好的、更灵活的和用其它产品增加了它的兼容性"开发在2002年开发。很多用途后面的界面和概念是与AutoCAD 相同的,尽管可能比在 Qcad 中理解更容易。Qcad 是对 Linux 可用的非常少的 OpenSource CAD 包,和的确是最全功能的。QCad 在内部使用 AutoCAD DXF 文件格式和保留和输入文件。文件能够以很多格式输出,但是明显缺少的是 VRML 和 AVG 两者。

2012-08-07 · 1 min · 45 words · -