import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel;

import javax.servlet.http.HttpServletResponse;

import com.hurong.credit.util.RsaHelper;

public class DownloadURLFile {

private static final DownloadURLFile downloadURLFile = new DownloadURLFile();

public static DownloadURLFile getInstance()

{

return downloadURLFile;

}

/**

* 执行下载

* @param rfPosit 远程文件开始下载位置

*/

public static void start(long rfPosit,URL remoteFile,File storeFile){

HttpURLConnection httpConn = null;

InputStream httpIn = null;

try{

System.out.println("打开HttpURLConnection.");

httpConn = (HttpURLConnection)remoteFile.openConnection();

httpConn.setRequestProperty("User-Agent","NetFox");

httpConn.setRequestProperty("RANGE","bytes="+rfPosit+"-");

System.out.println("得到HttpInputStream.");

httpIn = httpConn.getInputStream();

writeFile(httpIn,storeFile);

System.out.println("关闭HttpURLConnection.");

httpConn.disconnect();

}catch(Exception ex){

ex.printStackTrace();

}

}

/**

* 从HttpInputStream中读数据并写到本地文件中

* @param in HttpInputStream

*/

private static void writeFile(InputStream in,File storeFile){

RandomAccessFile fileOut = null;

int buffer_len = 512;

byte[] buffer = new byte[buffer_len];

int readLen = 0;

try{

System.out.println("写本地文件.");

fileOut = new RandomAccessFile(storeFile, "rw");

fileOut.seek(fileOut.length());

while(-1 != (readLen = in.read(buffer, 0, buffer_len))){

fileOut.write(buffer, 0, readLen);

}

fileOut.close();

}catch(Exception ex){

ex.printStackTrace();

}

}

/**

* 大文件下载

* @param path

* @param response

*/

public static void downLoad(String path, HttpServletResponse response){

final int BUFFER_SIZE = 0x3000;// 缓冲区大小为3M

boolean isInline = false; // 是否允许直接在浏览器内打开

OutputStream toClient = null;

File f=new File(path);

/**

*

* map(FileChannel.MapMode mode,long position, long size)

*

* mode - 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannel.MapMode 类中所定义的

* READ_ONLY、READ_WRITE 或 PRIVATE 之一

*

* position - 文件中的位置,映射区域从此位置开始;必须为非负数

*

* size - 要映射的区域大小;必须为非负数且不大于 Integer.MAX_VALUE

*

* 所以若想读取文件后半部分内容,如例子所写;若想读取文本后1/8内容,需要这样写map(FileChannel.MapMode.READ_ONLY,

* f.length()*7/8,f.length()/8)

*

* 想读取文件所有内容,需要这样写map(FileChannel.MapMode.READ_ONLY, 0,f.length())

*

*/

MappedByteBuffer inputBuffer=null;

long start = 0;

try {

String filename = new String(f.getName().getBytes(), "ISO8859-1");

String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

response.reset();

String inlineType = isInline ? "inline" : "attachment"; // 是否内联附件

response.setHeader("content-disposition", "attachment;filename=\""+ filename + "\"");

//response.setContentType("application/pdf");

inputBuffer = new RandomAccessFile(f, "r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0,f.length());

       byte[] dst = new byte[BUFFER_SIZE];// 每次读出3M的内容

start = System.currentTimeMillis();

// if(inputBuffer.capacity()>BUFFER_SIZE){

for (int offset = 0; offset < inputBuffer.capacity(); offset += BUFFER_SIZE) {

if (inputBuffer.capacity() - offset >= BUFFER_SIZE) {

for (int i = 0; i < BUFFER_SIZE; i++)

dst[i] = inputBuffer.get(offset + i);

} else {

for (int i = 0; i < inputBuffer.capacity() - offset; i++)

dst[i] = inputBuffer.get(offset + i);

}

toClient = new BufferedOutputStream(response.getOutputStream());

response.setContentType("application/octet-stream;charset=gbk");

toClient.write(dst);

}

/*}else{

//dst[0]=inputBuffer;

toClient = new BufferedOutputStream(response.getOutputStream());

response.setContentType("application/octet-stream;charset=gbk");

toClient.write(inputBuffer.get(0));

}*/

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (null != toClient) {

toClient.close();

toClient.flush();

}

} catch (Exception e) {

e.printStackTrace();

}

}

long end = System.currentTimeMillis();

System.out.println("读取文件文件内容花费:" + (end - start) + "毫秒");

}

}

