多线程文件下载简单实现(1)
来源:互联网 发布:手机版的编程软件 编辑:程序博客网 时间:2024/06/14 11:48
1.Connection接口
public interface Connection { /** * @Author xuyangyang * @Describe 给定开始和结束位置, 读取数据, 返回值是字节数组 * @Date 2017/6/7 * @Params * @Return */ byte[] read(int startPos, int endPos) throws IOException ; /** * @Author xuyangyang * @Describe 得到数据内容的长度 * @Date 2017/6/7 * @Params * @Return */ int getContentLength(); /** * @Author xuyangyang * @Describe 关闭连接 * @Date 2017/6/7 * @Params * @Return */ void close();}
2.ConnectionManager管理接口
public interface ConnectionManager { /** * @Author xuyangyang * @Describe 给定一个url , 打开一个连接 * @Date 2017/6/7 * @Params * @Return */ Connection open(String url) throws ConnectionException;}
3.实现ConnectionManager,根据url打开一个连接,返回Connection对象
public class ConnectionManagerImpl implements ConnectionManager { @Override public Connection open(String url) throws ConnectionException { return new ConnectionImpl(url); }}
4.具体的实现类
public class ConnectionImpl implements Connection { URL url; static final int BUFFER_SIZE = 1024; public ConnectionImpl(String _url) { try { url = new URL(_url); } catch (MalformedURLException e) { e.printStackTrace(); } } @Override public byte[] read(int startPos, int endPos) throws IOException { HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); InputStream in = httpURLConnection.getInputStream(); byte[] bytes = new byte[BUFFER_SIZE]; int totalLen = endPos - startPos + 1; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (baos.size() < totalLen) { int len = in.read(bytes); if (len < 0) { break; } baos.write(bytes, 0, len); } if (baos.size() > totalLen) { byte[] data = baos.toByteArray(); return Arrays.copyOf(data, totalLen); } return baos.toByteArray(); } @Override public int getContentLength() { URLConnection con; try { con = url.openConnection(); return con.getContentLength(); } catch (IOException e) { e.printStackTrace(); } return -1; } @Override public void close() { }}
5.简单的测试
public class ConnectionTest { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testContentLength() throws Exception{ ConnectionManager connMan = new ConnectionManagerImpl(); Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg"); Assert.assertEquals(35470, conn.getContentLength()); } @Test public void testRead() throws Exception{ ConnectionManager connMan = new ConnectionManagerImpl(); Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg"); byte[] data = conn.read(0, 35469); Assert.assertEquals(35470, data.length); data = conn.read(0, 1023); Assert.assertEquals(1024, data.length); data = conn.read(1024, 2023); Assert.assertEquals(1000, data.length); // 测试不充分,没有断言内容是否正确 }}
阅读全文
0 0
- 多线程文件下载简单实现(1)
- 多线程文件下载简单实现(2)
- 实现多线程下载文件
- 多线程实现文件下载
- 多线程和网络通信实现的简单文件下载
- 多线程下载文件和断点续传的简单实现
- 如何实现多线程下载文件
- 实现异步多线程下载文件
- Java实现多线程下载文件
- 实现多线程下载同一个文件
- 多线程断点文件下载实现
- js简单实现文件下载
- python简单实现文件下载
- 用java实现简单的多线程下载
- Android多线程断点下载简单实现
- 在Java中使用多线程结合断点续传实现一个简单的文件下载器
- (J2SE)实现多线程文件分块下载
- Android进阶:实现多线程下载文件
- application installation failed
- 简单实现Rxjava框架,超详细,加进阶篇!!!!
- cocos2dx lua实现EditBox输入框
- Maven学习第一节---maven入门(maven下载和环境变量以及本地仓库配置)
- Word2Vec教程
- 多线程文件下载简单实现(1)
- CMSIS中的FreeRTOS第一篇——任务通知:osSignalSet和osSignalWait
- Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件
- ReactNative安装
- KMP算法-字符串模式匹配算法
- easyui Datagrid编辑经验
- VirtualBox 网络桥接配置
- mysql的存储过程
- 虚拟机下安装ubuntu后不能全屏的解决方法