java后台发送请求并获取返回值(续)
在java后端发送请求给另一个平台,从而给前端实现 "透传”的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀疑是编码格式或透传过程中处理的问题,将编码格式进行了设置并查资料了解了一下透传过程中代码的处理方法,虽然最后发现是前后端定义的json串的属性名称不一致导致(后端传输数据中属性名label写成了lable。。。),但在此还是记录一下“透传”处理过程中处理数据流的三种方式。
主要是介绍经常用于处理数据流的InputStream 、InputStreamReader和BufferedReader 三个类,并给出示例Demo。
下面有三个Demo(Demo访问百度主页获取字节流然后输出)来分别说明三个类的作用:
Demo1:
//InputStream 类package 数据流;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;public class Test_InputStream {/*** 获取字节流* @param url* @return*/private String getStream(String url){//获取字节流InputStream in = null;String result = "";try {in = new URL(url).openStream();int tmp;while((tmp = in.read()) != -1){result += (char)tmp;}} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//输出字节流return result;}public static void main(String[] args){String URL = "http://www.baidu.com";Test_InputStream test = new Test_InputStream();System.out.println(test.getStream(URL));}}
通过URL连接获取了InputStream流连接,然后通过read方法来一个字节一个字节的读取字节流并组合在一起(read方法返回-1则数据读取结束),最后以reasults返回。
输出如下:60 33 68 79 67 84 89 80 69 32 104 116 109 108 62 60 33 45 45 83 84 65 84 ……
这就是字节流,每个数字都是一个字节(Byte,8位),所以如果读取英文的话,用字节流,然后用(char)强制转化一下就行了,但如果有中文等双字节语言或者说需要指定字符编码集的情况,就必须用到InputStreamReader将字节流转化为字符流了。
Demo2:
//InputStreamReader类package 数据流;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;public class Test_InputStreamReader {/** 得到字符流前需先有字节流*/private String getStream(String url){try {//得到字节流InputStream in = new URL(url).openStream();//将字节流转化成字符流,并指定字符集InputStreamReader isr = new InputStreamReader(in,"UTF-8");String results = "";int tmp;while((tmp = isr.read()) != -1){results += (char)tmp;}return results;} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubString URL = "http://www.baidu.com";Test_InputStreamReader test = new Test_InputStreamReader();System.out.println(test.getStream(URL));}}
先获取字节流,然后创建InputStreamReader将字节流转化成字符流,并指定其字符集为UTF-8,然后使用强制转化将read到的int字节转化为char型,此时已可以输出中文字符,并且可速度上看出,输出字符流比输出字节流要快。下面是结果的部分截图:

Demo3:
//BufferedReader类package 数据流;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;public class Test_BufferedReader {/** 字节流——字符流——缓存输出的字符流*/private String getStream(String url){try {//得到字节流InputStream in = new URL(url).openStream();//将字节流转化成字符流,并指定字符集InputStreamReader isr = new InputStreamReader(in,"UTF-8");//将字符流以缓存的形式一行一行输出BufferedReader bf = new BufferedReader(isr);String results = "";String newLine = "";while((newLine = bf.readLine()) != null){results += newLine+"\n";}return results;} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubString URL = "http://www.baidu.com";Test_BufferedReader test = new Test_BufferedReader();System.out.println(test.getStream(URL));}}
获取字符流后,可直接缓存,然后从缓存区取出,这时的速度比InputStreamReader又将快上很多。输出结果同上。
总结: 在读取网络数据流的时候,可以通过先用InputStream获取字节流、InputStreamReader将字节流转化成字符流、BufferedReader将字符流以缓存形式输出的方式来快速获取网络数据流。
参考网址:http://blog.csdn.net/zgljl2012/article/details/47267609
java后台发送请求并获取返回值(续)的更多相关文章
- java后台发送请求并获取返回值
项目中需要前端发送请求给后端,而后端需要从另一个平台中取数据然后再透传给前端,通过下述代码将其实现.在此记录一下. package com.autotest.utils; import java.io ...
- JSF页面中使用js函数回调后台bean方法并获取返回值的方法
由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...
- Java调用Python脚本并获取返回值
在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...
- 使用post向webservice发送请求,并且返回值
注意,这个方法仅仅适用于:该post页面处于websercive 站点下,或者是与webservice同属于一个主站点,即在iis里属于同一主站点的同级虚拟目录. protected void btn ...
- WebRequest发送请求并接收返回值
public string getXmlStr(string hphmcode) { string Url = "http://localhost:80 ...
- java后端发送请求并获取响应
URL wsUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection(); conn. ...
- 模拟HTTP请求获取返回值
package org.jeecgframework.core.util; import java.io.BufferedReader; import java.io.IOException; imp ...
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...
- JAVA中执行JavaScript代码并获取返回值
JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...
随机推荐
- ssh 跳板机部署
1.首先创建存放日志的文件夹并开放读写权限 mkdir /var/log/jump/ chmod -R 777 /var/log/jump/ 2.将原有ssh程序修改为另外 ...
- CSS魔法(五)项目实战
三大标签--title.description.keyword 淘宝网 <title>淘宝网 - 淘!我喜欢</title> <meta name="spm ...
- Polymer初探
Polymer是什么? Polymer英文为 n.聚合物:多聚体 网络高分子:聚合体:高分子聚合物 应用在Web组件场景, 表达的是, 一个一个小的Web组件,可以通过此框架聚合为一个 整个页面. h ...
- MySQL的一些基本命令笔记(2)
1.逻辑运算符的补充 between 的用法:(在....之间) select column1,column2,......columnN from 表名 where columnX between ...
- C++ primer 11章关联容器
map set multimap (关键字可重复出现) multiset 无序 unordered_map (用哈希函数组织的map) unordered_set unordered_multima ...
- oracle 查看后台正在执行的脚本
select username,lockwait,status,machine,program from v$session where sid in (select session_id from ...
- Webstorm添加新建.vue文件功能并支持高亮vue语法和es6语法
转载:https://blog.csdn.net/qq_33008701/article/details/56486893 Webstorm 添加新建.vue文件功能并支持高亮vue语法和es6语法 ...
- Ubuntu18.04下Python Web环境搭建
Python3的安装与卸载 pip, pip3的安装 Django2.x的安装 mysql的安装及命令行工具mycli的安装 virtualenv及virtualenvwrapper的安装 IPyth ...
- 第28月第5天 uibutton交换方法
1. //交换系统的方法 @implementation UIControl (MYButton) + (void)load { Method a = class_getInstanceMethod( ...
- 【Vue】中 $attrs 中的使用方法
vue官网是这样介绍的: 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外).当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 ( ...