自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (2)
  • 收藏
  • 关注

原创 发送请求工具—Advanced REST Client

Advanced REST Client是Chrome浏览器下的一个插件,通过它可以测试http、https、WebSocket请求。在Chrome商店下搜索Advanced REST Client,即可找到 Advanced REST Client的界面 Advanced REST Client在google code的地址:http://code.google.com/p/ch

2014-05-24 23:15:31 19768 3

原创 初识html5 WebSocket

1.  WebSocket概念WebSocket是HTML5开始提供的一种Client与Server间进行全双工(full-duplex)通讯的网络技术双工(duplex), 指二台通讯设备之间,允许有双向的资料传输Client和Server通过WebSocket Protocol建立连接后,双方可以互传数据并且双方都可以关闭连接 2. HTTP概念HTTP Protoco

2014-05-23 18:36:57 4591 2

原创 正则表达式基础笔记

正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征http://www.regexper.com/ 可将正则表达式转化成图形下面来看看正则的基本用法^-匹配字符串的开始$-匹配字符串的结束eg: ^regex$匹配字符串regex\d-匹配数字?-重复0次或1次*-重复0次或多次+-重复1次或多次{n}-重复n次{n

2014-05-11 17:46:29 1655

原创 Tomcat 8(十)HTTP/AJP Connector、Bio/Nio/Apr性能对比

