Java学习总结(随笔)——利用JSON解析实现网络下载

利用JSON实现网络下载
1.下载json字符串:
(1)将网址封装到URL中:URL url=new URL(“网址”);
(2)利用url打开HTTP: HttpURLConnection conn= (HttpURLConnection)ulr.openConnection();
(3)开始连接:conn.connect();
(4)利用输入流读取网络数据;
(5)将下载的数据转换成字节数组;
2.下载所需资源:与上述步骤相同,最后利用输出流,写入到目标地址
例1(我们以下载图片为例(注释中详细的说明了操作步骤)):
(1)先引入jar包
(2)我们先观察一下我们要下载的目标JSON
目标JSON地址:
http://open.qyer.com/qyer/recommands/index?client_id=qyer_android&client_secret=9fcaae8aefc4f9ac4915&v=1&track_deviceid=860806022766611&track_app_version=5.1.1&track_app_channel=360m&track_device_info=mx2&track_os=Android4.2.1&track_user_id=&app_installtime=1404882938883%20HTTP/1.1
使用在线JSON校验格式,便于我们观察JSON字符串的组成
(3)编写代码:
下载工具类(包含下载JSON字符串和图片的两个方法):

package org.download.photo;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadUtil {
    // JSON字符串下载
    public static String downloadJSON(String path) {
        URL url = null;
        InputStream input = null;
        HttpURLConnection conn = null;
        byte date[] = null;
        try {
            url = new URL(path);// 1.将网址封装到URL中
            conn = (HttpURLConnection) url.openConnection();// 2.打开http连接
            conn.connect();// 3.开始连接
            input = conn.getInputStream();// 4.获取网络输入流,用于读取要下载内容
            ByteArrayOutputStream bos = new ByteArrayOutputStream();// 5.获取字节转换流
            byte[] b = new byte[1024];
            int len = 0;
            while ((len = input.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            date = bos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return new String(date);
    }

    //下载图片
    public static void downloadPhoto(String photo,String dest) {
        URL url = null;
        InputStream input = null;
        HttpURLConnection conn = null;
        OutputStream out=null;
        byte date[] = null;
        try {
            out=new FileOutputStream(dest);
            url = new URL(photo);// 1.将网址封装到URL中
            conn = (HttpURLConnection) url.openConnection();// 2.打开http连接
            conn.connect();// 3.开始连接
            input = conn.getInputStream();// 4.获取网络输入流,用于读取要下载内容
            ByteArrayOutputStream bos = new ByteArrayOutputStream();// 5.获取字节转换流
            byte[] b = new byte[1024];
            int len = 0;
            while ((len = input.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            date = bos.toByteArray();
            out.write(date);
            System.out.println(dest+"图片下载成功,以写入本地磁盘..");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                input.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

下载测试类(主方法):

package org.download.photo;

import java.io.File;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Downloadtest {

    public static void main(String[] args) {
        // 1.下载JSON字符串
        String path = "http://open.qyer.com/qyer/recommands/index?client_id=qyer_android&client_secret=9fcaae8aefc4f9ac4915&v=1&track_deviceid=860806022766611&track_app_version=5.1.1&track_app_channel=360m&track_device_info=mx2&track_os=Android4.2.1&track_user_id=&app_installtime=1404882938883%20HTTP/1.1";
        String jsonStr = DownloadUtil.downloadJSON(path);
        // System.out.println(jsonStr);//测试JSON字符串是否下载成功
        // 2.解析JSON字符串,获取到photo数据(此处使用官方解析)
        try {
            // 3.将JSON字符串转化为java对象
            JSONObject jsonObj = new JSONObject(jsonStr);
            // 4.根据key值获取value值
            JSONObject jsonData = jsonObj.optJSONObject("data");// 先获取data对象(一级目录)
            JSONArray jsonPlace = jsonData.optJSONArray("place");// 再获取数组形式的place(二级目录)
            // 数组形式的jsonPlace,获取photo数据
            for (int i = 0; i < jsonPlace.length(); i++) {
                JSONObject jsonOb = jsonPlace.optJSONObject(i);// 获取数组中的各个对象
                String photoStr = jsonOb.optString("photo");// 获取其中的photo字符串
                String[] picArray = photoStr.split("/");
                // 5.开始下载图片,并为其命名
                DownloadUtil.downloadPhoto(photoStr, "e:" + File.separator
                        + "myphoto" +File.separator+ picArray[picArray.length - 1]);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
}

(4)运行结果:

例2(下载网络图片,不用JSON解析,建立下载接口,回调接口):
(1)编写代码:
下载接口:

package org.download.nettu;

//回调接口
public interface Load {
    void load(byte[] b);

}

下载方法类:

package org.download.nettu;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadUtilPic {
    //图片
    public static void downloadPhoto(String path,Load load){
        //1.将网址封装到URL中
        URL url=null;
        InputStream input=null;
        HttpURLConnection conn=null;
        try {
            url=new URL(path);
            conn=(HttpURLConnection) url.openConnection(); //获取网络连接对象
            conn.connect();//开启网络连接
            input=conn.getInputStream();//获取网络输入流
            ByteArrayOutputStream bos=new ByteArrayOutputStream();
            int len=0;
            byte[] b=new byte[1024];
            while((len=input.read(b))!=-1){
                bos.write(b, 0, len);
            }
            //将下载的数据转换成字节数组
            byte[] date= bos.toByteArray();
            load.load(date); //回调load方法
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

测试下载类(主方法):

package org.download.nettu;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class DownloadTest {

    public static void main(String[] args) {
        String path="http://static.qyer.com/upload/mobile/operation/6e/e1/6ee105f770fe63f625422912b1465e2e.jpg";
        //调用下载方法
        DownloadUtilPic.downloadPhoto(path, new Load() {

            @Override
            public void load(byte[] b) {
                OutputStream out=null;
                try {
                    out=new FileOutputStream("f:"+File.separator+"abcdgdh.jpg");
                    BufferedOutputStream bos=new BufferedOutputStream(out);
                    bos.write(b);
                    System.out.println("图片下载成功。。");
                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }

}

运行结果:

原文地址:http://blog.51cto.com/13501268/2129718

时间: 2024-08-01 06:03:52

Java学习总结(随笔)——利用JSON解析实现网络下载的相关文章

JAVA学习日志——Ajax和Json

# JAVA学习日志--Ajax和Json # Ajax和Json在一个web项目中可以说是经常用到了,Ajax是一种用于创建快速动态网页的技术,而Json则是一种与语言无关的数据交换的格式.以下是个人在学习过程中的总结. 一.Ajax 1.同步与异步 在学习Ajax之前我们要先知道什么是同步,什么是异步. 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态. 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随    意做其他事情,不会被卡

Java中使用Jackson进行JSON解析和序列化

Java中使用Jackson进行JSON解析和序列化 1.添加依赖,在Maven的pom.xml文件中添加以下依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency> 2.封装JSON解

在java项目中怎样利用Dom4j解析XML文件获取数据

在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进行直接读取,能够说这是程序中直接封装好的,包含配置文件里书写的格式等等.那么,假设.想要在配置文件里写一些其它的数据,直接以XML文件的格式进行书写.这个时候在后台怎样读取XML文件里的数据呢?这里利用Dom4j来解析XML文件里连接oracle数据库的xml数据. 在使用之前,首先要在自己的项目中

在java项目中如何利用Dom4j解析XML文件获取数据

在以前的学习.net时经常会遇到利用配置文件来解决项目中一些需要经常变换的数据,比如数据库的连接字符串儿等.这个时候在读取配置文件的时候,我们通常会用到一个雷configuration,通过这个类来进行直接读取,可以说这是程序中直接封装好的,包括配置文件中书写的格式等等.那么,如果,想要在配置文件中写一些其他的数据,直接以XML文件的格式进行书写,这个时候在后台如何读取XML文件中的数据呢?这里利用Dom4j来解析XML文件中连接oracle数据库的xml数据. 在使用之前,首先要在自己的项目中

Java学习笔记之[ 利用扫描仪Scanner进行数据输入 ]

/*********数据的输入********//**利用扫描仪Scanner进行数据输入 怎么使用扫描仪Scanner *1.放在类声明之前,引入扫描仪 import java.util.Scanner; *2.声明一个新的扫描仪(即向内存申请一个空间) Scanner in *3.赋值 in=new Scanner(System.in); Scanner in=new Scanner(System.in); *4.使用扫描仪 整形数据输入:in.nextInt()来接收 双精度小数输入:in

Java学习(随笔)—Spring boot以及Gradle相关

一.Spring boot相关1.spring boot是什么?(1)为所有Spring开发者提供了一个更快更广泛的入门体验(2)开箱即用,不合适的也可以随时抛弃(3)提供一系列大型项目常用的非功能型特征(4)零配置(不需要XML配置,遵循"约定大于配置")2.Spring boot与其他框架的关系 3.快速创建基于Spring boot的web项目,利用Gradel来管理jar包创建成功后解压项目4.Gradel编译项目:(1)先确定我们的开发环境(java):java -versi

Java学习的随笔(2)Java语言的三大特性

1.面向对象的三大特性 面向对象的三大特性主要包括:继承.封装.多态 (1)继承:就是指子类(导出类)获得了基类的全部功能(所有的域和方法).  注:在子类中,想要调用基类的方法可以使用“super.方法名”来调用. 术语:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继 承了原始类的       特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法

Demo XML 、 JSON 解析 AND 网络HTTP请求

有道云笔记分享:http://note.youdao.com/share/?id=7950b949a5017a698a9ecc95bc250ec5&type=note 后台服务端:C#.服务器搭建+公网发布. 前端Cocos2d-x(C++)可交叉编译到 应用+游戏开发 coder:倪新生 Date:2015-07-30 Email:[email protected]

Java学习路线|转至CodeSheep

Java学习路线 基础知识 . 基本语法 基本网络知识:tcp/ip http/https 工具方面 . 操作系统:linux (CentOS\Ubuntu\Fe..) 代码管理:svn/git 持续集成(CI/CD):jenkins ava的项目管理工具:maven/gradle 框架方面 . ssh (spring+structs+hibernate)(已过时) ssm:spring +springmvc+mybatis(流行) spring boot 中间件 . MQ 消息队列 RPC 通