技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

Java 读取rtf模板内容 替换变化部分形成 新的rtf文档

 java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。... 全文

java操作word java rtf

Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱

本文主要介绍Java里常用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题。日后编程中应尽量避免此陷阱。首先看下面一段代码:定义一个虚类Server.java... 全文

Java陷阱

Java2007预想(简译Java 2007: The year in preview)(上)

(原文地址:[url]http://www-128.ibm.com/developerworks/java/library/j-java2007.html[/url])Elliotte Rusty Harold / 文    JaredQin@163.com / 译    2007年,SUN将松绑Java,使其在Java开发者社区的一个开源许可下发布。这篇文章中,作者Elliotte Rusty Harold预言了Java平台的新方向,涵盖很多方面,从代码编写,到Bug修正,到新的语法等等。    2006年同样是号角争鸣的一年,在同MS(c#)和脚本开发社区(Ruby)的竞争中,Java仍然是全球使用的最多的开发语言。Java 6的发布引来了众多的赞扬,但却比不上宣布Java将在GNU General Public License下完全开源。这股巨大的冲劲能否在2007年延续,让我们拭目和思考。Java平台开源2007年的上半年,Sun将在开源许可下发布其JDK。开源JDK是Java开发者社区前进的一大步,它将驱动Java平台在下一个十年内的发展。 当程序员从简单报告bug转变为开始自己修正这些bug时,可以预想JDK的质量将有大幅提升。在Java Developer Connection(JDC)中报告bug将会包含详细的分析这些bug的危害,甚至提供修补bug的补丁。正如Linus's Law所说,“Given enough eyeballs, all bugs are shallow.”(毛主席早就说了,群众的眼睛是雪亮的)。调试可以并行去完成,优化工作也是。开源使得它们实现最大的同步。分支不幸的是,设计工作没有同调试和优化工作同步起来。一个清晰的API有时需要一个统一的领导,一个“独裁者”。然而,这些独裁者们,有时知道自己在做什么,有时却不知道。这些可能的独裁者之间的竞争,常常是解决问题的最好方案。鲜有厂商能够为一个产品开发出足够多的独立实现来解决所有问题,而只能是一方面。但是开源社区可以在任何一个方面都繁荣起来。看看Java平台的在各个级别(语言,虚拟机,类库)上的分支。绝大部分都失败了,但这样是有益的。优秀的想法总会成功。一些可以延续自己的道路,一些会融合到标准JDK中去。也许明年这些还不能显见,哪一个分支会是哪种结果,但是这个过程将进行下去。    通过发行早期版本的Java 7 Dolphin,Sun在几个月内带动开源项目的运转。因为构建(build)的问题和(早期)许可的障碍,Sun不会发行更早版本的JDK,开源只针对 Dolphin。然而,第三方通过把Sun的版本分解,创造出可行的开源版本的Java 6,Java 5,Java 4,甚至更早的版本。    一些早期的分支版本可能与Sun公司的商标产生冲突,甚至接到不愉快的律师信。我们需要一个通用的,非商业化的,所有人都可以用的标志来命名这个语言。我提议用“J”,因为没有人可以将一个单一的字母申请为商标。开源项目重来没有死掉,它们只是渐渐淡去,失去往日光彩。像之前的Blackdown一样,GNU Classpath, Kaffe和其他开源的JDK项目的开发者正转向其他的工作。如果一个项目还没有达到1.0版本,它在未来也许也不会做到。    前瞻Java 7    Dolphin在2007年可能不会正式发布,明年发布可能是一个比较切合实际的目标。也就是说,工作在进行,一些特性会作为早期的标准扩展,或者至少beta版本,初入人眼。    不幸的是,加入新特性和删除特性相比,前者正是太容易了。几乎不可避免的是,随着时间的推移,语言将变得越来越复杂,越来越令人困惑,这不是少数。甚至那些独立的看很好的特性,当相互堆砌到一起的时候,就会变得问题多多。    不幸的是,Java社区还没有总结出这个教训,他们轻视这个一贯会发生的崩溃。这里正好有些跟新的语法相关的事情,他们太cool,令语言的设计者无法抗拒,甚至它们没有解决任何实际问题。然而Java 7中对新特性的呼声很高,包括闭包(closures),多继承,和操作符重载。    我猜测,今年结束之前,在Java 7的beta版本中,我们会看到闭包,也许也能看到操作符重载(50%的机会),但是多继承根本不会出现。太多的Java是基于单根继承。没有非常有效的方法将多继承改进到语言中来。    当前,还有很多很好的语法改进方案放在桌面上,有些已经引起重视,有些还没有。许多提案集中在将像“getFoo()”之类的函数,替换成像“->”一样的操作符。    Lists    第一个可能是,用数组的语法来访问集合(collections)。比如,以下代码:List content = new LinkedList(10);content.add(0, "Fred");content.add(1, "Barney");String name = content.get(0);可以写作: List content = new LinkedList(10);content[0] = "Fred";content[1] = "Barney";String name = content[0];另一种可能出现的是,允许在lists中使用数组方式的初始化语法,比如:LinkedList content = {"Fred", "Barney", "Wilma", "Betty"}    这两个提案都可以通过一些小的编译器技巧,在不改变虚拟机的情况下实现。对于修订语法来说,这是很重要的。没有一个提案是无效的,或者需要重新定义现存的源代码,这些对新的语法来说,是相当重要的问题。一种语言特性它如果能够对开发者的生产力产生实际促进的话,它就会被内建到语言底层中去管理表(tables)、树(trees)、图(maps),就像你在使用XML和SQL时遇到的那样。像Javascript的E4X项目和MS世界的Cω和Linq项目,他们是这种思想的开路先锋,但是Java平台却不是这样。If anyone feels like making a potential game-saving play by forking the compiler, here is a very good place to look.属性我们可以看到一些关于属性访问的语法规则。其中一个提案是,利用简便的“->”来调用getter个setter方。比如,一下代码:Point p = new Point();p.setX(56);p.setY(87);int z = p.getX();可以写成:Point p = new Point();p->X = 56;p->Y = 87;int z = p->X;其它符号,包括“.”和“#”,也像“->”一样被提示使用。未来,你也许会不得不明确地用属性(property)定义相关的域(field),比如:public class Point { public int property x; public int property y;}我个人很支持这样。我希望Java平台能够接受更多的人性化的入口,这样我们可以实际使用公共的field。如果我们用同fields一样的名称定义getter和setter方法,那么读和写field的会被自动分解到对应的方法上去,这样的语法更简洁和更具弹性。任意精度计算另一个提案是,将操作符应用到BigDecimal和BigInterger的运算中去。比如,现在对不限精度的计算,你必须按以下方式:BigInteger low = BigInteger.ONE;BigInteger high = BigInteger.ONE;for (int i = 0; i < 500; i++) { System.out.print(low); BigInteger temp = high; high = high.add(low); low = temp;};这样写,更加清晰:BigInteger low = 1;BigInteger high = 1;for (int i = 0; i < 500; i++) { System.out.print(low); BigInteger temp = high; high = high + low; low = temp;};    这个提案可能没有坏处,但它也许会误导人们对这些class的滥用,导致native code性能的下降。    从JAR中取出JAM   Java 7将修正那些刺激开发者的很久远了的源代码,像可变class的装载和关联classpath。Sun正在着力用Java Module System(JMS)解决这个问题。数据将被存储在.jam文件中,以替代.jar文件。这是一种包含所有代码和原数据的superjar文件。非常重要的一点是,JMS将首次支持版本,所以你可以说某个问题需要Xerces 2.7.1,而不是2.6。也将允许你指定文件版本依赖(dependence),比如,一个JAM中的问题需要JDOM。还将允许你加载其中一个模块(module),而不是加载所有的。最后,它将支持一种集中化的存储,提供很多不同JAM的很多不同版本,你可以在其中选取你需要的。如果JMS开始工作,jre/lib/ext将成为过去。包(Package)访问我还希望Java 7能放宽一点对访问的限制。使得子包(subpackage)可以访问父包(supperpackage)的类中的保护(package- protected)域(field)和方法,或者,至少是那些明确声明为友类的。无论如何,这将使得应用被分割到多个简单包中,大幅提高可测试性。对子包的单元测试,我们不必为了测试他们,而将他们的方法公开。    文件系统访问1995 年以来,文件系统的访问一直是Java平台的一个重要问题。十年以来,一直没有可靠的跨平台的方法来处理基本的拷贝和移动文件操作。至少对之前的三个版本的JDK(1.4、5和6),修正它一直是一个公开的问题。可惜的是,这些令人头痛但是必须的拷贝和移动文件API,被转移到不是很通用但是很吸引人的操作上去了,比如内存映射输入输出(memory-mapped I/O)。也许JSR 203可以修正这些,并且给我一个灵活可用的、跨平台的文件系统API。再一次,工作组将花费大量时间在,文件系统留下的,相对并不是很重要的异步I/O 上。明年我们就会知道答案。    试验        无论改变了什么,最好的方法就是,先在开源分支中实现出来,我们就能看出它实际产生的或多或少的不同。为了这个目的,Sun的Peter Ahè已经在java.net上启动了Kitchen Sink项目(Kitchen Sink Project)。目的是利用javac编译器的分支不断的去测试像这样的各种各样的想法。在Blog中写下某些得意的想法是一回事,把他们变成真正可运行的代码又是另一回事了。客户端GUI    虽然不被很多人注意,但是Java平台在桌面软件中确实存在四五年了.比较多的桌面应用软件是用Java代码写的,包括RSSOwl, Limewire, Azureus, Eclipse, NetBeans, CyberDuck, 等等。他们几乎使用了各种不同的GUI工具包,包括Swing, AWT, SWT, 甚至是像Mac OS X上的Cocoa的平台相关的工具包。没法看出哪一个工具包会在明年战胜其他的,虽然Swing看上去,在保持用户本地话感觉方面做的比较好。    在Swing中开发,仍然很据挑战性,但是明年Swing Application Framework出现时候,情况将会大大改观。这个框架目前仍在Java Community Process中开发(JSR 286)。以下是JSR中描述的:               易写的Swing应用程序,倾向于让启动和关闭,让资源、动作和会话状态的管理具有同样的核心元素。新    的应用程序在启动是创建所有的核心元素。Java SE没有对结构化应用程序提供任何支持,这经常让新的开发    者觉得有点无助,特别是当他们企图构建一个比Java SE的文档中提供的例子更为深入的应用程序的时候。        规范(最终)将填补Swing应用程序在基础结构上的空白。它将定义一些小型的扩展类或者框架,这些框    架定义了对绝大部分应用程序来说通用的架构。    Swing Application Framework应该支持一个典型应用程序的绝大多数功能,允许开发者把他们插入在一些自定义点(比如开启和关闭)。在启动和关闭之间,它将处理保存和重新载入窗口和应用程序的其他部分。最终,它将允许开发者编写异步的动作,运行在Swing事件处理线程之外。    继续改进JavaBean和基于它的所有功能,包括Swing。JSR 295正在定义一个标准来将bean绑定在一起,这样对一个bean的更新将会自动反射到别的相关bean上。比如,一个GUI的grid bean会随着与之相关的数据库bean的变化而自动更新。    最后,JSR 303是关于一个基于XML的验证语言的,这个语言用来声明任何一个给定的bean可以使用的值。你可以声明一个整型属性必须在1和10之间,或者一个字符串属性必须包含一个合法的email地址。幸运一点,在年底前的beta版本中我们就可以看到它,在明年的Java 7中就会完成。... 全文

preview Java

C#利用Java的RSA密钥对,与Java进行通通讯

C#利用Java的RSA密钥对,与Java进行通通讯.RSA算法简介关于RSA加密算法可以参考:... 全文

加密解密 RSA Java C#

Java EE 6核心特征:Bean Validation特性概述(1)

Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用。下边将向您系统的介绍该规范的各种特性。概述 Bean Validation 规范... 全文

Bean Validation Java EE 6 Java

Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及的话题。InfoQ中文站特地邀请IBM高级工程师成富为大家撰写这个《Java深度历险》专栏,旨在就Java的一些深度和高级特性分享他的经验。在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行 Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其 “编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。... 全文

eclipse插件 开源 classloader 编程语言 java

Java+Oracle应用开发中的几个经典问题

问题一:如保加载JDBC驱动程序:正常我们加载驱动程序有三个途径:1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动程序的静态内容都初始化,其实这时驱动程序类调用了DriverManager.registerDriver(driver)方法。... 全文

Java Java开发 Oracle应用 JDBC加载

java的卸载,安装,环境变量配置。MyEclipse的破解

笔记本win7 64位系统。jdk和jre下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html下载安装JDK就行了,比如我安装在D:/jdk8 目录下环境配置如下:... 全文

myeclipse java java开发工具

一个简单的MongoDB操作类

import java.net.UnknownHostException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.WriteResult; import com.mongodb.util.JSON; /** * MongoDB操作类 * @author dyk * */ public class MongoDbManagerImpl implements MongoDbManager{ protected static Logger logger = LoggerFactory.getLogger("03046"); private static final String DBNAME = "clementine"; private Mongo mongo = null; private DB dbConnection = null; private String mongoServerAddr; private int mongoServerPort; private static Map<String, DBCollection> dbCollectionMap = new ConcurrentHashMap<String, DBCollection>(); public void setMongoServerAddr(String mongoServerAddr) { this.mongoServerAddr = mongoServerAddr; } public void setMongoServerPort(int mongoServerPort) { this.mongoServerPort = mongoServerPort; } public void init() { if (this.mongo == null) { try { this.mongo = new Mongo( this.mongoServerAddr , this.mongoServerPort); if (null != this.mongo) { this.dbConnection = this.mongo.getDB(DBNAME); } } catch (UnknownHostException e) { logger.error("连接mongoDb失败, 服务器地址: " + this.mongoServerAddr + ", 端口: " + this.mongoServerPort); throw new RuntimeException(e); } } } /** * get an table * @param collectionName * @return */ private DBCollection getDBCollection(String collectionName) { DBCollection collection = null; if (dbCollectionMap.containsKey(collectionName)) { collection = dbCollectionMap.get(collectionName); } else { collection = this.dbConnection.getCollection(collectionName); if (null != collection) { dbCollectionMap.put(collectionName, collection); } } return collection; } /** * check if doc exsit * @param collectionName table name * @param query target document */ @Override public boolean isDocumentExsit(String collectionName, DBObject query) { boolean result = false; DBCursor dbCursor = null; DBCollection collection = this.getDBCollection(collectionName); if (null != collection) { dbCursor = collection.find(query); if (null != dbCursor && dbCursor.hasNext()) { result = true; } } return result; } /** * query an record * @param collectionName table name * @param query target document * @return */ @Override public DBObject selectDocument(String collectionName, DBObject query) { DBObject result = null; DBCursor dbCursor = null; DBCollection collection = this.getDBCollection(collectionName); if (null != collection) { dbCursor = collection.find(query); if (null != dbCursor && dbCursor.hasNext()) { result = dbCursor.next(); } } return result; } /** * /** * insert an new record * @param collectionName table name * @param newDocument new doc * @param query target document */ @Override public void insertDocument(String collectionName, DBObject newDocument) { DBCollection collection = this.getDBCollection(collectionName); if (null != collection) { if (!this.isDocumentExsit(collectionName, newDocument)) {//insert only doc not exist collection.insert(newDocument); } } } /** * update an document * @param collectionName * @param query target document * @param updatedDocument * @return */ @Override public boolean updateDocument(String collectionName, DBObject query, DBObject updatedDocument) { boolean result = false; WriteResult writeResult = null; DBCollection collection = this.getDBCollection(collectionName); if (null != collection) { writeResult = collection.update(query, updatedDocument); if (null != writeResult) { if (writeResult.getN() > 0) { result = true; } } } return result; } /** * delete an document * @param collectionName * @param document target document * @return */ @Override public boolean deleteDocument(String collectionName, DBObject query) { boolean result = false; WriteResult writeResult = null; DBCollection collection = this.getDBCollection(collectionName); if (null != collection) { writeResult = collection.remove(query); if (null != writeResult) { if (writeResult.getN() > 0) { result = true; } } } return result; } public static void main(String[] args) throws UnknownHostException { MongoDbManagerImpl m = new MongoDbManagerImpl(); m.setMongoServerAddr("10.235.164.180"); m.setMongoServerPort(27017); m.init(); String collectionName = "myTest"; //insert String json ="{'num' : 1}"; DBObject doc1 =(DBObject)JSON.parse(json); m.insertDocument(collectionName, doc1); //select DBObject doc2 = null; DBObject query = new BasicDBObject(); query.put("num", 1); doc2 = m.selectDocument(collectionName, query); System.out.println(doc2); //update DBObject updatedDocument = new BasicDBObject(); updatedDocument.put("$set", new BasicDBObject().append("num", 100)); boolean result = m.updateDocument(collectionName, query, updatedDocument); System.out.println(result); query.put("num", 100); // //remove result = m.deleteDocument(collectionName, query); System.out.println(result); } } ... 全文

java Java JAVA mongodb Mongodb MongoDb mongoDB MongoDB

想追赶.Net的脚步?Java面前障碍重重(1)

---待到Java 8面世之时 .Net的进度时钟恐怕已经又走过了两到五年——届时微软做出的调整将使二者差距进一步拉大。... 全文

.Net Java Java 8

oracle中创建java包.执行JAVA代码的方法

前提是数据库上需要安装java虚拟机(JVM),使用下面的语句查看 select * from dba_registry where comp_id = 'JAVAVM'为空,则未安装,请执行 $ORACLE_HOME/javavm/install/initjvm.sql安装. 一、如何创建java存储过程?通常有三种方法来创建java存储过程。1. 使用oracle的sql语句来创建:... 全文

oracle create or replace and compile java source named

Java 8特性探究(1):通往lambda之路_语法篇

现在开始要灌输一些概念性的东西了,这能帮助你理解lambda更加透彻一点,如果你之前听说过,也可当是温习,所谓温故而知新......在开始之前,可以同步下载jdk 8 和  IDE,IDE根据个人习惯了,不过eclipse官方版本还没出来,所以目前看的话,netbean7.4是首选的,毕竟前段子刚刚出的正式版本,以下是他们的下载地址。... 全文

Java8 Java Lambda

【小白的java成长系列】——java关键字

准备出一个系列的内容啦,今天就从关键字开始说起吧~... 全文

面向对象 对象 实例 interface java

Java中的Map (HashMap,Hashtable,TreeMap以及java集合类小结)

(题外话:一日不见,如隔三秋But,I‘am here . Always.)    今天的这一篇是有关于java的又一个很重要的类——Map映像,那我们接下来就学习Map<K,V>接口的几个常用到的具体实现类。    一.HashMap:       (特点:key无序散列存放,key唯一)    1. 添加:put(key,value);    2. 删除:remove(key); clear();... 全文

Always java false

甲骨文针对Java 7发布零日漏洞更新

甲骨文公司昨日发布了两个针对Java零日(zero day)漏洞的带外(out-of-band)安全更新,其中漏洞CVE-2013-0422在发现当天就已被攻击,并已经添加到了Blackhole和Nuclear Pack开发套件两款软件当中。安全专家建议用户在安装补丁程序之前停用Java,该漏洞使得黑客能够在系统中远程登录并执行任意代码。另外一个漏洞是CVE-2012-3174,通过远程攻击,黑客能够将用户导向一个恶意站点。... 全文

Java 7 零日漏洞 Java漏洞 甲骨文

JavaFX 2.2已打包入Java7 u6并提供安装包制作工具

最新的java7 u6 b14已经将javafx2.2打包入jre一起(jdk7 u2至u5提供的是javafx2.0和2.1的co-install,就是先安装jre,再安装javafx,现在u6是直接合并javafx2.2进入jre,不用再单独安装,虽然jdk7 u6 b14安装第一个界面还提示随后会安装javafx2.1,但是这是一个还没改掉的文字描述,安装后会发现javafx2.2已经在jre的lib目录了,也不会再提示安装javafx),并提供了全桌面平台的javafx程序本地打包工具,可以将javafx,jre一起打包为各平台相关的安装包,无需其他依赖。... 全文

JavaFX Java7 Java

为大家推荐一款非常好用的java写的垂直爬虫webmagic,力挺

webmagic官方介绍:http://blog.csdn.net/u010670689/article/details/41704239本文目标:爬去网站的head内容,然后控制台打印webmagic版本:0.5.1maven坐标:<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.5.1</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.5.1</version></dependency>1.实现自己的PageProcessor pageprocessor是爬虫的核心,可以定义爬虫的爬取规则,我将PageProcessor的定制分为三个部分,分别是爬虫的配置、页面元素的抽取和链接的发现。代码: package youling.studio; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.JsonFilePipeline; import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.processor.example.GithubRepoPageProcessor; public class MyPageProcessor  implements PageProcessor {     // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等     private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);     // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑     @Override     public void process(Page page) {         // 部分二:定义如何抽取页面信息,并保存下来     //  <h1>//        <span ><a href="/u010670689/article/details/41576647">//        启动hive metastore命令//        </a></span>//    </h1>     //csdn文章标题的html代码         page.putField("title", page.getHtml().xpath("//h1/span[@class='link_title']/a/text()").toString());         if (page.getResultItems().get("title") == null) {             //skip this page             page.setSkip(true);         }         // 部分三:从页面发现后续的url地址来抓取         // <span ><a href="/u010670689/article/details/41704239">//        webmagic总体介绍//        </a></span>         page.addTargetRequests(page.getHtml().links().regex("(/u010670689/article/details/(\\w+))").all());     }     @Override     public Site getSite() {         return site;     }     public static void main(String[] args) {         Spider.create(new MyPageProcessor())                 //从"https://github.com/code4craft"开始抓                 .addUrl("http://blog.csdn.net/u010670689?viewmode=contents")                 //保存到json文件里                 .addPipeline(new ConsolePipeline())                 //开启5个线程抓取                 .thread(1)                 //启动爬虫                 .run();     } }4.1.1 爬虫的配置第一部分关于爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置,我们会在第5章-“爬虫的配置”里进行介绍。在这里我们先简单设置一下:重试次数为3次,抓取间隔为一秒。4.1.2 页面元素的抽取第二部分是爬虫的核心部分:对于下载到的Html页面,你如何从中抽取到你想要的信息?WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。另外,对于JSON格式的内容,可使用JsonPath进行解析。... 全文

java java爬虫 爬虫 垂直爬虫

Java之美[从菜鸟到高手演变]之Java中static关键字

Java中的static关键字解析本文转子博客园,单击此处阅读原文... 全文

Java static 关键字