Tomcat 8(七)解读Bootstrap(http://blog.csdn.net/flyliuweisky547/article/details/23464245)介绍过,Connector初始化/启动的时候将初始化/启动内部的ProtocolHandler,而ProtocolHandler又会初始化/启动内部的Endpoint。其实ProtocolHandler只是个接口Protoco

2014-05-07 20:59:08 22893 2

原创 Tomcat 8(九)解读Tomcat组件的生命周期(Lifecycle)

Tomcat 8(七)解读Bootstrap介绍过,执行startup.bat,将引发Tomcat一连串组件的启动。其实这一连串启动是通过组件的生命周期(Lifecycle)实现的今天来看看Lifecycle设计。解读Lifecycle,涉及到如下几个类Lifecycle、LifecycleState、LifecycleEvent、LifecycleListener(位于org.apach

2014-04-24 20:27:51 4382

原创 Tomcat 8(八)Tomcat解析server.xml的工具—Digester

Tomcat是利用Digester解析server.xml。Digester是Apache下的开源项目Digester官网:http://commons.apache.org/proper/commons-digester/使用Digester,需要依赖一些jar包。Digester依赖的jar包可以从网上下载,也可以使用Tomcat提供的jar包方案一:从网上下载jar包comm

2014-04-16 21:07:44 4278 2

原创 Tomcat 8(七)解读Bootstrap

上一篇文章分析了通过startup.bat启动Tomcat相当于执行如下代码,即运行Bootstrap startstart "Tomcat" "C:\Program Files\Java\jdk1.7.0_51\bin\java"-Djava.util.logging.config.file="D:\Program Files\apache-tomcat-8.0.3\conf\logg

2014-04-11 21:07:23 4501

原创 Tomcat 8(六)catalina.bat详解

catalina.bat的流程图较长,先说下结果执行startup.bat等同于catalina.bat start,而执行catalina.bat start等同于java Bootstrap start(附带-D、-classpath选项)Tomcat就是一个java程序--------------------------------------------------------

2014-04-01 20:39:34 6530 1

原创 Tomcat 8(五)startup.bat详解

在Windows下,执行startup.bat,就可以启动Tomcat下面我们来看看startup.bat究竟干了什么?先简单介绍下bat文件1. bat文件批处理文件,在DOS和Windows(任意版本)系统中,bat文件是可执行文件。bat文件由一系列命令构成2. 执行bat文件双击bat文件或在命令行下执行bat文件3. startup.bat中涉及的bat语法

2014-03-26 20:52:03 4610 2

原创 Tomcat 8(四)server.xml的Cluster标签详解

上一篇文章,配置Tomcat集群时,在每个Tomcat节点的server.xml中添加了Cluster标签其实等同于如下配置(以下是Cluster的默认配置)<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

2014-03-24 19:35:28 6976 2

原创 Tomcat 8(三)Apache2.2.25+Tomcat8.0.3集群配置

环境信息操作系统:win8Tomcat版本:Tomcat 8.0.3Apache版本:httpd-2.2.25-win32-x86-openssl-0.9.8y1. 安装Apache1.1 下载Windows版ApacheApache下载地址:http://httpd.apache.org/download.cgi在下载页面选择”Binaries”(哪个版本下的”Bin

2014-03-15 18:44:43 6966 1

原创 Tomcat 8(二)server.xml详解

Tomcat服务器是由一系列可配置的组件构成的,其中核心组件是Catalina Servlet,它是最顶层组件。Tomcat的组件是在server.xml(CATALINA_HOME\conf\server.xml)配置的,server.xml内容<!-- Licensed to the Apache Software Foundation (ASF) under one or mo

2014-03-08 18:08:33 14543

原创 Tomcat 8(一)Tomcat常用配置

操作系统:win8Jdk版本:1.7.0_51Jdk目录:C:\Program Files\Java\jdk1.7.0_51Tomcat版本:8.0.3 Tomcat目录:D:\Program Files\apache-tomcat-8.0.3Tomcat 8下载地址:http://tomcat.apache.org/download-80.cgi注:Tomcat 8需要J

2014-03-02 12:04:35 29676 1

原创 java中使用log4j 2

log4j 2是log4j的升级版log4j 2简介:http://logging.apache.org/log4j/2.x/manual/index.html 1. 下载log4j 2官网:http://logging.apache.org/log4j/2.x/下载页面:http://logging.apache.org/log4j/2.x/download.html我下

2014-02-18 20:08:16 17750 10

原创 java中使用json(org.json)

java中使用json需要引入第三方json项目json官网: http://json.orgjson官网页面往下拉,可以找到Java板块,该板块列出了官方推荐的第三方json项目之前开发用的Json-lib,但今天发现org.json更简便(Json-lib依赖的jar较多)本文将介绍org.json的用法1.下载org.jsonorg.json的官网: ht

2014-02-13 20:44:13 50195 6

原创 2008R2、2012R2下PowerShell操作HyperV

1. 2008R2下PowerShell操作HyperV2008R2下需要使用开源项目PsHyperV下载地址:http://pshyperv.codeplex.com/releases我用的是R2 SP1的”PsHyperV.zip”1.1 解压”PsHyperV.zip”,可以得到HyperV文件夹,主要用的是HyperV目录下的HyperV.psd1。我将HyperV文件夹放

2014-02-11 20:49:17 3038 1

原创 WCF(三)制作WCF安装包(Windows Services版)

1. 创建Windows Service项目右键Solution—Add—New Project—Visual C#—Windows—Windows Service,在下方Name栏输入”WindowsService” WindowsService的目录 右键WindowsService—Properties—Application—Target framework将Tar

2014-02-07 22:11:11 2809

原创 WCF(二)制作WCF安装包(IIS版)

上一篇文章地址:WCF(一)创建WCF服务本文沿用上一篇文章的例子,介绍如何制作WCF安装包,通过此安装包即可将WCF部署在IIS下1. 修改Solution的Configuration Properties右键Solution—Properties—Configuration Properties—Configuration选择右上角的”Configuration Man

2014-02-07 21:03:45 1566

原创 PowerShell常用命令整理

1.获取PowerShell版本信息Get-Host或$PSVersionTable2.获取当前PowerShell环境包含的ModuleGet-Module3.引入ModuleImport-Module **(Module的绝对路径)4.显示对象($a)的所有属性 $a | Get-Member -MemberType Properties5.显示对象($a)所有

2014-02-06 20:34:30 5418

原创 WCF(一)创建WCF服务

1.创建空白Solution选择File—New—Project—Other Project Types—Visual Studio Solution—Blank Solution在下方输入Solution名字和路径2.创建DataContracts2.1 创建Test.DataContracts右键Solution—New Project—Add—Wind

2014-01-28 19:41:17 1880

原创 WCF托管在IIS、Windows Services下的性能对比

我的WCF最初是托管在win7的IIS下。由于client OS (win7等)中IIS的最大连接数为10,即WCF的并发上限被IIS限制在10。迫于IIS的限制,现在考虑将WCF转移到win7的Windows Services下。为了对比WCF托管在IIS、Windows Services下的性能,做了如下实验。1.测试环境win7虚拟机(企业版  双核 64位) 、 2008r

2014-01-21 21:11:23 3814

原创 WCF ServiceHost的实例方式及ServiceHost实例的并发方式

一个http请求到达WCF的流程图Computer1向IIS发http请求。IIS接到请求,解析url,找到Project1并实例对应的ServiceHost1,解析参数,处理请求。ServiceHost的配置是在web.config中设置的。下面介绍下ServiceHost的实例方式以及ServiceHost实例的并发方式。1.ServiceHost的三种

2014-01-21 20:41:29 4308

原创 PowerShell如何使用自定义公共函数

今天在编写PowerShell脚本的过程中,发现某个函数在多个PowerShell脚本中都用到了。但是该如何方便的在多PowerShell脚本中使用这个公用的函数呢?假设以下Test这个函数就是要在多个PowerShell脚本中用到,Test函数内容:Function Test($Name,$Age){ Write-Host "Name is $Name.Age is $Age"}

2014-01-20 21:54:11 6283

原创 C#中使用log4net

log4net是开源日志组件,配置类似log4j。log4net下载地址:http://logging.apache.org/log4net/1.控制台应用配置log4neta.新建控台应用Test,引入log4net.dllb.在Test\bin\Debug目录下新建Test.exe.config 添加如下配置

2013-11-04 14:45:38 2321

带注释的 Bootstrap.java

带注释的 Bootstrap.java ,配合文章"Tomcat 8(七)解读Bootstrap"使用

2014-04-11

带注释的Bootstrap.java

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.startup; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.catalina.Globals; import org.apache.catalina.security.SecurityClassLoad; import org.apache.catalina.startup.ClassLoaderFactory.Repository; import org.apache.catalina.startup.ClassLoaderFactory.RepositoryType; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; /** * Bootstrap loader for Catalina. This application constructs a class loader * for use in loading the Catalina internal classes (by accumulating all of the * JAR files found in the "server" directory under "catalina.home"), and * starts the regular execution of the container. The purpose of this * roundabout approach is to keep the Catalina internal classes (and any * other classes they depend on, such as an XML parser) out of the system * class path and therefore not visible to application level classes. * * @author Craig R. McClanahan * @author Remy Maucherat */ public final class Bootstrap { private static final Log log = LogFactory.getLog(Bootstrap.class); /** * Daemon object used by main. */ private static Bootstrap daemon = null; private static final File catalinaBaseFile; private static final File catalinaHomeFile; private static final Pattern PATH_PATTERN = Pattern.compile("(\".*?\")|(([^,])*)"); static { // Will always be non-null //System.getProperty("user.dir"),获取当前目录 //由于是在$CATALINA_HOME\bin下运行的Bootstrap,所以userDir为$CATALINA_HOME\bin String userDir = System.getProperty("user.dir"); // Home first //Globals是存放全局常量的类 //Globals.CATALINA_HOME_PROP = "catalina.home" //catalina.home在运行Bootstrap时已设置(Tomcat的根目录) String home = System.getProperty(Globals.CATALINA_HOME_PROP); File homeFile = null; //获取Tomcat的绝对路径 if (home != null) { File f = new File(home); try { homeFile = f.getCanonicalFile(); } catch (IOException ioe) { homeFile = f.getAbsoluteFile(); } } if (homeFile == null) { // First fall-back. See if current directory is a bin directory // in a normal Tomcat install File bootstrapJar = new File(userDir, "bootstrap.jar"); if (bootstrapJar.exists()) { File f = new File(userDir, ".."); try { homeFile = f.getCanonicalFile(); } catch (IOException ioe) { homeFile = f.getAbsoluteFile(); } } } if (homeFile == null) { // Second fall-back. Use current directory File f = new File(userDir); try { homeFile = f.getCanonicalFile(); } catch (IOException ioe) { homeFile = f.getAbsoluteFile(); } } //设置catalinaHomeFile catalinaHomeFile = homeFile; System.setProperty( Globals.CATALINA_HOME_PROP, catalinaHomeFile.getPath()); // Then base String base = System.getProperty(Globals.CATALINA_BASE_PROP); //设置catalinaBaseFile if (base == null) { catalinaBaseFile = catalinaHomeFile; } else { File baseFile = new File(base); try { baseFile = baseFile.getCanonicalFile(); } catch (IOException ioe) { baseFile = baseFile.getAbsoluteFile(); } catalinaBaseFile = baseFile; } System.setProperty( Globals.CATALINA_BASE_PROP, catalinaBaseFile.getPath()); } // -------------------------------------------------------------- Variables /** * Daemon reference. */ private Object catalinaDaemon = null; protected ClassLoader commonLoader = null; protected ClassLoader catalinaLoader = null; protected ClassLoader sharedLoader = null; // -------------------------------------------------------- Private Methods private void initClassLoaders() { try { //创建commonLoader commonLoader = createClassLoader("common", null); if( commonLoader == null ) { // no config file, default to this loader - we might be in a 'single' env. commonLoader=this.getClass().getClassLoader(); } //创建catalinaLoader、sharedLoader catalinaLoader = createClassLoader("server", commonLoader); sharedLoader = createClassLoader("shared", commonLoader); } catch (Throwable t) { handleThrowable(t); log.error("Class loader creation threw exception", t); System.exit(1); } } private ClassLoader createClassLoader(String name, ClassLoader parent) throws Exception { //CatalinaProperties解析$CATALINA_HOME\conf\catalina.properties, //并将catalina.properties内的属性存为系统属性 //catalina.properties内common.loader="${catalina.base}/lib", //"${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar" //读取common.loader String value = CatalinaProperties.getProperty(name + ".loader"); if ((value == null) || (value.equals(""))) return parent; //将${catalina.base},${catalina.home}替换为Tomcat的绝对路径 value = replace(value); List<Repository> repositories = new ArrayList<>(); String[] repositoryPaths = getPaths(value); for (String repository : repositoryPaths) { // Check for a JAR URL repository try { @SuppressWarnings("unused") URL url = new URL(repository); repositories.add( new Repository(repository, RepositoryType.URL)); continue; } catch (MalformedURLException e) { // Ignore } // Local repository if (repository.endsWith("*.jar")) { repository = repository.substring (0, repository.length() - "*.jar".length()); repositories.add( new Repository(repository, RepositoryType.GLOB)); } else if (repository.endsWith(".jar")) { repositories.add( new Repository(repository, RepositoryType.JAR)); } else { repositories.add( new Repository(repository, RepositoryType.DIR)); } } //ClassLoaderFactory依据repositories的内容创建ClassLoader return ClassLoaderFactory.createClassLoader(repositories, parent); } /** * System property replacement in the given string. * * @param str The original string * @return the modified string */ protected String replace(String str) { // Implementation is copied from ClassLoaderLogManager.replace(), // but added special processing for catalina.home and catalina.base. String result = str; int pos_start = str.indexOf("${"); if (pos_start >= 0) { StringBuilder builder = new StringBuilder(); int pos_end = -1; while (pos_start >= 0) { builder.append(str, pos_end + 1, pos_start); pos_end = str.indexOf('}', pos_start + 2); if (pos_end < 0) { pos_end = pos_start - 1; break; } String propName = str.substring(pos_start + 2, pos_end); String replacement; if (propName.length() == 0) { replacement = null; } else if (Globals.CATALINA_HOME_PROP.equals(propName)) { replacement = getCatalinaHome(); } else if (Globals.CATALINA_BASE_PROP.equals(propName)) { replacement = getCatalinaBase(); } else { replacement = System.getProperty(propName); } if (replacement != null) { builder.append(replacement); } else { builder.append(str, pos_start, pos_end + 1); } pos_start = str.indexOf("${", pos_end + 1); } builder.append(str, pos_end + 1, str.length()); result = builder.toString(); } return result; } /** * Initialize daemon. */ public void init() throws Exception { //创建commonLoader、catalinaLoader、sharedLoader initClassLoaders(); //为当前线程设置ClassLoader Thread.currentThread().setContextClassLoader(catalinaLoader); //设置SecurityClassLoad。具体作用还不清楚。。。 SecurityClassLoad.securityClassLoad(catalinaLoader); // Load our startup class and call its process() method if (log.isDebugEnabled()) log.debug("Loading startup class"); //通过反射实例化Catalina Class<?> startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina"); Object startupInstance = startupClass.newInstance(); // Set the shared extensions class loader if (log.isDebugEnabled()) log.debug("Setting startup class properties"); String methodName = "setParentClassLoader"; Class<?> paramTypes[] = new Class[1]; paramTypes[0] = Class.forName("java.lang.ClassLoader"); Object paramValues[] = new Object[1]; paramValues[0] = sharedLoader; //通过反射设置Catalina的parentClassLoader Method method = startupInstance.getClass().getMethod(methodName, paramTypes); method.invoke(startupInstance, paramValues); //将实例化的Catalina赋值给catalinaDaemon catalinaDaemon = startupInstance; } /** * Load daemon. */ private void load(String[] arguments) throws Exception { // Call the load() method //调用catalinaDaemon的load方法,并传递参数"start" String methodName = "load"; Object param[]; Class<?> paramTypes[]; if (arguments==null || arguments.length==0) { paramTypes = null; param = null; } else { paramTypes = new Class[1]; paramTypes[0] = arguments.getClass(); param = new Object[1]; param[0] = arguments; } Method method = catalinaDaemon.getClass().getMethod(methodName, paramTypes); if (log.isDebugEnabled()) log.debug("Calling startup class " + method); method.invoke(catalinaDaemon, param); } /** * getServer() for configtest */ private Object getServer() throws Exception { String methodName = "getServer"; Method method = catalinaDaemon.getClass().getMethod(methodName); return method.invoke(catalinaDaemon); } // ----------------------------------------------------------- Main Program /** * Load the Catalina daemon. */ public void init(String[] arguments) throws Exception { init(); load(arguments); } /** * Start the Catalina daemon. */ public void start() throws Exception { if( catalinaDaemon==null ) init(); //调用catalinaDaemon的start方法 Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null); method.invoke(catalinaDaemon, (Object [])null); } /** * Stop the Catalina Daemon. */ public void stop() throws Exception { Method method = catalinaDaemon.getClass().getMethod("stop", (Class [] ) null); method.invoke(catalinaDaemon, (Object [] ) null); } /** * Stop the standalone server. */ public void stopServer() throws Exception { Method method = catalinaDaemon.getClass().getMethod("stopServer", (Class []) null); method.invoke(catalinaDaemon, (Object []) null); } /** * Stop the standalone server. */ public void stopServer(String[] arguments) throws Exception { Object param[]; Class<?> paramTypes[]; if (arguments==null || arguments.length==0) { paramTypes = null; param = null; } else { paramTypes = new Class[1]; paramTypes[0] = arguments.getClass(); param = new Object[1]; param[0] = arguments; } Method method = catalinaDaemon.getClass().getMethod("stopServer", paramTypes); method.invoke(catalinaDaemon, param); } /** * Set flag. */ public void setAwait(boolean await) throws Exception { //通过反射,设置catalinaDaemon的await Class<?> paramTypes[] = new Class[1]; paramTypes[0] = Boolean.TYPE; Object paramValues[] = new Object[1]; paramValues[0] = Boolean.valueOf(await); Method method = catalinaDaemon.getClass().getMethod("setAwait", paramTypes); method.invoke(catalinaDaemon, paramValues); } public boolean getAwait() throws Exception { Class<?> paramTypes[] = new Class[0]; Object paramValues[] = new Object[0]; Method method = catalinaDaemon.getClass().getMethod("getAwait", paramTypes); Boolean b=(Boolean)method.invoke(catalinaDaemon, paramValues); return b.booleanValue(); } /** * Destroy the Catalina Daemon. */ public void destroy() { // FIXME } /** * Main method and entry point when starting Tomcat via the provided * scripts. * * @param args Command line arguments to be processed */ public static void main(String args[]) { if (daemon == null) { // Don't set daemon until init() has completed //***2.1*** Bootstrap bootstrap = new Bootstrap(); try { //***2.2*** bootstrap.init(); } catch (Throwable t) { handleThrowable(t); t.printStackTrace(); return; } //***2.3*** daemon = bootstrap; } else { // When running as a service the call to stop will be on a new // thread so make sure the correct class loader is used to prevent // a range of class not found exceptions. Thread.currentThread().setContextClassLoader(daemon.catalinaLoader); } //***2.4*** try { String command = "start"; if (args.length > 0) { command = args[args.length - 1]; } if (command.equals("startd")) { args[args.length - 1] = "start"; daemon.load(args); daemon.start(); } else if (command.equals("stopd")) { args[args.length - 1] = "stop"; daemon.stop(); } else if (command.equals("start")) { //***2.5*** daemon.setAwait(true); //***2.6*** daemon.load(args); //***2.7*** daemon.start(); } else if (command.equals("stop")) { daemon.stopServer(args); } else if (command.equals("configtest")) { daemon.load(args); if (null==daemon.getServer()) { System.exit(1); } System.exit(0); } else { log.warn("Bootstrap: command \"" + command + "\" does not exist."); } } catch (Throwable t) { // Unwrap the Exception for clearer error reporting if (t instanceof InvocationTargetException && t.getCause() != null) { t = t.getCause(); } handleThrowable(t); t.printStackTrace(); System.exit(1); } } /** * Obtain the name of configured home (binary) directory. Note that home and * base may be the same (and are by default). */ public static String getCatalinaHome() { return catalinaHomeFile.getPath(); } /** * Obtain the name of the configured base (instance) directory. Note that * home and base may be the same (and are by default). If this is not set * the value returned by {@link #getCatalinaHome()} will be used. */ public static String getCatalinaBase() { return catalinaBaseFile.getPath(); } /** * Obtain the configured home (binary) directory. Note that home and * base may be the same (and are by default). */ public static File getCatalinaHomeFile() { return catalinaHomeFile; } /** * Obtain the configured base (instance) directory. Note that * home and base may be the same (and are by default). If this is not set * the value returned by {@link #getCatalinaHomeFile()} will be used. */ public static File getCatalinaBaseFile() { return catalinaBaseFile; } // Copied from ExceptionUtils since that class is not visible during start private static void handleThrowable(Throwable t) { if (t instanceof ThreadDeath) { throw (ThreadDeath) t; } if (t instanceof VirtualMachineError) { throw (VirtualMachineError) t; } // All other instances of Throwable will be silently swallowed } // Protected for unit testing protected static String[] getPaths(String value) { List<String> result = new ArrayList<>(); Matcher matcher = PATH_PATTERN.matcher(value); while (matcher.find()) { String path = value.substring(matcher.start(), matcher.end()); path = path.trim(); if (path.startsWith("\"") && path.length() > 1) { path = path.substring(1, path.length() - 1); path = path.trim(); } if (path.length() == 0) { continue; } result.add(path); } return result.toArray(new String[result.size()]); } }

2014-04-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除