Java文件下载怎么实现的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java文件下载怎么实现的相关的知识,希望对你有一定的参考价值。
jsp:
<s:form action="uploadaction" enctype="multipart/form-data">
<s:file name="upload" label="选择文件"></s:file>
<s:submit value="上传" />
</s:form>
struts:
<action name="uploadaction" class="down.uploadaction">
<result name="success">/filelist.jsp</result>
<param name="savePath">/upload</param>
</action>
action:
private File upload;
private String uploadContentType;//文件类型
private String uploadFileName;//文件名字
private String savePath;//保存地址
省去了get 和set方法了
public String execute() throws Exception
byte[] buffer = new byte[1024];
// 文件的输入流
FileInputStream fis = new FileInputStream(getUpload());
// 文件的输出流
FileOutputStream fos = new FileOutputStream(getSavePath() + "/"
+ getUploadFileName());
int length = fis.read(buffer);
System.out.println(length);
// 循环读取文件
while (length > 0)
// 每次写入length长度的内容
fos.write(buffer, 0, length);
length = fis.read(buffer);
System.out.println(savePath);
fis.close();
fos.flush();
fos.close();
//文件类型
private String uploadFileName;//文件名字
private String savePath;//保存地址
请问这三个变量是怎么获取这些信息的他们怎么获得文件的名字 和地址定义变量名是随便定义的吗?
我说错了。。那个标题是Java上传是怎么实现的 就是我贴的那段代码,那三个变量是怎么自动实现获取文件路径和文件名字的?
把你要下载的文件做成超级链接,可以不用任何组件
比如说
下载一个word文档
<a href="名称.doc">名称.doc</a>
路径你自己写
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URI;
import java.net.URL;
import java.util.Random;
/**
*
* 实现了下载的功能*/
public class SimpleTh
public static void main(String[] args)
// TODO Auto-generated method stub
//String path = "http://www.7cd.cn/QingTengPics/倩女幽魂.mp3";//MP3下载的地址
String path ="http://img.99luna.com/music/%CF%EB%C4%E3%BE%CD%D0%B4%D0%C5.mp3";
try
new SimpleTh().download(path, 3); //对象调用下载的方法
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
public static String getFilename(String path)//获得文件的名字
return path.substring(path.lastIndexOf('/')+1);
public void download(String path,int threadsize) throws Exception//下载的方法
//参数 下载地址,线程数量
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();//获取HttpURLConnection对象
conn.setRequestMethod("GET");//设置请求格式,这里是GET格式
conn.setReadTimeout(5*1000);//
int filelength = conn.getContentLength();//获取要下载文件的长度
String filename = getFilename(path);
File saveFile = new File(filename);
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.setLength(filelength);
accessFile.close();
int block = filelength%threadsize ==0?filelength/threadsize:filelength/threadsize+1;
for(int threadid = 0;threadid<=threadsize;threadid++)
new DownloadThread(url,saveFile,block,threadid).start();
private final class DownloadThread extends Thread
private URL url;
private File saveFile;
private int block;//每条线程下载的长度
private int threadid;//线程id
public DownloadThread(URL url,File saveFile,int block,int threadid)
this.url = url;
this.saveFile= saveFile;
this.block = block;
this.threadid = threadid;
@Override
public void run()
//计算开始位置的公式:线程id*每条线程下载的数据长度=?
//计算结束位置的公式:(线程id+1)*每条线程下载数据长度-1=?
int startposition = threadid*block;
int endposition = (threadid+1)*block-1;
try
try
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.seek(startposition);//设置从什么位置写入数据
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5*1000);
conn.setRequestProperty("Range","bytes= "+startposition+"-"+endposition);
InputStream inStream = conn.getInputStream();
byte[]buffer = new byte[1024];
int len = 0;
while((len = inStream.read(buffer))!=-1)
accessFile.write(buffer, 0, len);
inStream.close();
accessFile.close();
System.out.println("线程id:"+threadid+"下载完成");
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
本回答被提问者和网友采纳
java怎么实现JSON打包UDP
java实现JSON打包UDP cJSON支持在C程序中创建和解析JSON数据,其提供多种方法供C程序使用,最直接的是将cJSON.c和cJSON.h加入到C工程中
(1) QJsonObject用于在Qt中创建JSON对象
(2)数据传输通过UDP运行
代码如下
首先在pro文件中加入
QT += network
h文件内容:
首先在pro文件中加入
QT += network
h文件内容:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QtNetwork>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QUdpSocket *sender;
QByteArray byteArray;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
;
#endif // MAINWINDOW_H
cpp文件内容:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QJsonObject>
#include<QJsonDocument>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
sender = new QUdpSocket(this);
QJsonObject rectJson;
rectJson.insert("Type","Rectangle");
rectJson.insert("height",42);
rectJson.insert("widght",23);
QJsonDocument rectJsonDoc;
rectJsonDoc.setObject(rectJson);
byteArray = rectJsonDoc.toJson(QJsonDocument::Compact);
MainWindow::~MainWindow()
delete ui;
void MainWindow::on_pushButton_clicked()
QHostAddress address;
address.setAddress(QString("192.168.230.140"));
sender->writeDatagram(byteArray.data(),byteArray.size(),
address,4444);
程序通过端口4444,向IP为192.168.230.140的主机发送JSON数据
C程序如下:
int sock_fd;
char rcv_buff[512];
struct sockaddr_in client_addr;
struct sockaddr_in server_addr;
int client_len;
int rcv_num = -1;
if ((sock_fd = socket(AF_INET, SOCK_DGRAM,0)) < 0)
perror("socket create error\\n");
exit(1);
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(4444);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
client_len = sizeof(struct sockaddr_in);
if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0)
perror("bind socket error.\\n");
exit(1);
while (1)
/*zero the buff of rvbsm and hvbsm? zhp*/
rcv_num= recvfrom(sock_fd, rcv_buff, sizeof(rcv_buff), 0, (struct sockaddr*)&client_addr, &client_len);
if (rcv_num>0)
rcv_buff[rcv_num] = \'\\0\';
printf("rx bsm num = %d\\n",rcv_num);
//printf();
printf("%s %u says: %s\\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),rcv_buff);
//parse_UDP_data(rcv_num,rcv_buff);
if(rcv_buff != NULL)
cJSON* pJson = cJSON_Parse(rcv_buff);
if(pJson == NULL)
printf("Json Parse failed.\\n");
return 0;
cJSON* pSub1 = cJSON_GetObjectItem(pJson,"Type");
cJSON* pSub2 = cJSON_GetObjectItem(pJson,"height");
cJSON* pSub3 = cJSON_GetObjectItem(pJson,"widght");
if(pSub1!=NULL)
printf("Type : %s\\n", pSub1->valuestring);
if(pSub2!=NULL)
printf("height : %d\\n", pSub2->valueint);
if(pSub3!=NULL)
printf("widght : %d\\n", pSub3->valueint);
else
perror("recv BSM error\\n");
break;
close(sock_fd);
编译C程序:gcc -I. -lm -o rencode *.c
由于cJSON使用了标准数学库,所以在编译中需链接其库文件-lm;
在IP为192.168.230.140的Linux服务器中执行./rencode
输出结果为:
参考技术A 一,json_encode作用:json_encode — 对变量进行 JSON 编码。
说明:string json_encode ($value ),返回 value 值的 JSON 形式。
参数:待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)
返回值:编码成功则返回一个以 JSON 形式表示的 string 。
二,客户端用java语言解码:
方法一:
public String unescapeUnicode(String str)
StringBuffer b=new StringBuffer();
Matcher m = Pattern.compile("\\\\u([0-9a-fA-F]4)").matcher(str);
while(m.find())
b.append((char)Integer.parseInt(m.group(1),16));
return b.toString();
方法二:
直接使用unescapeUnicode()方法解码就可以了。
使用 json_simple.jar 包解析
下载地址:http://code.google.com/p/json-simple/downloads/list
JSON.simple是一个简单的Java类库,用于解析和生成JSON文本。不依赖于其它类库,性能高。
Object obj=JSONValue.parse(jsonStr);
return obj.toString(); 参考技术B JSON 打包UDP? 很费解 。。。。。。。UDP 一种通讯方式。。。JSON是一些字符串
以上是关于Java文件下载怎么实现的的主要内容,如果未能解决你的问题,请参考以下文章