在java后端发送请求给另一个平台,从而给前端实现 "透传”的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀疑是编码格式或透传过程中处理的问题,将编码格式进行了设置并查资料了解了一下透传过程中代码的处理方法,虽然最后发现是前后端定义的json串的属性名称不一致导致(后端传输数据中属性名label写成了lable。。。),但在此还是记录一下“透传”处理过程中处理数据流的三种方式。

主要是介绍经常用于处理数据流的InputStream 、InputStreamReader和BufferedReader 三个类,并给出示例Demo。

  • InputStream : 是所有字节输入流的超类,一般使用它的子类:FileInputStream等,它能输出字节流;
  • InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符;
  • BufferedReader : 提供通用的缓冲方式文本读取,readLine读取一个文本行, 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
  • 下面有三个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 block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.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 block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String 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 block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String 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后台发送请求并获取返回值(续)的更多相关文章

    1. java后台发送请求并获取返回值

      项目中需要前端发送请求给后端,而后端需要从另一个平台中取数据然后再透传给前端,通过下述代码将其实现.在此记录一下. package com.autotest.utils; import java.io ...

    2. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

      由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

    3. Java调用Python脚本并获取返回值

      在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...

    4. 使用post向webservice发送请求,并且返回值

      注意,这个方法仅仅适用于:该post页面处于websercive 站点下,或者是与webservice同属于一个主站点,即在iis里属于同一主站点的同级虚拟目录. protected void btn ...

    5. WebRequest发送请求并接收返回值

      public string getXmlStr(string hphmcode)         {            string Url = "http://localhost:80 ...

    6. java后端发送请求并获取响应

      URL wsUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection(); conn. ...

    7. 模拟HTTP请求获取返回值

      package org.jeecgframework.core.util; import java.io.BufferedReader; import java.io.IOException; imp ...

    8. 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

      接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...

    9. JAVA中执行JavaScript代码并获取返回值

      JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...

    随机推荐

    1. 细说JDK日志组件

      1. 概述 JDK自带的日志组件在包java.util.logging下,如图: 2. 架构如上图所示,JDK日志组件核心元素包括:Logger,Handler,Filter和Formatter,他们 ...

    2. Photoshop影像匀色技术

      本篇博文简单介绍一下利用PhotoShop对影像数据进行匀色的相关技术 影像一般有img和tif两种各种.一般的影像如果在PS中打开,会丢失坐标信息.在做匀色处理中,普通的做法是,先将坐标信息导出来, ...

    3. 【python小练】0010

      第 0010 题:使用 Python 生成类似于下图中的字母验证码图片 思路: 1. 随机生成字符串 2. 创建画布往上头写字符串 3. 干扰画面 code: # codeing: utf-8 fro ...

    4. 使用PHP+MySql操作——实现微信投票功能

      1. 投票主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

    5. PHP文件系统管理

      文件概念: 第一个是windows的文件,另一个php根据LINUX的文件,两者是有所不同的,我们说的页面基于windows的文件可以是是文件夹(也就是目录)或是文件,而php两者都必须有,它包含目录 ...

    6. QIM量化

      基于量化思想的水印嵌入模型的主要目的是为了实现盲检测.其主要思想是根据水印信息的不同将原始载体数据量化到不同的量化区间,而检测时根据所属的量化区间来识别水印信息.常见的两种量化方式是QIM和SCS方法 ...

    7. Nginx下配置网站ssl实现https访问

      第一步:服务器环境,lnmp即Linux+Nginx+PHP+MySQL,本文中以我的博客为例,使用的是阿里云最低档的vps+免费的Linux服务器管理系统WDCP快速搭建的lnmp环境(同类产品还有 ...

    8. Python之线程 1 - 线程基本概念

      一 背景知识 1.进程 2.有了进程为什么还要线程 3.线程的出现 二 线程和进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 1.用户级线程 ...

    9. moment.js 时间戳转换

      1. 一段时间以0点为标准 : 2018-03-15 00:00:00- 2018-03-21 00:00:00 let startTime = moment('2018-03-15').format ...

    10. mui的switch开关的应用

      HTML: <!--mui的switch开关--> <div class="mui-content-padded"> <h5>switch开关m ...