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上传是怎么实现的 就是我贴的那段代码,那三个变量是怎么自动实现获取文件路径和文件名字的?

参考技术A 下载就很简单了
把你要下载的文件做成超级链接,可以不用任何组件
比如说
下载一个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文件下载怎么实现的的主要内容,如果未能解决你的问题,请参考以下文章

Java怎么实现文件拷贝

利用java怎么实现生成报表(Excel文件)

java中UDP文件传输怎么实现?

java的纯JDBC能实现上传下载吗?怎么实现?

JAVA怎么实现按行数分割文件

怎么用JAVA实现大文件分段传输