Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子:
Android HTTP实例 使用GET方法和POST方法发送请求
另一种常用的建立Http连接的常用方式是利用Java在JDK中提供的类,也即本文要演示的方法,本文的例子程序实现的功能是从服务器上下载图片到客户端。
关于两种建立Http连接方法(apache的包和JDK的包)的讨论可以看看后面的参考链接。
服务器端
服务器端需要准备图片,因为是Demo程序,所以我就准备了一张图片,然后把它放在Web Project的WebRoot路径下:

然后只要启动Tomcat,ipconfig查出ip地址,放在之后要用的路径中就可以了。
Java程序:Http连接 获取并下载服务器端图片
写一个工具类:
其中第一个方法根据给出的服务器地址及资源路径得到输入流:
public static InputStream getInputStream(String path)
{
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null; try
{
URL url = new URL(path);
if (null != url)
{
httpURLConnection = (HttpURLConnection) url.openConnection(); // 设置连接网络的超时时间
httpURLConnection.setConnectTimeout(5000); // 打开输入流
httpURLConnection.setDoInput(true); // 设置本次Http请求使用的方法
httpURLConnection.setRequestMethod("GET"); if (200 == httpURLConnection.getResponseCode())
{
// 从服务器获得一个输入流
inputStream = httpURLConnection.getInputStream(); } }
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return inputStream;
}
第二个方法根据输入流将文件存储在本地一个路径:
public static void saveInputStream(InputStream inputStream,
String saveToPath)
{ byte[] data = new byte[1024];
int len = 0; FileOutputStream fileOutputStream = null;
try
{ fileOutputStream = new FileOutputStream(saveToPath);
while (-1 != (len = inputStream.read(data)))
{ fileOutputStream.write(data, 0, len); }
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (null != inputStream)
{
try
{
inputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
} if (null != fileOutputStream)
{ try
{
fileOutputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
完整代码:
package com.meng.utils; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; public class HttpUtils
{ public static InputStream getInputStream(String path)
{
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null; try
{
URL url = new URL(path);
if (null != url)
{
httpURLConnection = (HttpURLConnection) url.openConnection(); // 设置连接网络的超时时间
httpURLConnection.setConnectTimeout(5000); // 打开输入流
httpURLConnection.setDoInput(true); // 设置本次Http请求使用的方法
httpURLConnection.setRequestMethod("GET"); if (200 == httpURLConnection.getResponseCode())
{
// 从服务器获得一个输入流
inputStream = httpURLConnection.getInputStream(); } }
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return inputStream;
} public static void saveInputStream(InputStream inputStream,
String saveToPath)
{ byte[] data = new byte[1024];
int len = 0; FileOutputStream fileOutputStream = null;
try
{ fileOutputStream = new FileOutputStream(saveToPath);
while (-1 != (len = inputStream.read(data)))
{ fileOutputStream.write(data, 0, len); }
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (null != inputStream)
{
try
{
inputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
} if (null != fileOutputStream)
{ try
{
fileOutputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
} }
HttpUtils.java
测试程序:
package com.meng.learn; import java.io.InputStream;
import com.meng.utils.HttpUtils; public class HttpTest
{
private static String URL_PATH = "http://192.168.11.6:8080/HelloWeb/android.jpg"; public static void main(String[] args)
{
InputStream inputStream = HttpUtils.getInputStream(URL_PATH);
HttpUtils.saveInputStream(inputStream,"D:\\test1.jpg"); } }
程序运行成功之后可以在指定路径下发现多了服务器端的那个图片。
Android客户端 Http连接:下载服务器端的图片到SD卡
Android的程序还需要考虑的几点是:
1.对SD卡的访问权限及操作。
2.为了不阻塞UI线程,下载操作放在独立的线程中。
3.加入了网路访问的检查,确认网络连接后再进行下载。
需要添加的权限
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 联网权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:padding="10dp"
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp" /> <Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Download Image"
android:textSize="14sp" /> <ImageView
android:padding="10dp"
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>
activity_image_download.xml
Activity中所做的就是按下按钮之后,连接服务器,将图片取出显示在ImageView里,同时存往SD卡的指定路径:
package com.mengexample.test; import java.io.InputStream; import com.windexample.utils.FileUtils;
import com.windexample.utils.HttpUtils; import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; public class ImageDownloadActivity extends Activity
{
private static String URL_PATH = "http://192.168.11.6:8080/HelloWeb/android.jpg"; private TextView mTextView = null;
private Button mButton = null;
private ImageView mImageView = null; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_download); mTextView = (TextView) findViewById(R.id.info);
mTextView.setText(URL_PATH);
mButton = (Button) findViewById(R.id.btn);
mButton.setOnClickListener(mBtnClickListener);
mImageView = (ImageView) findViewById(R.id.image); } private OnClickListener mBtnClickListener = new OnClickListener()
{ @Override
public void onClick(View v)
{
// 首先确认网络连接
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager
.getActiveNetworkInfo();
if (null != networkInfo && networkInfo.isConnected())
{
new DownloadImageTask().execute(URL_PATH);
}
else
{
Toast.makeText(ImageDownloadActivity.this,
"No network connection available", Toast.LENGTH_SHORT)
.show();
}
}
}; private class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{ @Override
protected Bitmap doInBackground(String... params)
{
String path = params[0]; InputStream inputStream = HttpUtils.getInputStream(path); // 从输入流得到位图
Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 将图像存储到SD卡
FileUtils.saveToSDCard(bitmap, "TestImage", "android.jpg"); return bitmap;
} @Override
protected void onPostExecute(Bitmap result)
{
// 将图像显示出来
mImageView.setImageBitmap(result);
} } }
其中用到的两个工具类:
建立连接并获取输入流的方法和Java代码中的一样:
package com.windexample.utils; import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; public class HttpUtils
{ public static InputStream getInputStream(String path)
{
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null; try
{
URL url = new URL(path);
if (null != url)
{
httpURLConnection = (HttpURLConnection) url.openConnection(); // 设置连接网络的超时时间
httpURLConnection.setConnectTimeout(5000); // 打开输入流
httpURLConnection.setDoInput(true); // 设置本次Http请求使用的方法
httpURLConnection.setRequestMethod("GET"); if (200 == httpURLConnection.getResponseCode())
{
// 从服务器获得一个输入流
inputStream = httpURLConnection.getInputStream(); } }
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return inputStream;
} }
另一个辅助类提供了方法,将位图存入SD卡的指定路径:
package com.windexample.utils; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Log; public class FileUtils
{
private static String TAG = "File"; public static String getSDCardRootPath()
{
// SD卡根目录
String sDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath(); return sDCardRoot;
} public static void saveToSDCard(Bitmap bitmap, String filePath,
String fileName)
{ // 将所给文件路径和文件名与SD卡路径连接起来
String sdcardRoot = getSDCardRootPath();
// 创建文件路径
File dir = new File(sdcardRoot + File.separator + filePath);
Log.i(TAG, "dir: " + dir);
if (!dir.exists())
{
dir.mkdirs();
} File targetFile = new File(dir, fileName); try
{
targetFile.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); fileOutputStream.flush();
fileOutputStream.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
} }
}
程序运行后并得到图片后,结果如下:

并且查看SD卡下的TestImage路径,发现其中有这个图片文件。
参考资料
Android Training: Connecting to the Network:
http://developer.android.com/training/basics/network-ops/connecting.html
Android Training: Processes and Threads
http://developer.android.com/guide/components/processes-and-threads.html
老罗Android开发视频教程。
Android之网络编程 系列博文:
http://www.cnblogs.com/devinzhang/category/349642.html
本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子:
Android HTTP实例 使用GET方法和POST方法发送请求
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端的更多相关文章
- Android Post方式发送信息和获取URL中的图片
需要Internet权限,AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET& ...
- Java面试不得不知的程序(二)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数列:前面相邻两项之和,构 ...
- 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...
- 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...
- 006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序
006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序 Eclipse下创建程序 创建程序分为以下几个步骤: 1.首先是创建一个 ...
- 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构
004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...
- 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- 黑马程序员----java基础笔记上(毕向东)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...
随机推荐
- 使用junit测试用例
通常只会使用junit测试非main方法,在我眼里就是程序入口实现而已.今天,发现原来可以测试类. 针对mybatis练习.在需要测试的UserDaoImpl类上右键,新建一个junit case,位 ...
- 解决AndroidStudio升级版本后恢复初始化设置的问题
今天把AndroidStudio升级到1.5后发现所有的个性设置全变为初始化了.包括皮肤啊,字体大小.颜色啊,以及快捷键等等.一瞬间就懵了. 升级完后好像有一个弹窗就是提示是否要继续使用之前的配置的, ...
- C# 图片自由变换 任意扭曲
之前想过要做个地铁驾驶的游戏,其中想把一些原本是矩形图片弄成一个梯形,但是发现GID+上面没有类似的方法.于是在谷歌谷了一下.没有!只能找到令人垂涎的,并没有源码.按照自己的想法尝试了一两天,有点效果 ...
- visual C++ 项目和解决方案的区别
项目: 项目是构成某个程序的全部组件的容器,该程序可能是控制台程序.基于窗口的程序或某种别的程序.程序通常由一个或多个包含用户代码的源文件,可能还要加上包含其它辅助数据的文件组成.某个 ...
- Abot 爬虫分析-整体结构
1. 引言 在Github 上搜索下Web Crawler 有上千个开源的项目,但是C#的仅仅只有168 个,相比于Java 或者Python 确实少的可怜.如果按照Stars 排名.可以看到 排在第 ...
- HP+MYSQL网站SQL Injection攻防
WebjxCom提示:程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程: ...
- 孙鑫MFC学习笔记:15多线程
15 1.进程地址空间 2.线程 3.CreateThread创建一个线程 4.CloseHandle关闭线程句柄,要在不再使用线程句柄的时候关闭,递减线程引用计数 5.编辑框默认不支持多行,需要打开 ...
- 基于Erlang VM的函数式编程语言Elixir
Elixir官网:http://elixir-lang.org/ Elixir是一种函数式动态语言,用于构建可伸缩.易维护的应用程序. Elixir是基于Erlang VM的,其广为人知的特点是运行低 ...
- WebView的使用及添加进度条
实现的效果比较简单类似于微信打开网页,头部有个进度条显示加载进度 下载地址:http://download.csdn.net/detail/qq_29774291/9666941 1.在安卓端加载一个 ...
- windows上安装使用mySql
一直都使用MSSQL,这两天学习了下Mysql,感觉是这样的--->如果你会MSSQL那么你只需花很少的量时间就能上手MYSQL,如果你会MSSQL,什么MYSQL语法这些对你来说都不是麻烦事了 ...