• 关于

    java 解析 if

    的搜索结果

问题

使用ANTLR用Python解析一些Java代码

我想在Python中使用ANTLR构建Java解析器。 我从ANTLR存储库下载了语法: Lexer:https://github.com/antlr/grammars-v4/blob/mast...
is大龙 2020-03-24 12:28:36 0 浏览量 回答数 1

问题

写了几天的方程式解析,实在是写不出来..有没大神帮忙写一个..:报错

做一个基于CVI的方程式解析产生波形,写了几天,对堆栈实在是不熟悉,然后用if一直写..写出几百行,就是没结果..只能求助大神了.. 得到了一个字符串"sin((1*2*3*a)/4)*tan(5*(6+7)*a...
kun坤 2020-06-14 09:06:14 0 浏览量 回答数 0

回答

我给你完整代码,说明如下1).txt文本中的JSON数据格式是JSON数组格式形如:[{},{},{},{}],读取文本文件内容的方法是jsonRead 2)main方法是示例代码,parseArray是解析返回JSON数组中某个key的值,是个列表,对你的应用来说就是获取“retweeted_status"的值。parseObject是解析JSON对象的,行如{}的数据。 对你的应用来说就是获取retweeted_status对象的"user_id","text"两个属性值。3)需要引用的jar是json-simple-1.1.1.jar。你去搜一个,添加到工程路径中。运行OK。 这个其实很简单的,一定要耐心点,别着急,慢慢来。我的源码如下: import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; public class JsonParseUtil { private static JSONParser parser = new JSONParser(); /** * 返回数组格式的JSON[]中某个属性值,如果属性是普通类型,则直接取出,如果是JSON对象,则需要转换 * @param json * @param key * @return */ public static List parseArray(String json,String key){ List result = new ArrayList(); try { JSONArray array = (JSONArray) parser.parse(json); for (int i = 0; i < array.size(); i++) { JSONObject obj = (JSONObject) array.get(i); Object value = obj.get(key); String text = null; if(value instanceof JSONObject){ text = ((JSONObject) value).toJSONString(); }else if(value instanceof String){ text = (String) value; } result.add(text); } } catch (ParseException e) { e.printStackTrace(); } return result; } /** * JSON格式是{}的map数据,返回指定的key * @param json * @param keys * @return */ public static Map<String,Object> parseObject(String json,List<String> keys){ Map<String,Object> result = new HashMap<String,Object> (); if(json==null||"".equals(json)){ return result; } if(keys==null||keys.size()==0){ return result; } //利用json.simple解析JSON字符串 try { JSONObject object = (JSONObject)parser.parse(json); if(object!=null){ for(String key:keys){ result.put(key, object.get(key)); } } } catch (ParseException e) { e.printStackTrace(); } return result; } public static String jsonRead(String fileName) { String json = null; BufferedReader br = null; try { br = new BufferedReader(new FileReader(fileName)); } catch (FileNotFoundException e) { e.printStackTrace(); } try { StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); line = br.readLine(); } json = sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } return json; } public static void main(String[] args) { //读取文件 String json = jsonRead("src/json.txt"); //首先得到的是retweeted_status的数组 List<String> retweeted_status = parseArray(json,"retweeted_status"); List<String> keys = new ArrayList<String>(); keys.add("user_id"); keys.add("text"); //再解析每个retweeted_status的内容 for(String info:retweeted_status){ Map<String,Object> map = parseObject(info,keys); StringBuffer out = new StringBuffer(); for(String key:keys){ if(map!=null){ out.append(key+":"+map.get(key)+" "); } } System.out.println("result:"+out.toString()); } } }
杨冬芳 2019-12-02 03:03:26 0 浏览量 回答数 0

问题

java 异步处理优化:报错

 点击一个按钮需要处理10000条数据 基本处理过程是:  读取页面数据到List-->将List传递给异步线程-->在线程中for循环解析数据, for中有if进行校验数据,...
kun坤 2020-06-07 14:12:47 0 浏览量 回答数 1

问题

android xml解析?报错

android刚入门,代码报错,请大家指引一下。 xml文件解析报错:如下信息 org.xmlpull.v1.XmlPullParserException: version expect...
爱吃鱼的程序员 2020-06-22 22:00:48 0 浏览量 回答数 1

回答