DownloadURLFile网络文件下载的更多相关文章

  1. php实现远程网络文件下载到服务器指定目录(方法一)

    PHP实现远程网络文件下载到服务器指定目录(方法一) <?php function getFile($url, $save_dir = '', $filename = '', $type = 0 ...

  2. Linux网络文件下载

    wget 以网络下载 maven 包为例 wget -c http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-ma ...

  3. Android网络文件下载模块整理

    一.知识基础 tomcat服务器配置 理解http协议 理解javaIO操作相关知识 SDcard操作知识 Android 权限配置 二.实现步骤 1.从网上获取资源 public String do ...

  4. JAVA实现网络文件下载

    HttpURLConnection conn = null; OutputStream outputStream = null; InputStream inputStream = null; try ...

  5. php实现远程网络文件下载到服务器指定目录(方法二)

    <?php // maximum execution time in seconds set_time_limit (24 * 60 * 60); //if (!isset($_POST['su ...

  6. java 网络文件下载(并命中文名)

    public void download(HttpServletRequest request, HttpServletResponse response){ //获取服务器文件 String fil ...

  7. [No00006B]方便的网络下载工具wget 可下载网站目录下的所有文件(可下载整个网站)

    wget是linux下命令行的下载工具,功能很强大,它能完成某些下载软件所不能做的,比如如果你想下载一个网页目录下的所有文件,如何做呢?网络用户有时候会遇到需要下载一批文件的情况,有时甚至需要把整个网 ...

  8. JWebFileTrans: 一款可以从网络上下载文件的小程序(一)

    一 摘要 JWebFileTrans是一款基于socket的网络文件传输小程序,目前支持从HTTP站点下载文件,后续会增加ftp站点下载.断点续传.多线程下载等功能.其代码已开源到github上面,下 ...

  9. java 下载网络文件

    1.FileUtils.copyURLToFile实现: import java.io.File; import java.net.URL; import org.apache.commons.io. ...

随机推荐

  1. Jmeter中while循环逻辑控制器+配置元件计数器的用法

    一.在线程组下添加逻辑控制器While Controller 二.在逻辑控制器While Controller下添加Sample,BeanShell Sampler , 三.逻辑控制器While Co ...

  2. httprunner学习23-加解密

    前言 有些接口的请求参数是加密的,返回的接口内容也是需要解密才能看到. 加密接口 比如当我们访问下面这个登陆的接口时,请求参数账号和密码都是需要加密,通过parms参数传过去,服务器才能识别到 没加密 ...

  3. Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query

    org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested ...

  4. Beta冲刺(7/7)——2019.5.28

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(7/7)--2019.5.28 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  5. CodeForces - 1037H: Security(SAM+线段树合并)

    题意:给定字符串S:  Q次询问,每次询问给出(L,R,T),让你在S[L,R]里面找一个字典序最小的子串,其字典序比T大. 没有则输出-1: 思路:比T字典序大,而且要求字典最小,显然就是在T的尾巴 ...

  6. NameNode的HA

    HDFS中的NameNode的HA怎么实现?(一言以蔽之) 在Hadoop集群中配置并启动两个NameNode进程,一个作为Active节点对外提供服务,另一个作为Standby的节点,两个NameN ...

  7. async/await 和 trycatch/throwable机制类似

    async/await 和 trycatch/throwable机制类似

  8. 函数式编程之moand的作用

    1.计算链的构建:通过类型提升实现:双向链. 2.上下文的保存: 3.副作用的隔离:异步.io

  9. 51nod1814 Clarke and string

    [传送门] 直接想最暴力的做法就是正解了.每次询问都把两个串的回文树建出来,然后再两棵树上同时dfs,经过相同的节点答案就加一.遇到一个不存在的就退出.再把询问记忆化一下就OK了.复杂度是 $O(n ...

  10. Passwords Gym - 101174E (AC自动机上DP)

    Problem E: Passwords \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出两个正整数\(A,B\),再给出\(n\)个字符 ...