Java下http下载文件客户端和上传文件客户端实例代码
作者:chenyulancn 发布时间:2021-09-09 16:52:11
标签:java,http,下载文件,上传文件
一、下载客户端代码
package javadownload;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @说明 导出虚拟机
* @author wxt
* @version 1.0
* @since
*/
public class GetVM {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String url = "http://192.168.5.102:8845/xx";
byte[] btImg = getVMFromNetByUrl(url);
if(null != btImg && btImg.length > 0){
System.out.println("读取到:" + btImg.length + " 字节");
String fileName = "ygserver";
writeImageToDisk(btImg, fileName);
}else{
System.out.println("没有从该连接获得内容");
}
}
/**
* 将vm 写入到磁盘
* @param vm 数据流
* @param fileName 文件保存时的名称
*/
public static void writeImageToDisk(byte[] vm, String fileName){
try {
File file = new File("./" + fileName);
FileOutputStream fops = new FileOutputStream(file);
fops.write(vm);
fops.flush();
fops.close();
System.out.println("下载完成");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据地址获得数据的字节流
* @param strUrl 网络连接地址
* @return
*/
public static byte[] getVMFromNetByUrl(String strUrl){
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取数据
byte[] btImg = readInputStream(inStream);//得到的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 从输入流中获取数据
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}
上述代码只适合下载小文件,如果下载大文件则会出现 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 错误,所以如果下载大文件需要对上述代码进行改造,代码如下:
package javadownload;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @说明 导出虚拟机
* @author wxt
* @version 1.0
* @since
*/
public class GetBigFile {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String url = "http://192.168.5.76:8080/export?uuid=123";
String fileName="yserver";
getVMFromNetByUrl(url,fileName);
}
/**
* 根据地址获下载文件
* @param strUrl 网络连接地址
* @param fileName 下载文件的存储名称
*/
public static void getVMFromNetByUrl(String strUrl,String fileName){
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取数据
byte[] buffer = new byte[4096];
int len = 0;
File file = new File("./" + fileName);
FileOutputStream fops = new FileOutputStream(file);
while( (len=inStream.read(buffer)) != -1 ){
fops.write(buffer, 0, len);
}
fops.flush();
fops.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、上传文件客户端:
package javadownload;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class FileUpload {
/**
* 发送请求
*
* @param url
* 请求地址
* @param filePath
* 文件在服务器保存路径(这里是为了自己测试方便而写,可以将该参数去掉)
* @return
* @throws IOException
*/
public int send(String url, String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists() || !file.isFile()) {
return -1;
}
/**
* 第一部分
*/
URL urlObj = new URL(url);
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
/**
* 设置关键值
*/
con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false); // post方式不能使用缓存
// 设置请求头信息
con.setRequestProperty("Connection", "close");//Keep-Alive
con.setRequestProperty("Charset", "UTF-8");
// 设置边界
String BOUNDARY = "----------" + System.currentTimeMillis();
con.setRequestProperty("Content-Type", "multipart/form-data; boundary="
+ BOUNDARY);
// 请求正文信息
// 第一部分:
StringBuilder sb = new StringBuilder();
sb.append("--"); // ////////必须多两道线
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"file_name\";filename=\""
+ file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
sb.append("Connection:close\r\n\r\n");
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
OutputStream out = new DataOutputStream(con.getOutputStream());
out.write(head);
// 文件正文部分
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
// 结尾部分
byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
out.write(foot);
out.flush();
out.close();
/**
* 读取服务器响应,必须读取,否则提交不成功
*/
return con.getResponseCode();
/**
* 下面的方式读取也是可以的
*/
// try {
// // 定义BufferedReader输入流来读取URL的响应
// BufferedReader reader = new BufferedReader(new InputStreamReader(
// con.getInputStream()));
// String line = null;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
// } catch (Exception e) {
// System.out.println("发送POST请求出现异常!" + e);
// e.printStackTrace();
// }
}
public static void main(String[] args) throws IOException {
FileUpload up = new FileUpload();
System.out.println(up.send("http://192.168.5.102:8845/xx",
"./vif.xml"));
;
}
}
总结
以上所述是小编给大家介绍的Java下http下载文件客户端和上传文件客户端实例代码网站的支持!
来源:http://blog.csdn.net/chenyulancn/article/details/45562119


猜你喜欢
- 文章主要涉及到以下几个问题:怎么实现Java的序列化为什么实现了java.io.Serializable接口才能被序列化transient的
- Jmeter是纯Java开发的, 能够运行Java程序的系统一般都可以运行Jmeter, 如:Windows、 Linux、 mac等。由于
- 常量:其值不变即为常量。语法:数据类型 常量名 = 值;doubl
- 本文实例讲述了Android基于DialogFragment创建对话框的方法。分享给大家供大家参考,具体如下:/** * 使用DialogF
- 建立工程前需要导入POI包。POI相关jar包下载地址:http://poi.apache.org/download.html1.解析.xl
- 补充使用Spring Cloud Config加密功能需要下载JCE扩展,用于生成无限长度的密文。链接:http://www.oracle.
- 前言在前面的2个章节中,一一哥 带大家实现了在Spring Security中添加图形验证码校验功能,其实Spring Security的功
- 前言Jetpack Compose(简称 Compose )是 Google 官方推出的基于 Kotlin 语言的 Android 新一代
- 经过上一篇的介绍,相信小伙伴们已经按奈不住内心对springboot的向往,本篇我将继续向小伙伴介绍springboot配置文件的配置,已经
- 翻译自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And
- 因为涉及到 io 流输入问题,如果不关闭会一直占用资源。所以使用过后要及时关闭,防止资源一直被占用。Scanner在使用前要导入 java.
- 1.冒泡排序简介冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的
- 本周的谷歌I/O大会带来了很多关于Android的振奋人心的消息。可能我们需要较长的时间来消化Android L引入的新东西。这些天我一直在
- List接口介绍—ArrayList有序、可重复线程不安全,因为没有synchronized修饰ArrayList源码结论ArrayList
- 目录前言实现思路实现方法最简单的实现方法如果多线程乱入?线程安全的单例模式Lock版本静态构造器版本Lazy版本总结前言Singleton是
- 大家好,我叫柠檬水,今天马上就要放假,突然想到自己以前的伙伴、同学,好像想到他们空间没怎么发过动态,难道是把我屏蔽了吗,好友又那么多,行吧,
- 1、前言WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是持久性的工
- this在Java中,this的作用和其词义很接近。它在方法内部使用,即这个方法所属对象的引用;它在构造器内部使用,表示该构造器正在初始化的
- 在开发时,我们会遇到文字过长,TextView不能完全展示,但又不想文字换行展示,这样有时会影响美观。这时我们就需要文字滚动播放,让用户可以
- Java File类 mkdir 不能创建多层目录File f = new File("/home/jp/Upload"