大神请绕道首先,这只是一个很简单的程序,所以大神请绕道。心血来潮,用java编写了一个能访问http链接,并能下载文件的窗体小程序。实测能够正确下载17M的压缩包,图片,文档,html等。但是因为程序效率低下,于是没有继续测试更大的压缩文件(问题可能在于保存输入流到缓冲区的数组)。程序已打包jar可执行文件,并将代码一齐打包到jar中。为方便使用jar,使用word文档对象包装了它,将下面的对象(显示为一个图标)拖到桌面或者其他文件夹,即可得到该程序:java下载小程序.jar也可以右击,激活内容,直接运行。程序运行效果如图:该测试链接来自pc6,下载结果为:大神请绕道文件顺利打开。程序主要使用了url访问http地址,并获取输入流,创建本地文件,输出读取的数据到本地文件中。其他部分则是窗体。以下是全部代码:同样是word对象,直接拖到桌面即可。显示窗体的ui包:DownloadWin.javaMainWin.java分割字符串的util包:SplitString.java监听事件的listener包:DownloadListener.java大神请绕道其中,ui包:MainWin.javapackage下载.ui;publicclassMainWin{publicstaticvoidmain(String[]args){DownloadWinwin=newDownloadWin(下载);}}DownloadWin.javapackage下载.ui;importjava.awt.FlowLayout;importjava.awt.GridLayout;importjavax.swing.Box;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JTextField;import下载.listener.DownloadListener;publicclassDownloadWinextendsJFrame{/****/privatestaticfinallongserialVersionUID=-7226361346020458023L;privateJTextFieldhttpLine;privateJTextFieldsavePath;privateJButtonbtnDownload;privateJLabellineLabel;privateJLabelsaveLabel;privatestaticJLabelinfoLabel;publicDownloadWin(Stringtitle){init();大神请绕道setTitle(title);setSize(400,300);setLayout(newGridLayout(2,1,0,0));//为美观考虑,第二行没有使用。setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}privatevoidinit(){BoxbaseBox=Box.createVerticalBox();BoxboxV1=Box.createHorizontalBox();BoxboxV2=Box.createHorizontalBox();BoxboxV3=Box.createHorizontalBox();BoxboxV4=Box.createHorizontalBox();BoxboxV5=Box.createHorizontalBox();lineLabel=newJLabel(访问地址:);httpLine=newJTextField();saveLabel=newJLabel(保存路径:);savePath=newJTextField();btnDownload=newJButton(下载);infoLabel=newJLabel();/***监听器*/DownloadListenerlistener=newDownloadListener(httpLine,savePath,infoLabel);//将需要改变显示状态的控件传递过去处理btnDownload.addActionListener(listener);boxV1.add(lineLabel);boxV1.add(httpLine);boxV2.add(saveLabel);boxV2.add(savePath);boxV3.add(btnDownload);boxV4.add(infoLabel);baseBox.add(boxV1);Box.createVerticalStrut(15);baseBox.add(boxV2);Box.createVerticalStrut(15);baseBox.add(boxV3);Box.createVerticalStrut(15);baseBox.add(boxV4);大神请绕道Box.createVerticalStrut(15);baseBox.add(boxV5);add(baseBox);}}Util包:SplitString.javapackage下载.util;publicclassSplitString{privateStringsplitstr;publicSplitString(){//TODO自动生成的构造函数存根}/***@paramhttpAddress**@paramaccordingString*@return返回“/”之后最后一个字符串*/publicStringsplit(StringsplitString,StringaccordingString){//httpAddress.endsWith(/);//如果a/c/则返回的字符串是c//String[]str=httpAddress.split(/);//unhappy.substring(2)returnshappy//a.s.k.httpAddress.lastIndexOf(.)returns3//splitstr=str[str.length-1];//获取“/”之后最后一个字符串splitstr=splitString.substring(splitString.lastIndexOf(accordingString)+1);//获取最后一个“.”之后的字符串大神请绕道//如果要分解的字符串为a/c/,测试得返回换行returnsplitstr;}}listener包:Listener.javapackage下载.listener;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.URL;importjava.net.URLConnection;importjavax.swing.JLabel;importjavax.swing.JTextField;import下载.util.SplitString;publicclassDownloadListenerimplementsActionListener{privateJTextFieldhttpLine,savePath;privateJLabelinfoLabel;privateStringhttpAddress;privateStringfileName;privateStringfileDir;privateFilefile;privateURLurl;privateURLConnectionconn;privateInputStreamitStream;privateDataInputStreamin;privateFileOutputStreamotStream;privateDataOutputStreamout;publicDownloadListener(JTextFieldhttpLine,JTextFieldsavePath,JLabelinfoLabel){大神请绕道this.httpLine=httpLine;this.infoLabel=infoLabel;this.savePath=savePath;}@OverridepublicvoidactionPerformed(ActionEvente){httpAddress=httpLine.getText();fileDir=savePath.getText();infoLabel.setText();downFile(httpAddress,fileDir);}/***@paramhttpAddress*p下载链接*@paramfileDir*p文件保存目录*/privatevoiddownFile(StringhttpAddress,StringfileDir){SplitStringhttpSplit=newSplitString();fileName=httpSplit.split(httpAddress,/);//根据“/”分解System.out.println(fileName);if(==fileName||null==fileName||==fileDir||null==fileDir){System.out.println(网络地址或保存路径不正确);infoLabel.setText(网络地址或保存路径不正确);}else{System.out.println(下载中...);infoLabel.setText(下载中...);try{url=newURL(httpAddress);//设置链接conn=url.openConnection();//打开链接file=newFile(fileDir,fileName);//获取链接指向的文件的相关数据itStream=conn.getInputStream();//in=newDataInputStream(itStream);//数据输入流otStream=newFileOutputStream(file);//根据文件创建输出流//out=newDataOutputStream(otStream);//数据输出流file.createNewFile();intn=0;intsum=0;大神请绕道byteb[]=newbyte[1];//用来存放网络上下载的数据缓冲/**本机测试,byte数组长度超过2,下载稍大的压缩文件,就会导致压缩文件出错,其他文档也可能出问题*最好长度为1,但是效率估计会很低下*/while((n=itStream.read(b))!=-1){otStream.flush();otStream.write(b);}}catch(IOExceptione){e.printStackTrace();}finally{try{//otStream.flush();//刷新此输出流并强制写出所有缓冲的输出字节//in.close();itStream.close();//out.close();otStream.close();}catch(IOExceptione){//TODO自动生成的catch块e.printStackTrace();}}}System.out.println(下载完成!);infoLabel.setText(