简介: 导包 commons-fileupload-1.3.1.jar commons-io-2.2.jar import java.io.File; import java.io.FileOutputStream; import java. 导包 commons-fileupload-1.3.1.jar commons-io-2.2.jar import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadHandleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String savePath=this.getServletContext().getRealPath("/WEB-INF/upload/"); File file=new File(savePath); if(!file.exists()&&!file.isDirectory()){ System.out.println(savePath+"目录不存在,需要创建"); //创建目录 file.mkdirs(); } //消息提示 String message=""; //创建DiskFileItemFactory工厂 DiskFileItemFactory factory=new DiskFileItemFactory(); //创建一个文件上传解析器 ServletFileUpload upload=new ServletFileUpload(factory); //解决文件上传乱码问题 upload.setHeaderEncoding("UTF-8"); if(!ServletFileUpload.isMultipartContent(request)){ //按照传统方面获取数据 return; } try { //使用ServletFileUpload解析器解析数据,返回来的是一个List<FileItem>集合,每一个FileItem对应一个表单输出 List<FileItem> list=upload.parseRequest(request); for (FileItem item : list) { if(item.isFormField()){ String name=item.getFieldName(); String value=item.getString("UTF-8"); System.out.println(name+"="+value); }else{ String filename=item.getName(); System.out.println(filename); if(filename==null||filename.trim().equals("")){ continue; } //处理获取到的上传文件的文件名的路径部分,只保留文件名部分 filename=filename.substring(filename.lastIndexOf("\\")+1); //获取item文件上传输入流 InputStream in=item.getInputStream(); //创建一个文件输出流 FileOutputStream out=new FileOutputStream(savePath+"\\"+filename); byte[] buffer=new byte[1024]; int len=0; while((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); item.delete(); message="文件上传成功"; } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } request.setAttribute("message", message); request.getRequestDispatcher("/message.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }                                             jsp页面      <%@ page language="java" pageEncoding="UTF-8"%> 上传用户: 上传文件1:   <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ${message}
游客2q7uranxketok 2021-02-24 11:15:56 0 浏览量 回答数 0

问题

Java 处理 XML 的三种主流技术及介绍:报错

 XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体。本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍...
kun坤 2020-06-09 23:26:43 0 浏览量 回答数 1

问题

JAVA 使用 Decoder decoder = Base64.getDec?报错

在调用摄像头使用 Decoder decoder = Base64.getDecoder();函数时会报错无法解析Base64,这个代码比较久,一开始不能用是因为sun.misc.BASE64Encode...
爱吃鱼的程序员 2020-06-22 23:56:18 0 浏览量 回答数 1

问题

为什么 我的代码会报无法的序列化对象的错误呢??报错

package org.JavaSENetProgramYinyong1; import java.io.IOException; import java.io.InputStream; import java.io.Object...
爱吃鱼的程序员 2020-06-14 22:05:53 0 浏览量 回答数 1

问题

Druid mybatis sqlserver2008 提示无法正常解析 merge using

1、Druid1.1.22+mybatis-spring-boot-starter 1.3.2+SqlServer2008 2、数据库源连接方式是自定义配置的多数据源切换 3、下图为数据源配置文件截图 4、以下代码是数...
游客5qxpdicgv3nbk 2020-09-27 16:03:49 244 浏览量 回答数 1

问题

解析微信接口返回的json 中文昵称为乱码 怎么回事

package Htttp; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import j...
杨冬芳 2019-12-01 20:17:10 3561 浏览量 回答数 1

回答

" public static void main(String[] args) throws IOException { File file = new File("/home/yangxiaohuan/Documents/TokenizeThenSplitParallelDeletePatternLTZero.txt"); InputStreamReader read = new InputStreamReader(new FileInputStream(file), "UTF-8");// 考虑到编码格式 BufferedReader br = new BufferedReader(read); int cnt=0; while(br.ready()){ String text = br.readLine(); cnt++; if(cnt>=47334){ System.out.println(text); } System.out.println("cnt = "+cnt); } } } 原来的代码需要导入下面的类import java.nio.file.Files;import java.nio.file.Paths;但是换成这种形式import java.io.File;import java.io.FileInputStream;就是正常的,没有出错。而且还有朋友说,将原来的文本里面,将出错的那一行,删去一个字符也是不会报错的。很奇怪的问题。不知道为啥用nio.file.Files就是有问题的###### 谢邀。你可能搞错了IO和NIO之间的区别,最基本的一点是IO是面向流的,NIO面向缓冲区的,而你的代码很明显是使用了BufferedReader以及InputStreamReader流,如果使用nio,readLine根本不能读取,NIO只能读取缓冲区,扫描缓冲区的大小,并且在解析数据时,比起阻塞IO流,NIO需要付出更大的代价。"
因为相信,所以看见。 2020-05-27 16:24:27 0 浏览量 回答数 0

回答

最简单的直接用 @ResponseBody返回。 其二我经常使用的多视图,代码如下: JsonView.java package com.szfore.springmvc; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.servlet.view.AbstractView; import com.google.gson.Gson; /** * <b>function:</b>扩展AbstractView 实现JSON-lib视图 * @author hoojo * @createDate 2011-4-28 下午05:26:43 * @file MappingJsonlibVeiw.java * @package com.hoo.veiw.xml * @project SpringMVC4View * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class JsonView extends AbstractView { public static final String DEFAULT_CONTENT_TYPE = "application/json"; public static final String HTML_CONTENT_TYPE = "text/html"; public static final String DEFAULT_CHAR_ENCODING = "UTF-8"; private String encodeing = DEFAULT_CHAR_ENCODING; private Object jsonData = null; private Map<String, Object> _jsonDataMap = new HashMap<String, Object>(); public void setEncodeing(String encodeing) { this.encodeing = encodeing; } private Set<String> renderedAttributes; public JsonView() { setContentType(DEFAULT_CONTENT_TYPE); } public JsonView(Object data) { setContentType(DEFAULT_CONTENT_TYPE); this.jsonData =data; } @Override protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setCharacterEncoding(encodeing); response.setContentType(getContentType()); PrintWriter out = response.getWriter(); if(jsonData != null){ out.print(new Gson().toJson(jsonData)); }else if(!_jsonDataMap.isEmpty()){ out.print(new Gson().toJson(_jsonDataMap)); }else { model = filterModel(model); out.print(new Gson().toJson(model)); } } /** * Filters out undesired attributes from the given model. * <p>Default implementation removes {@link BindingResult} instances and entries not included in the {@link * #setRenderedAttributes(Set) renderedAttributes} property. */ protected Map<String, Object> filterModel(Map<String, Object> model) { Map<String, Object> result = new HashMap<String, Object>(model.size()); Set<String> renderedAttributes = !CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet(); for (Map.Entry<String, Object> entry : model.entrySet()) { if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) { result.put(entry.getKey(), entry.getValue()); } } return result; } public void setJsonData(Object jsonData){ this.jsonData = jsonData; } public static JsonView returnJson(Object jsonData){ JsonView jsonView = new JsonView(); jsonView.setJsonData(jsonData); return jsonView; } public JsonView put(String key, Object value) { _jsonDataMap.put(key, value); return this; } } MultiViewResover.java package com.szfore.springmvc; import java.util.Locale; import java.util.Map; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; /** * @author Jeson * @blog:http://www.gbsou.com * @date:Oct 20, 2009 8:39:27 AM * @version :1.0 * */ public class MultiViewResover implements ViewResolver { private Map<String, ViewResolver> resolvers; private final static String DEFAULT_RESOLVER = "jsp"; private final static String JSON_RESOLVER = "json"; private final static String JSON_VIEW_NAME = "jsonView"; /* * 自定义resolve类默认为jsp视图,其余视图用下划线分隔 */ @Override public View resolveViewName(String viewName, Locale locale) throws Exception { //判断是否为json String tmpViewName = viewName.trim().toLowerCase(); if(JSON_RESOLVER.equals(tmpViewName)){ ViewResolver resolver = resolvers.get(JSON_RESOLVER); return resolver.resolveViewName(JSON_VIEW_NAME, locale); } //若无下划线,默认转向jsp视图 int n = viewName.lastIndexOf("_"); if (n == (-1)){ ViewResolver resolver = resolvers.get(DEFAULT_RESOLVER); return resolver.resolveViewName(viewName, locale); } //有的话截取下划线后面的字符串 这里一般是jsp,ftl,vm与配置文件中的<entry key="ftl">的key匹配 String suffix = viewName.substring(n + 1); // 根据下划线后面的字符串去获取托管的视图解析类对象 ViewResolver resolver = resolvers.get(suffix); // 取下划线前面的部分 那时真正的资源名.比如我们要使用hello.jsp 那viewName就应该是hello_jsp viewName = viewName.substring(0, n); if (resolver != null){ return resolver.resolveViewName(viewName, locale); } return null; } public Map<String, ViewResolver> getResolvers() { return resolvers; } public void setResolvers(Map<String, ViewResolver> resolvers) { this.resolvers = resolvers; } } xml配置 <!-- 多视图 --> <bean name="jsonView" class="com.szfore.springmvc.JsonView"> </bean> <bean id="viewResolver" class="com.szfore.springmvc.MultiViewResover"> <property name="resolvers"> <map> <entry key="jsp"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </entry> <entry key="json"> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> </bean> </entry> </map> </property> </bean> 使用方法: 4 @RequestMapping("/test") public JsonView test(){ return new JsonView(new User()); }
a123456678 2019-12-02 02:11:11 0 浏览量 回答数 0

问题

【精品问答】Java实战200例(附源码)

Java实战200例(附源码) 1.编写一个Java程序,用if-else语句判断某年份是否为闰年 2. 编写一个Java程序在屏幕上输出1!+2!+...
珍宝珠 2020-02-14 11:55:46 16104 浏览量 回答数 10

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来帮助用户成长 本次活动特邀百位阿里技术专家对Java常...
管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

回答

=== 2018/8/30 16:00 终于搞定php对公钥证书签名 根据java SDK源码,用php取公钥证书SN如下: $p = []; $str = file_get_contents('./alipayRootCert.crt'); $p["alipay_root_cert_sn"] = getRootCertSN($str); $str = file_get_contents('./alipayCertPublicKey_RSA2.crt'); $p["alipay_cert_sn"] = getCertSN($str); $str = file_get_contents('./appCertPublicKey.crt'); $p["app_cert_sn"] = getCertSN($str); var_export($p); function getRootCertSN($str) { $arr = preg_split('/(?=-----BEGIN)/', $str, -1, PREG_SPLIT_NO_EMPTY); $str = null; foreach ($arr as $e) { $sn = getCertSN($e, true); if (!$sn) continue; if ($str === null) $str = $sn; else $str .= "_" . $sn; } return $str; } function getCertSN($str, $matchAlgo=false) { /* 根据java SDK源码:AntCertificationUtil::getRootCertSN 对证书链中RSA的项目进行过滤(猜测是gm国密算法java抛错搞不定,故意略去) java源码为: if(c.getSigAlgOID().startsWith("1.2.840.113549.1.1")) 根据 https://www.alvestrand.no/objectid/1.2.840.113549.1.1.html 该OID为RSA算法系。 */ if ($matchAlgo) { openssl_x509_export($str, $out, false); if (!preg_match('/Signature Algorithm:.*?RSA/im', $out, $m)) return; } $a = openssl_x509_parse($str); $issuer = null; // 注意:根据java代码输出,需要倒着排列 CN,OU,O foreach ($a["issuer"] as $k=>$v) { if ($issuer === null) { $issuer = "$k=$v"; } else { $issuer = "$k=$v," . $issuer; } } # echo($issuer . $a["serialNumber"] . "\n"); $sn = md5($issuer . $a["serialNumber"]); return $sn; } 做为首批踩坑者,只能长叹一声 === 2018/8/30 12:15 更新: 名字和序列化取出来像这样: CN=Ant Financial Certification Authority Class 2 R1,OU=Certification Authority,O=Ant Financial,C=CN 42665268812499181166312682537244063920 名字各段之间用逗号分隔,没有额外的空格序列号是10进制数,不是16进制,也没有任何分隔符取根证书sn需要遍历其中所有证书链,分别对name+serial进行md5编码,再用"_"连接起来。 看了半天java源码,终于运行起来,把sn值打出来了,拷贝到php中,终于看到手机上支付页面出来了。结果大致像这样: "app_cert_sn" => "06de145e15a73a8ce87f3eefeddce8b2", //"alipay_cert_sn" => "b1a855128d973b1ff1b1609bbce77fe0", "alipay_root_cert_sn" => "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" 支付宝根证书要用特殊方法来取(源码里用AntCertificationUtil.getRootCertSN),怪不得之前写的不行。 定此接口的人需要深刻检讨,竟然直接以java语言的某个输出来定接口规范。难怪php或其它语言的相关sdk没有出来,我感觉也不好写。 ============ 旧消息 新申请的开放平台帐号,被强制使用了公钥证书签名。 !!!下面开始吐槽: 首先是接口文档比如 https://docs.open.alipay.com/api_1/alipay.trade.app.pay 中完全没提到有公钥证书签名这回事。 调用支付出问题后(报错总是报“支付取消”??),四处查文档,才找到php SDK没有提供此功能,于是决定按接口文档来写。 签名算法的文档中介绍是这样介绍算法的: “SN值是通过解析X.509证书文件中签发机构名称(name)以及内置序列号(serialNumber),将二者拼接后的字符串计算MD5值获取” 尼码,文档完全没有介绍name和serialNumber分别是怎样的文本格式?也没有例子。 我试了name是 “ROOTCA”,“/C=CN/O=NRCAC/CN=ROOTCA”,“C=CN, O=NRCAC, CN=ROOTCA”各种格式,而serialNumber格式我试了 “69e2fec0170ac67b”以及加"69 e2..."、加“69:e2..."等,以及各种组合,都没有验签成功。 于是走第二条路,找它说的java SDK源码来参考。打开java sdk链接,是在maven上的,找了好久才搜到了新版本java源码。 终于找到了介绍的getCertSN函数,其核心是这样实现的: public static String getCertSN(String certPath)throws AlipayApiException{ InputStream inputStream = null; inputStream = new FileInputStream(certPath); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate)cf.generateCertificate(inputStream); MessageDigest md = MessageDigest.getInstance("MD5"); md.update((cert.getIssuerX500Principal().getName()+cert.getSerialNumber()).getBytes()); String certSN = new BigInteger(1,md.digest()).toString(16); //BigInteger会把0省略掉,需补全至32位 certSN = fillMD5(certSN); return certSN; 于是找这cert.getIssuerX500Principal().getName()+cert.getSerialNumber()文档 实在看不懂,算了,还是直接运行这段java代码吧,把结果复制到php中填参数也可以,眼看就要成功了,结果运行java是这样的: java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.2.156.10197.1.301 at sun.security.x509.X509CertInfo.<init>(Unknown Source) at sun.security.x509.X509CertImpl.parse(Unknown Source) at sun.security.x509.X509CertImpl.<init>(Unknown Source) at sun.security.provider.X509Factory.engineGenerateCertificate(Unknown Source) at java.security.cert.CertificateFactory.generateCertificate(Unknown Source) at j1.getCertSN(j1.java:33) at j1.main(j1.java:24) 搜索发现,是java不支持国密算法。。。(https://cloud.tencent.com/info/fcfae2f8bd49fcce8737c7485afcdf29.html)
天笑2001 2019-12-02 02:09:44 0 浏览量 回答数 0

问题

java实现多个不同条件的验证,请问有什么好思路?:报错

在开发过程中遇到一个需求,对于我这样的小白感觉太难了:就是在判断一条数据时:会对一条数据的每个字段设置成一个条件,有时候一个字段会有很多个条件,在开发过程中为了实现可配置...
kun坤 2020-06-07 16:22:29 18 浏览量 回答数 2

问题

freemarker: Template not found for name ?400报错

报错信息: freemarker.template.TemplateNotFoundException: Template not found for name "login.ftl". The name w...
爱吃鱼的程序员 2020-06-08 12:26:39 0 浏览量 回答数 1

回答

看源码: 类TypeDescriptor的isAssignableTo方法,发现有递归的调用。明显的递归太深导致的栈溢出。 建议:检查代码防止死递归(类型转换时)。回复 @yuan_t:看看下面的源码类型转换时会有递归吗  看看源码org.springframework.core.convert.TypeDescriptor.isAssignableTo: publicbooleanisAssignableTo(TypeDescriptortypeDescriptor){      booleantypesAssignable=typeDescriptor.getObjectType().isAssignableFrom(getObjectType());       if(!typesAssignable){          returnfalse;       }       if(isArray()&&typeDescriptor.isArray()){          returngetElementTypeDescriptor().isAssignableTo(typeDescriptor.getElementTypeDescriptor());       }       elseif(isCollection()&&typeDescriptor.isCollection()){          returnisNestedAssignable(getElementTypeDescriptor(),typeDescriptor.getElementTypeDescriptor());       }       elseif(isMap()&&typeDescriptor.isMap()){          returnisNestedAssignable(getMapKeyTypeDescriptor(),typeDescriptor.getMapKeyTypeDescriptor())&&             isNestedAssignable(getMapValueTypeDescriptor(),typeDescriptor.getMapValueTypeDescriptor());       }       else{          returntrue;       }    }回复 @yuan_t:确定你flex中as类中的类型和java中的类型一致。看还有没有其他方面的不匹配。参考:http://www.cnblogs.com/RocD-DuPeng/articles/1751040.html后台对象保存后把保存的对象返回给flex时,会对这个对象进行解析,生成flex里对应的*.as类,它在解析时出错了?
爱吃鱼的程序员 2020-06-14 18:06:51 0 浏览量 回答数 0

回答

等提供了对struts2、spring mvc3的注解(annotation)一些高级特性的支持,而且不是SNAPSHOT版了时,在好好试试.^_^######对这些特性的支持,和这个表单文件上传的本身关系不大,不过能方便这些框架的使用者######您好,能给介绍少为啥会说他的效率在java实现中,比common-fileupload 要快吗?######fastupload采用了BM算法,查找的效率比commons fileupload的算法效率高,而commons fileupload采取的是类似于KMP查找######我使用过fileupload和cos,在实际应用中cos是要比fileupload快,当时cos很久不更新了,不知道这个如何。######我测试的样本是1.7M, 1.7M,1.2M的三个文件,得出的结论是给予这个测试的,不知道你测试的样本是什么样的,能否告诉我?######持续关注.###### 引用来自“unknown”的答案 我使用过fileupload和cos,在实际应用中cos是要比fileupload快,当时cos很久不更新了,不知道这个如何。 对于第一种方式,因为少量buffer写入文件,所以和cos相比,fastupload略快,第二种方式,把所有数据读取到内存后再解析,比目前所有同类中的其他上传组件都要快很多。这里有一些测试数据,http://www.oschina.net/news/32272/fastupload-0-31,其中也fastupload快速的查找算法也有提到 ######补充一下,测试的环境为tomcat 7, jdk 6 ######在这里回复 @仪山湖 已经有一段时间,记得不太清了,是当时分别用fileupload和cos各写了1个servlet做后台,前台用的是一个Flex插件叫FlashFileupload,Flex插件上有上传速度和百分比,上传同一文件,进行比较,小文件差距不太明显,文件越大,cos的优势就越来越明显。用的是tomcat6,jdk6。######能否贴一下你写的代码,供我分析一下###### 很简单的servlet,也是从网上收集的 cos import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.oreilly.servlet.MultipartRequest; public class CosUploadHandler extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/xml; charset=utf-8"); String rootPath = "D:\\"; PrintWriter out = response.getWriter(); String uploadDir = null; // int fileNum = 0; if(request.getParameter("folder") != null) { uploadDir = request.getParameter("folder"); uploadDir = rootPath + uploadDir; } uploadDir = "D:\\upload"; // if(request.getParameter("fileNum")!= null) { // fileNum = Integer.parseInt(request.getParameter("fileNum")); // } int maxPostSize = 200 * 1024 * 1024; MultipartRequest multipartRequest = null; try { multipartRequest = new MultipartRequest(request,uploadDir,maxPostSize,"utf-8"); } catch(IOException ex) { out.println("error!"); out.flush(); out.close(); return; } Enumeration<?> fileNames = multipartRequest.getFileNames(); while(fileNames.hasMoreElements()) { String fileName = (String)fileNames.nextElement(); multipartRequest.getFile(fileName); System.out.println(multipartRequest.getFilesystemName(fileName)); } out.println("success!"); out.flush(); out.close(); } }  fileupload import java.io.File; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadHandler extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/xml; charset=utf-8"); // PrintWriter out = response.getWriter(); String uploadDir = null; if(request.getParameter("uploadDir") != null) { uploadDir = request.getParameter("uploadDir"); uploadDir = "D:\\" +uploadDir; } uploadDir = "D:\\upload"; if(!ServletFileUpload.isMultipartContent(request)) { // out.println("只能处理 multipart/form-data 类型的数据!"); return; } DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); fileItemFactory.setSizeThreshold(1024*1024); ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory); fileUpload.setHeaderEncoding("utf-8"); fileUpload.setFileSizeMax(1024 * 1024 * 200); List itemList = null; Iterator iterator = null; try { itemList = fileUpload.parseRequest(request); } catch (FileUploadException e) { // out.println("解析数据时出现如下问题:"); // e.printStackTrace(out); // e.printStackTrace(); return; } iterator = itemList.iterator(); while(iterator.hasNext()) { FileItem fileItem = (FileItem)iterator.next(); if(!fileItem.isFormField()) { String srcPath = fileItem.getName(); if(srcPath.trim().equals("")){ continue; } String fileName = srcPath.substring(srcPath.lastIndexOf("//") + 1); File destFile = new File(uploadDir,fileName); try { fileItem.write(destFile); } catch (Exception e) { // out.println("存储文件时出现如下问题:"); // e.printStackTrace(out); // e.printStackTrace(); fileItem.delete(); return; } fileItem.delete(); } } // out.flush(); // out.close(); } }  ###### DiskFileItemFactory不是fastupload中的类,fastupload的代码应该是这样的 DiskFileFactory dff = new DiskFileFactory(System.getProperty("user.home") , "utf-8"); dff.setParseThreshold(0x100000); HttpFileUploadParser parser = new HttpFileUploadParser(req, dff); List<MultiPartFile> files = parser.parse();######作者连代码都不舍得放到版本控制里呀。######只有个源代码包吧?在svn和git里面没找到代码。######源码在sourceforge上 http://sourceforge.net/projects/fastupload/
kun坤 2020-06-09 22:46:40 0 浏览量 回答数 0

问题

flink使用fastjson在flatmap中解析Json,在idea中正常,但生产环境失败。

./bin/flink run -p2 -c com.ydx.streaming.StreamingGoodsDetailJob /opt/module/flink-1.11.2/examples/batch/StreamingRecomm...
我有一个梦想 2020-11-23 09:26:44 37 浏览量 回答数 1

回答

白皮书写了如果是<spanstyle="font-family:'MicrosoftYaHei',Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">enctype="multipart/form-data"必须先调用getFile方法,才能正常。回复<aclass='referer'target='_blank'>@lusheng6323:如果不需要获取参数,在拦截器中不去读取请求中的参数,不受影响,直接判断用户是否登录即可关键是我对本次请求不需要读取。我的业务逻辑大概是这样:1、未登录不允许上传,本来有个全局连接器,不需要取任何参数直接就返回客户端。2、登录用户有个上传文件数量限制,在取参数之前就判断是否达到限制,如果达到自己返回客户端。上述两种情况都是一样的,都是不需要取数据就返回客户端。<aclass='referer'target='_blank'>@jfinal,请问处理上有没有好的建议!   当请求到达tomcat、jetty这类容器时,容器会将请求封装成一个HttpServletRequest对象,开发者可以使用这个对象获取请求中的各类参数,例如:request.getParameter(name)。   而enctype="multipart/form-data"请求到达tomcat、jetty这类容器时,请求中的参数与上传文件内容是混合在一起需要自行解析才能得到parameter以及上传的files。所以便出现了common-upload、cos这类文件上传解析的第三方框架。    上面所说的关键点是,当上传文请求到达时,参数与上传文件都是无法读取到的,必须要对请求进行解析,所以,必须要在一个适当的时机将请求解析成 MultipartRequest对象,jfinal将时机选择在了调用getFile(...)之时。   还有一种方案是每次请求对请求类型进行判断再进行解析,但99.9%的请求都是普通的请求而无需解析,所以为了这0.1%的请求在每次请求到来时都做一下是否该解析的判断不划算。    以下是判断请求是否为multipartrequest需要被解析的代码:<preclass="brush:java;toolbar:true;auto-links:false;">Stringcontent_type=controller.getRequest().getContentType();if(content_type!=null&&content_type.toLowerCase().indexOf("multipart")!=-1)//需要解析的情况 <spanstyle="font-size:10pt;line-height:1.5;">  jfinal极度关注性能,有性能洁癖,所以不希望为那0.1%的请求概率而添加上面的代码,而是选择了getFile(..)这个时机进行操作谢谢,耐心解答。不好意思,手机敲的,上面有两处错误:1、拦截器写成了连接器。2、直接返回写成了自己返回。
爱吃鱼的程序员 2020-06-12 14:53:43 0 浏览量 回答数 0

回答

你这个是直接放到request里面的:<preclass="brush:java;toolbar:true;auto-links:false;">if(method.equals("toShow_YWtypeInfo")){//获取业务类型种类request.setAttribute("data",this.toShow_YWtypeInfo(request));} 看一下你后台代码<divclass='ref'> 引用来自“刘万杰”的评论看一下你后台代码<divclass='ref'> 引用来自“刘万杰”的评论看一下你后台代码你在后台加入以下以下代码,可能你返回的仅是字符串,所以前端报错:<preclass="brush:java;toolbar:true;auto-links:false;">response.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=utf-8"); 在ajaxsuccess方法里先alert()下。正常的话用$.each(data,function(idx,item){ }遍历操作(我看你后台返回的就是json格式)。如果是json字符串如'[{"dataId":"20150212136","dataName":"调整基本工资标准"},{"dataId":"20150212136","dataName":"增加离退休费"}]'需要先解析data用vardataObj=eval("("+arr+")");解析在遍历 <divclass='ref'> 引用来自“岁月轻狂k”的评论在ajaxsuccess方法里先alert()下。正常的话用$.each(data,function(idx,item){ }遍历操作(我看你后台返回的就是json格式)。如果是json字符串如'[{"dataId":"20150212136","dataName":"调整基本工资标准"},{"dataId":"20150212136","dataName":"增加离退休费"}]'需要先解析data用vardataObj=eval("("+arr+")");解析在遍历 if(method.equals("toShow_YWtypeInfo")){//获取业务类型种类request.setAttribute("data",this.toShow_YWtypeInfo(request));}这有问题,看你后台代码那就时你后台返回的数据有问题呗。用火狐的RESTClient测试下<divclass='ref'> 引用来自“刘万杰”的评论你在后台加入以下以下代码,可能你返回的仅是字符串,所以前端报错:<preclass="brush:java;toolbar:true;auto-links:false;">response.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=utf-8"); 你的返回类型有问题,看你的response的<spanstyle="color:#545454;font-family:'SegoeUI',Tahoma,sans-serif;font-size:12px;font-weight:bold;line-height:normal;background-color:#FFFFFF;">Content-Type是text/html,而你ajax请求已经注明返回结果是json,所以不会进入回调方法而直接报错。所以检查一下你的服务端,正确的json返是ContentType:application/json; 1.Content-Type设置为application/json; 2.返回的时候不要使用GBK,试着改用UTF-8试试; 3.如果还不行,考虑不要直接返回JSON数组,在外面在包一个对象试试;
爱吃鱼的程序员 2020-06-09 11:59:04 0 浏览量 回答数 0

回答

人家log4j读取web.xml的变量逻辑凭啥一定要跟spring一致呢,这个又没形成标准,具体你还是自己看看Log4jConfigListener里面源码怎么写的###### [F:\tomcat\webapps\hoteldemo\classpath*:log4j.properties] not found 首先系统这样说就是找不到你所指向的路径, 但是contextConfigLocation配置的时候是结合web.xml的配置文件内容一起加载的,系统自动识别支持你这样的classpath*的写法 单写的话肯定是不行的 因为没有描述文件让系统知道你写的代码 所以加载不上就报错 log4j.rootCategory=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n log4j.category.org.springframework.beans.factory=error 主要常用的属性也就这么多了 ###### 引用来自“838384855”的评论 [F:\tomcat\webapps\hoteldemo\classpath*:log4j.properties] not found 首先系统这样说就是找不到你所指向的路径, 但是contextConfigLocation配置的时候是结合web.xml的配置文件内容一起加载的,系统自动识别支持你这样的classpath*的写法 单写的话肯定是不行的 因为没有描述文件让系统知道你写的代码 所以加载不上就报错 log4j.rootCategory=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n log4j.category.org.springframework.beans.factory=error 主要常用的属性也就这么多了 这个我已经写了的,写在log4j.properties中,log4j.properties与applicationContext.xml等配置文件都在同一目录下,我今天看了一下源码,Log4jConfigListener的代码有如下内容 public class Log4jConfigListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { Log4jWebConfigurer.initLogging(event.getServletContext()); } public void contextDestroyed(ServletContextEvent event) { Log4jWebConfigurer.shutdownLogging(event.getServletContext()); } } 然后我看了initLogging,它有一个路径判断: public static void initLogging(ServletContext servletContext) { // Expose the web app root system property. if (exposeWebAppRoot(servletContext)) { WebUtils.setWebAppRootSystemProperty(servletContext); } // Only perform custom log4j initialization in case of a config file. String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM); if (location != null) { // Perform actual log4j initialization; else rely on log4j's default initialization. try { // Resolve system property placeholders before potentially // resolving a real path. location = SystemPropertyUtils.resolvePlaceholders(location); // Leave a URL (e.g. "classpath:" or "file:") as-is. if (!ResourceUtils.isUrl(location)) { // Consider a plain file path as relative to the web // application root directory. location = WebUtils.getRealPath(servletContext, location); } // Write log message to server log. servletContext.log("Initializing log4j from [" + location + "]"); // Check whether refresh interval was specified. String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM); if (intervalString != null) { // Initialize with refresh interval, i.e. with log4j's watchdog thread, // checking the file in the background. try { long refreshInterval = Long.parseLong(intervalString); Log4jConfigurer.initLogging(location, refreshInterval); } catch (NumberFormatException ex) { throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage()); } } else { // Initialize without refresh check, i.e. without log4j's watchdog thread. Log4jConfigurer.initLogging(location); } } catch (FileNotFoundException ex) { throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage()); } } } 在initLogging中需要进行路径验证, 跟踪isurl()函数,其中定义了一些公共变量: public static final java.lang.String CLASSPATH_URL_PREFIX = "classpath:"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String FILE_URL_PREFIX = "file:"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String URL_PROTOCOL_FILE = "file"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String URL_PROTOCOL_JAR = "jar"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String URL_PROTOCOL_ZIP = "zip";   省略了一部分,其中没有classpath*这一变量,因此我觉得log4j中会把classpath*当成是路径变量之一,所以它识别到的路径是错误的,因此而报错, 但是在contextConfigLocation中,我是可以使用classpath*:applicationContext.xml,它的路径解析是可以写成classpath*的方式的,两者的路径解析貌似不一样,我还没有找到contextConfigLocation的一些配置,还是有些疑惑。
kun坤 2020-06-02 15:58:10 0 浏览量 回答数 0

回答

人家log4j读取web.xml的变量逻辑凭啥一定要跟spring一致呢,这个又没形成标准,具体你还是自己看看Log4jConfigListener里面源码怎么写的###### [F:\tomcat\webapps\hoteldemo\classpath*:log4j.properties] not found 首先系统这样说就是找不到你所指向的路径, 但是contextConfigLocation配置的时候是结合web.xml的配置文件内容一起加载的,系统自动识别支持你这样的classpath*的写法 单写的话肯定是不行的 因为没有描述文件让系统知道你写的代码 所以加载不上就报错 log4j.rootCategory=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n log4j.category.org.springframework.beans.factory=error 主要常用的属性也就这么多了 ###### 引用来自“838384855”的评论 [F:\tomcat\webapps\hoteldemo\classpath*:log4j.properties] not found 首先系统这样说就是找不到你所指向的路径, 但是contextConfigLocation配置的时候是结合web.xml的配置文件内容一起加载的,系统自动识别支持你这样的classpath*的写法 单写的话肯定是不行的 因为没有描述文件让系统知道你写的代码 所以加载不上就报错 log4j.rootCategory=debug, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n log4j.category.org.springframework.beans.factory=error 主要常用的属性也就这么多了 这个我已经写了的,写在log4j.properties中,log4j.properties与applicationContext.xml等配置文件都在同一目录下,我今天看了一下源码,Log4jConfigListener的代码有如下内容 public class Log4jConfigListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { Log4jWebConfigurer.initLogging(event.getServletContext()); } public void contextDestroyed(ServletContextEvent event) { Log4jWebConfigurer.shutdownLogging(event.getServletContext()); } } 然后我看了initLogging,它有一个路径判断: public static void initLogging(ServletContext servletContext) { // Expose the web app root system property. if (exposeWebAppRoot(servletContext)) { WebUtils.setWebAppRootSystemProperty(servletContext); } // Only perform custom log4j initialization in case of a config file. String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM); if (location != null) { // Perform actual log4j initialization; else rely on log4j's default initialization. try { // Resolve system property placeholders before potentially // resolving a real path. location = SystemPropertyUtils.resolvePlaceholders(location); // Leave a URL (e.g. "classpath:" or "file:") as-is. if (!ResourceUtils.isUrl(location)) { // Consider a plain file path as relative to the web // application root directory. location = WebUtils.getRealPath(servletContext, location); } // Write log message to server log. servletContext.log("Initializing log4j from [" + location + "]"); // Check whether refresh interval was specified. String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM); if (intervalString != null) { // Initialize with refresh interval, i.e. with log4j's watchdog thread, // checking the file in the background. try { long refreshInterval = Long.parseLong(intervalString); Log4jConfigurer.initLogging(location, refreshInterval); } catch (NumberFormatException ex) { throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage()); } } else { // Initialize without refresh check, i.e. without log4j's watchdog thread. Log4jConfigurer.initLogging(location); } } catch (FileNotFoundException ex) { throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage()); } } } 在initLogging中需要进行路径验证, 跟踪isurl()函数,其中定义了一些公共变量: public static final java.lang.String CLASSPATH_URL_PREFIX = "classpath:"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String FILE_URL_PREFIX = "file:"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String URL_PROTOCOL_FILE = "file"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String URL_PROTOCOL_JAR = "jar"; // Field descriptor #73 Ljava/lang/String; public static final java.lang.String URL_PROTOCOL_ZIP = "zip";   省略了一部分,其中没有classpath*这一变量,因此我觉得log4j中会把classpath*当成是路径变量之一,所以它识别到的路径是错误的,因此而报错, 但是在contextConfigLocation中,我是可以使用classpath*:applicationContext.xml,它的路径解析是可以写成classpath*的方式的,两者的路径解析貌似不一样,我还没有找到contextConfigLocation的一些配置,还是有些疑惑。
kun坤 2020-06-14 16:31:12 0 浏览量 回答数 0

回答

一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发。 使用了 api和jni; 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式; n,8,1,没得选; 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进行定时刷新; 发送区的数据以及一些设置项,在程序关闭时会自动保存,打开时自动载入; jni使用最新的NDKr8b重新编译了一下 简单编写步骤: 1.新建一个项目,自己起个名字 2.直接复制serialport api和jni文件夹到新建的工程,如果不想自己编译jni,就连libs文件夹也一起复制 3.去android官方网站下载NDK,解压,在CMD中转到jni目录,并执行 绝对路径ndk-build 4.自己再封装一个工具类或直接使用SerialPort类都行,举个直接使用的例: 直接剽窃原项目的SerialPortActivity.java,并稍微改一下,重点改这里 mSerialPort = mApplication.getSerialPort(); 这里可以改成 new SerialPort(new File("/dev/s3c2410_serial0"), 9600, 0);//COM0,波特率9600 SerialPortFinder的使用就没什么好讲的了,实例化后用.getAllDevicesPath()就能获取到所有设备了。其它如数据转换等请参考源码 源码可以参考谷歌android-serialport-api例子 二,串口通信协议解析 1.通信基本格式 字段 描述 长度(字节) 起始符 0F,十六进制码 1 信息类型 一个字节,十六进制码(0F,F0,FF等保留码不用)1 信息长度 是信息内容的长度,ASCII码表示(0~9,A~F,最大长度为256)(例如长为11个,十六进制是0B,则两个字节就写0x30 0x42)。 注:因为最大长度256不能满足有些指令的要求,所以对长度做了扩展,下面是扩展说明: 如果第一个字节的最高位为1,则表示扩展长度。在扩展长度状态下,其他15个字节通过16进制大端模式来保存长度。比如:0x80 0x12表示长度为0x001 2,0x81 0x12表示长度为0x0112。2 信息内容 一组十六进制码 N 校验 一个字节,十六进制码,是自信息类型起至对象号止所有码的异或。1 结束符 F0,一个字节,十六进制码 (为了保证可靠性,车机下发的结束符为F0 FF)1 2.协议解析 /** * 读取终端设备数据 * @author Administrator */ private class ReadThread extends Thread { @Override public void run() { super.run(); // 定义一个包的最大长度 int maxLength = 2048; byte[] buffer = new byte[maxLength]; // 每次收到实际长度 int available = 0; // 当前已经收到包的总长度 int currentLength = 0; // 协议头长度4个字节(开始符1,类型1,长度2) int headerLength = 4; while (!isInterrupted()) { try { available = mInputStream.available(); if (available > 0) { // 防止超出数组最大长度导致溢出 if (available > maxLength - currentLength) { available = maxLength - currentLength; } mInputStream.read(buffer, currentLength, available); currentLength += available; } } catch (Exception e) { e.printStackTrace(); } int cursor = 0; // 如果当前收到包大于头的长度,则解析当前包 while (currentLength >= headerLength) { // 取到头部第一个字节 if (buffer[cursor] != 0x0F) { --currentLength; ++cursor; continue; } int contentLenght = parseLen(buffer, cursor, headerLength); // 如果内容包的长度大于最大内容长度或者小于等于0,则说明这个包有问题,丢弃 if (contentLenght <= 0 || contentLenght > maxLength - 5) { currentLength = 0; break; } // 如果当前获取到长度小于整个包的长度,则跳出循环等待继续接收数据 int factPackLen = contentLenght + 5; if (currentLength < contentLenght + 5) { break; } // 一个完整包即产生 // proceOnePacket(buffer,i,factPackLen); onDataReceived(buffer, cursor, factPackLen); currentLength -= factPackLen; cursor += factPackLen; } // 残留字节移到缓冲区首 if (currentLength > 0 && cursor > 0) { System.arraycopy(buffer, cursor, buffer, 0, currentLength); } } } } /** * 获取协议内容长度 * @param header * @return */ public int parseLen(byte buffer[], int index, int headerLength) { // if (buffer.length - index < headerLength) { return 0; } byte a = buffer[index + 2]; byte b = buffer[index + 3]; int rlt = 0; if (((a >> 7) & 0x1) == 0x1) { rlt = (((a & 0x7f) << 8) | b); } else { char[] tmp = new char[2]; tmp[0] = (char) a; tmp[1] = (char) b; String s = new String(tmp, 0, 2); rlt = Integer.parseInt(s, 16); } return rlt; } protected void onDataReceived(final byte[] buffer, final int index, final int packlen) { System.out.println("收到信息"); byte[] buf = new byte[packlen]; System.arraycopy(buffer, index, buf, 0, packlen); ProtocolAnalyze.getInstance(myHandler).analyze(buf); }
爵霸 2019-12-02 01:56:32 0 浏览量 回答数 0

问题

求助RDSSQLServer2008JAVADBCP连接池问题

应用中使用DBCP连接池,线下环境部署运行正常,但迁移到云上后就抛连接获取错误。 于是写了个测试         String JDriver="com.microsoft.sqlserver....
icepoint 2019-12-01 20:59:41 7745 浏览量 回答数 2

问题

shiro+ssm做权限管理,使用自定义Realm项目启动就报错?报错

报错信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter...
爱吃鱼的程序员 2020-06-06 10:07:56 0 浏览量 回答数 1

问题

shiro+ssm做权限管理,使用自定义Realm项目启动就报错?报错

报错信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter...
爱吃鱼的程序员 2020-06-06 10:15:42 0 浏览量 回答数 1

问题

还原json循环引用对象的一种办法? 400 报错

还原json循环引用对象的一种办法? 400 报错 后端数据实体都是由hibernate生成的,与浏览器客户端交互json时,采用了alibaba FastJson库。 首先要说fastJson的确为...
爱吃鱼的程序员 2020-05-30 22:21:39 0 浏览量 回答数 1

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT