问道数据pdf分割合并工具处理工具怎么用

& & &Json&是什么就不多说了,本文把Json理解成一种协议。
& & &印象之中,Json貌似是前端的专属,其实不然,服务器端组织数据,依然可以用Json协议。
& & &比如说,某公司有一套测评题目(基于Json协议),这些题目比较珍贵,不想直接放在js中,所以就将题目文件放在服务器端,然后通过一个接口去请求,多一层控制,就多了一层保护,通过在接口上加权限,可保证数据安全。
& & &如此一来,服务器端必定会有一个Json文件(纯文本文件),Json文件中包含Json数据。
& & &假设Json数据结构如下:
"name": "题库",
"items": [{
"name": "测评-1",
"items": [/*...*/]
"name": "测评-2",
"items": [/*...*/]
"name": "测评-3",
"items": [/*...*/]
& & &暂不讨论这样设计的合理性,假定已经是这么设计了,无法再做更改。但凡是有些规模的项目,需求变动都比较频繁,项目工期也比较紧张,不得不做出妥协,完美的设计是不存在的。
& & &随着时间和规模的增长,测评会越来越多,而且每个测评本身包含的数据也不少,这样一来,这个Json文件会越来越大。
& & &众所周知,IO操作是一个巨大的瓶颈,如果Json文件太大,占用IO过多,将导致性能严重下降。同时Json文件太大,也不好管理,不符合开闭原则。
& & &因此,我们迫切需要对Json文件进行拆分,把数据量大、独立性强、自成一体的Json数据转移到主体的外部,单独放在一个Json文件中,这样不仅缩小了单个文件的体积,也方便管理。
& & &其实这样做最大的优点是可以实现懒加载,或者说是按需加载。
& & &这样的情景很常见,比如在进行数据检索时,一般情况下,会先看到一个数据概要列表,列出几项重要信息,其他次要信息需要点击&详情&按钮时,才去加载。
& & &拿上边测评的例子来说,第一步仅需显示出有哪些测评,然后根据用户的选择,再去加载对应测评的详细信息。没有必要一上来就把所有的信息都返回给客户端,不仅浪费资源,还降低了数据安全性。
& & &如何才能实现Json文件的合并呢?请看下章~~~
解决方案:Jean
& & &Jean是一个Java工具类,她可以实现Json文件合并、依赖管理,灵感来自于前端模块化开发。
& & &这名字是怎么来的呢?前端模块化开发,国内比较厉害的就是Sea.js了,小菜要写的是Java工具类,要不就叫Jea?于是赶紧上网查查Jea有没有啥特殊含义,万一是敏感词就不好了。结果一查,查到了Jean,可翻译为&珍&,相当不错的名字嘛,就是她了!
& & &Jean的思想是在Json文件中,加入一段特殊代码,来引入其他Json文件,有点像Jsp中的include。语法为:@Jean("family","./items/family.js")。可以把@Jean()理解成函数调用,里边有两个参数,第一个参数是属性名称,第二个参数是依赖文件的相对路径。
& & &文章开篇测评的例子,可以写成这样:
"name": "题库",
"items": [{
"name": "测评-1",
@Jean("items","./items1/test.js")
"name": "测评-2",
@Jean("items","./items2/test.js")
@Jean("items","./items3/test.js"),
"name": "测评-3"
& & &假设./items1/test.js中内容为:
name: "测评-1-内容"
& & &由此可以看出,@Jean在Json文件中的写法,就和普通的属性写法一样,如果是写在最后边,末尾就不用加逗号,其他情况同样需要加逗号。
& & &通过工具类解析之后,@Jean("items","./items1/test.js")会变成:"items": {name: "测评-1-内容"},替换之后,为了保证格式正确,所以写@Jean的时候需要按照正常的语法加逗号。
& & &第一个参数,将会转换成@Jean占位符被替换后的Json属性名称,如果不写,默认为"jean"。
第二个参数是该属性依赖的Json文件的相对路径,当然是相对于当前Json文件的,Jean会根据当前Json文件的路径,找到依赖的Json文件,然后读取内容,再合并到当前Json文件中。目前小菜实现的Jean工具类,只能识别./和../两种相对路径语法(含义与HTML相对路径语法相同)。
& & &所以,@Jean仅仅是一个占位符,包含有@Jean的Json字符串,必须经过Jean工具类处理之后,才是合法的Json字符串。同时,Jean仅仅关心依赖,而不关心依赖的组织形式,这样可以带来巨大的灵活性,无论怎样组织文件结构,最终体现到Jean的仅仅是一个相对路径而已。
& & &Jean工具类提供了三个public方法:
* 解析所有的jean表达式
* @param json json字符串
* @param jsonPath json字符串所在路径,完整路径
* @return 解析后的json字符串
7 public static String parseAll(String json,String jsonPath){}
* 解析单个jean表达式
* @param express jean表达式
* @param jsonPath json字符串所在路径,完整路径
* @return 解析结果
15 public static String parseOne(String express,String jsonPath){}
* 解析特定的jean表达式
* @param json json字符串
* @param jsonPath json字符串所在路径,完整路径
* @param names 需要解析的属性名称列表
* @return 解析后的json字符串
24 public static String parseTarget(String json,String jsonPath,List&String& names){}
& & &第一个方法就是说给我一个包含@Jean的Json字符串,再给我这个Json字符串所在文件的绝对路径,我就把所有的@Jean解析成依赖文件中的内容。
& & &为啥非要单独传入一个绝对路径呢?其实可以直接传入Json文件的路径,这样既能拿到需要解析的Json字符串,又能获取当前Json文件的绝对路径。但这样有一个缺点,就是每调用一次,就要读一次文件,小菜单独把路径写成一个参数,就是要把读文件的过程留给用户,具体怎么读,由用户说了算,最终把需要解析的Json字符串和参照路径给我就可以了。例如:
1 String json = "{@Jean(\"item1\",\"./../../item.js\"),@Jean(\"item2\",\"../item.js\")}";
2 System.out.println(parseAll(json, "E:/root/json")); //print {"item1": {"name": "xxx1"},"item2": {"name": "xxx2"}}
& & &第二个方法可以直接解析一个@Jean表达式,不多解释。例如:
1 String expression = "@Jean(\"item1\",\"./../../item.js\")";
2 System.out.println(parseOne(expression, "E:/root/json")); //print "item1": {"name": "xxx1"}
& & &第三个方法可以解析指定的@Jean表达式,@Jean表达式第一个参数是属性名称,想解析哪个属性,就把它放在List&String&中,其他不做解析的,属性值为null。这样就实现了懒加载。例如:
1 List&String&
names = new ArrayList&String&();
2 names.add("item1");
3 String json = "{@Jean(\"item1\",\"./../../item.js\"),@Jean(\"item2\",\"../item.js\")}";
4 System.out.println(parseTarget(json, "E:/root/json", names)); //print {"item1": {"name": "xxx"},"item2": null}
1 import java.io.BufferedR
2 import java.io.F
3 import java.io.FileInputS
4 import java.io.IOE
5 import java.io.InputStreamR
6 import java.util.ArrayL
7 import java.util.HashM
8 import java.util.L
9 import java.util.M
10 import java.util.regex.M
11 import java.util.regex.P
* json文件合并工具类
* @author 杨元
18 public class Jean {
* 识别jean表达式
private static Pattern jeanRegex = pile("(@Jean\\((\"[^\"]*\",)?\"[^\"]*\"\\))");
* 识别jean表达式中的所有参数
private static Pattern paramRegex = pile("\"([^\"]*)\"");
* 识别jean表达式中的name参数
private static Pattern nameRegex = pile("\"([^\"]*)\",");
* 默认属性名称
private static String defaultName = "jean";
* 解析所有的jean表达式
* @param json json字符串
* @param jsonPath json字符串所在路径,完整路径
* @return 解析后的json字符串
public static String parseAll(String json,String jsonPath){
//识别jean表达式
List&String& jeans = regexMatchList(jeanRegex, json);
jeans = noRepeat(jeans);
for(String jean : jeans){
json = json.replace(jean, parse(jean, jsonPath));
* 解析单个jean表达式
* @param express jean表达式
* @param jsonPath json字符串所在路径,完整路径
* @return 解析结果
public static String parseOne(String express,String jsonPath){
return parse(express, jsonPath);
* 解析特定的jean表达式
* @param json json字符串
* @param jsonPath json字符串所在路径,完整路径
* @param names 需要解析的属性名称列表
* @return 解析后的json字符串
public static String parseTarget(String json,String jsonPath,List&String& names){
//识别jean表达式
List&String& jeans = regexMatchList(jeanRegex, json);
jeans = noRepeat(jeans);
//处理属性名映射
Map&String, Boolean& nameMap = new HashMap&String, Boolean&();
for(String s : names){
nameMap.put(s, true);
String replacement = "";
Matcher matcher = null;
String name = "";
for(String jean : jeans){
matcher = nameRegex.matcher(jean);
//判断是否传入属性名称
if(matcher.find()){
name = matcher.group(1);
//判断是否需要解析
if(nameMap.get(name) != null){
replacement = parse(jean, jsonPath);
//不需要解析直接将属性值写为null
replacement = "\""+name+"\": null";
//无属性名直接用默认的jean
replacement = "\""+defaultName+"\": null";
json = json.replace(jean, replacement);
* 解析jean表达式
* @param express jean表达式
* @param jsonPath json文件所在路径,完整路径
* @return jean表达式执行结果
private static String parse(String express,String jsonPath){
//识别参数
List&String& params = regexMatchList(paramRegex, express);
//默认属性名称
String name = defaultN
//格式化路径
jsonPath = removeSuffix(jsonPath, "/");
//判断是否传入了属性名称
if(params.size() & 1){
name = params.get(0);
//解析路径
String path = getAbsolutePath(jsonPath, params.get(params.size()-1));
//读取内容并返回
name = wrapWith(name, "\"");
return name + ": " + readJsonFile(path);
* 从字符串中移除指定后缀
* @param source 源字符串
* @param suffix 需要移除的后缀
* @return 处理后的源字符串
private static String removeSuffix(String source,String suffix){
if(source.endsWith(suffix)){
source = source.substring(0, source.length()-suffix.length());
* list内容去重
* @param list 内容为string的list
* @return 内容去重后的list
private static List&String& noRepeat(List&String& list){
Map&String, String& map = new HashMap&String, String&();
List&String& result = new ArrayList&String&();
for(String s : list){
map.put(s, null);
for(String s : map.keySet()){
result.add(s);
* 用指定的字符串包裹内容
* @param content 内容
* @param wrap 包裹字符串
* @return 包裹后的内容
private static String wrapWith(String content,String wrap){
return wrap+content+
* 读取Json文件(纯文本文件,utf-8编码)
* 这个方法可以替换成自己项目中封装的方法
* @param path 文件路径
* @return 文件内容
private static String readJsonFile(String path){
String encoding = "utf-8";
StringBuilder sb = new StringBuilder(256);
File file = new File(path);
InputStreamReader iReader = null;
BufferedReader bReader = null;
iReader = new InputStreamReader(new FileInputStream(file), encoding);
bReader = new BufferedReader(iReader);
String line = null;
while((line = bReader.readLine()) != null){
sb.append(line.trim());
bReader.close();
iReader.close();
}catch(Exception e){
if(iReader != null){
iReader.close();
} catch (IOException e1) {
iReader = null;
if(bReader != null){
bReader.close();
} catch (IOException e1) {
bReader = null;
return sb.toString();
* 将相对路径转换成绝对路径
* 只识别 ./ ../
* @param refrence 基准参照路径
* @param relative 相对路径表达式
* @return 绝对路径
private static String getAbsolutePath(String refrence,String relative){
if(relative.startsWith("./")){
refrence = getAbsolutePath(refrence, relative.replaceFirst("\\./", ""));
}else if(relative.startsWith("../")){
refrence = getAbsolutePath(refrence.substring(0, refrence.lastIndexOf("/")),
relative.replaceFirst("\\.\\./", ""));
refrence = refrence + "/" +
* 将正则表达式的匹配结果转换成列表
* @param regex 正则表达式对象
* @param input 要检索的字符串
* @return 结果列表
private static List&String& regexMatchList(Pattern regex,String input){
List&String& result = new ArrayList&String&();
Matcher matcher = regex.matcher(input);
while(matcher.find()){
result.add(matcher.group(1));
& & &欢迎留言,共同探讨!
阅读(...) 评论()问道装备怎么拆分的几率高?_百度知道
问道装备怎么拆分的几率高?
超黑吸如果吸出来了但是不是我想要的我的那条属性,我知道用超黑吸的几率高点,一直到把装备上的属性吸完 装备才会消失我有个130的武器上面有个所有4,但是武器上有5条属性,听说吸出来1条还能吸
我有更好的答案
如果第一条吸不出相四,用五个也就吸出来了必需用超黑吸,最多五个超黑就吸出来了,因为用普黑的话,装备就会消失,如果你用混沌玉的话,一个混沌玉保证一个超黑吸取成功,你最不好运的话,所以要用超黑吸取装备属性是随机的
你想要吸到最好的那个属性最好都用超黑,因为即使不成功也不会爆武器,看你运气了,运气好的话一次就把你想要的吸出来,要不就只有一个个吸了,费超黑
系统是随机选取一条的
吸了一条装备不消失
祝你一次成功
千万不要用黑水
一切都讲运气
没什么几率高不高的
其他类似问题
1人觉得有用
为您推荐:
问道的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
数据库集群
与数据库分割
  大型网站设计注意事项
  1、HTML静态化
  其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。
  除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,社区等也是如此。
  同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛进行后台管理并且再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。
  2、网站设计图片分离
  大家知道,对于来说,不管是Apache、还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站设计都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的压力,并且可以保证系统不会因为图片问题而崩溃,在器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。
  3、网站设计数据库集群和库表散列
  大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。
  网站设计在数据库集群方面,很多数据库都有自己的解决,、等都有很好的方案,常用的提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。
  上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。
  4、网站设计缓存
  缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。
  网站设计架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。
  网站程序开发方面的缓存,上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。
  5、网站设计镜像
  镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和 EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。
  6、网站设计负载均衡
  负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
  负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。
  硬件四层交换
  第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、、、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
  在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。
  网站设计软件四层交换
  大家知道了硬件四层的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。
  软件四层交换我们可以使用Linux上常用的来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。
  一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。
[ 责任编辑:jj ]
6月16日~19日,比特网在第…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte表单数据平台概述_问道网_
关注我们:
电话:0-603
无需专业知识也能在线创建表单
1. 创建题目很简单
想要什么题目类型就点击什么,一目了然!
更支持Email,电话,身份证等多种特殊类型题目!
题目自由编辑,自由修改,无需担心数据匹配问题,我们可以智能调整!
2. 智能生成表单页面
根据所编辑的题目自动生成表单,自动排版,还有更多的漂亮模板供选择。
自动表单填写验证,保证表单输入的内容符合要求。
更可以把表单页面拿来,想怎么改就怎么改!
3. 管理数据超轻松
可以自行添加,修改,删除数据
可排序,查找,过滤数据,轻松管理
更可从Excel导入本地的数据,一并处理
问道网:企业云数据平台。专注于问卷表单创建、数据在线回收、数据分析和统计分析报告。提供基于问道网平台的多种应用:问卷调查、表单数据、考试测评、绩效考核、员工敬业度调查、员工满意度评估、员工360度评估,具有开放性、外观设计功能、全面的数据挖掘分析和报告功能,让数据为企业创造价值。
经典问卷和报告
Copyright(C), 版权归所有

我要回帖

更多关于 淘宝数据包处理工具 的文章

 

随机推荐