java下载文件到指定文件夹(java导出某个文件夹所有文件)
本篇文章给大家谈谈java下载文件到指定文件夹,以及java导出某个文件夹所有文件对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
怎么将一个文件移到文件夹列表最顶层
谓的“万能预装”就是利用GHOST和微软的封装技术,经过处理后制作成的一个ghost映像,然后通过普通的ghost方式“安装”到c盘。“预装”名词我是从品牌机上引用过来的。毕竟这样方式和普通安装有很大的区别。这个制作方式经过众多网友的讨论研究,不断完善、不断改进,已经基本实现所谓的“万能”。为了让更多的网友和系统爱好者了解制作的过程,编辑整理了制作过程。
一、安装前的准备
准备一张完整的系统安装盘(当然iso之类也可以,只要你会安装就可以)。一般2000选用专业版(pro);xp有好几个版本:按激活的方式也有“上海政府”免激活版本(推荐)、OEM、俄罗斯破解零售版等;2003有免激活企业版的标准版(推荐)和企业版等。
下载死性不改提供的自动选择电源模式解决方案()
建议使用一个串口鼠标,因为usb在封装时可能不能使用。
二、安装操作系统(以下均以xp为例)及软件
正常安装完整操作系统,系统文件格式建议采用NTFS,优点就不用说了。
升级所有的补丁,为了减少体积,NET Framework可以不安装,这样可以节省20多m的空间。安装DirectX9.0b、wmp9.0、ms java、GB18030支持等,最好重新启动一下系统。
安装常用应用软件(裸版可以直接跳过这一步),个人推荐以下软件:
QQ最新的去广告ip版
Winamp5.X汉化版或foobar
优化大师注册版
MSN MESSENGER 6.2+去广告多用户补丁
WINRAR3.X最新汉化注册版
Flashget 1.6破解注册版
Flashfxp 2.2以后的注册版
媒体播放器经典版最新版本或realone plus版
MYIE2、GreenBrowser或其他外壳浏览器
紫光拼音3.0以后的版本
极典五笔或其他五笔输入法(xp、2003自己都没有五笔)
Emeditor 4.X汉化注册版—最好的文本编辑器
Symantec AntiVirus 8.1或其他可升级的杀毒软件
天网防火墙或其他——针对2000,xp和2003可以不安装
Raspppoe安装版——针对2000,xp和2003可以不安装
时可通时间增强工具
office2000或office 2003完整安装
AIDA32 3.8或其他检测系统信息,精小强大。对于使用ghost用户安装驱动之类的有用
Kugoo,下载mp3的p2p软件,很不错——他们可没有给我广告费哦,呵呵
选择一个bt下载软件,现在很多也用到
………
不宜安装Daemon manager,新的方法封装后会不能使用,因为它作为一个驱动会被删除。所以有驱动(硬件)性质的也不能安装。不过再多也安装不下了。
另外还要对这些软件做些适当的调整,如flashget、bt等默认下载地址改为d:\download之类的,有时间最好运行一下,检查注册是否完成、并将注册方法放到安装目录,封装后可能变成未注册的就可以用上。
三、优化系统
现在安装完,大概有2.Xg,这对于我们的要求还差很多,所以要进行优化和删除系统没用的文件,所谓的“减肥行动”!我们的目标是1.3g,这样ghost(high)后可以控制在650m左右。
1、禁用系统还原,封装后又会恢复、这不影响;
2、转移分页文件(虚拟内存),可移到d盘或禁用,反正封装后又会恢复。Ghost8.0可以直接屏蔽这个大块头;
3、转移临时文件夹,推荐d:\temp;
4、禁用休眠,可以节省和内存一样大的空间;
5、转移IE的临时文件夹(缓存),也放到d:\temp;OE的存储位置改为D:\My Documents\oe;
6、转移我的文档的位置,推荐D:\My Documents
7、可选卸载不需要的windows组件,在运行中输入“%systemroot%/inf/sysoc.inf”,打开这个文件后在记事本的“编辑”菜单下点击“替换”,然后在“查找内容”中输入“hide”(不包括引号),然后点击右侧的“全部替换”按钮,之后保存文件并关闭。重新打开控制面板中的添加删除程序,然后点击“添加删除Windows组件”,现在可以直接卸载很多以前并不允许卸载的组件了。请大家谨慎使用;
8、关闭内存转储。在“系统属性”对话框的“高级”选项卡下,点击“启动和故障恢复”按钮,然后在“写入调试信息”下拉菜单中选择“无”。并且你可以搜索所有的“*.dmp”文件并删除它们。同时,在运行中输入“drwtsn32”并回车,打开华生医生工具,在这里取消对“转储全部线程上下文”、“附加到现有日志文件”和“创建故障转储文件”这三项的选择。
9、删除大的中文字体。一般保留宋体(含18030的那种)、黑体、仿宋体就可以了。
10、删除系统文件备份,就是dllcache。在运行中输入“CMD”并回车,打开命令提示行窗口,然后在其中输入“sfc/purgecache”并回车,这将会删除前面提到的c:\windows\system32\dllcache文件夹中所有的备份文件,接着继续输入“sfc/cachesize=0”并回车。可能会提示windows文件保护的框。
11、禁止windows文件保护。从注册表中找到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon,修改“SFCDisable”键值为“FFFFFF9D”,如果需要重新启用该功能,重新设置为“0”就可以了。
12、删除帮助文件。直接删除Windows目录下的“Help”文件夹,不过有几个最好保留:agt0407.hlp这种数字格式的,不然封装后启动可能要源光盘,反正只有几k,留着。
13、多余的输入法。这个不能完全删除,不然封装后会提示插入源光盘!除了中文输入法,Windows XP中还带有日文和韩文等输入法,这对我们当然没什么用处,也可以在“c:\windows\ime”文件夹下选择性删除除了“CHSIME”和“SHARED”之外的其他文件夹中的内容。结果如图:
尤其imjp8_1和imkr6_1需要保留文件夹和部分dll文件,如果不是很大就尽量保留。删除ime后从80多m减少到2.36m就可以了。
C:\windows\ime保留文件列表.
│ mscandui.dll
│ SOFTKBD.DLL
│ SPGRMR.dll
│ SPTIP.dll
├—CHSIME
│└—APPLETS
│ PINTLCSA.DLL
│ PINTLCSD.DIC
│ PINTLCSD.DLL
│ PINTLCSK.DIC
├—CHTIME
│└—Applets
├—imejp
│└—applets
├—imejp98
├—IMJP8_1
│└—APPLETS
├—IMKR6_1
│├—Applets
│└—Dicts
│ hanja.lex
│ hanjadic.dll
│ imekr.lex
└—SHARED
│ imepaden.hlp
│ imepadsm.dll
│ imepadsv.exe
│ imlang.dll
└—RES
PADRS404.DLL
padrs411.dll
padrs412.dll
padrs804.dll
14、可选删除Service Pack备份文件。Service Pack是Windows的大补丁文件,在安装Service Pack后硬盘上会占用一部分空间保存备份出来的系统文件;可删除windows下“ServicePackFiles”文件夹
15、减少开机滚动条时间每次启动Windows XP,蓝色的滚动条都要走上好多次,其实这里我们也可以把它的滚动时间减少,以加快启动速度。打开注册表编辑器,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters,在右边找到EnablePrefetcher主键,把它的默认值3改为1,这样滚动条滚动的时间就会减少。然后可到C:\WINDOWS\Prefetch目录中,删除里面的内容.
16、删除所有windows下$NtUninstallQ******$”(******是一个数字)文件;
17、可选删除Driver Cache/i386”文件夹下的除了Driver.cab和sp1.cab外所有文件。千万别删除这两个,否这封装后的系统认识驱动会有麻烦。
18、删除c:\windows\cursors\,这个文件夹中包含了所有的鼠标指针;
19、删除c:\windows\srchasst,这个文件夹中保存了Windows XP的搜索助理,也就是你搜索文件时出现的小狗或者其他什么人物造型。你可以直接删除这个文件夹,这样你将会使用Windows 2000模式的经典搜索方式;建议删除!
20、可选删除c:\windows\downloaded installations\,这个文件夹中保存了一些程序的安装文件(主要是使用Windows Installer技术安装的程序),这样如果以后这个程序需要修复或者进行其他操作,就可以直接通过保存在这里的安装文件进行。不过通常把这个文件夹清空对系统的使用也没有什么太大的影响,所以建议删除。
21、可选删除c:\windows\media\,这里是用来保存Windows的系统声音,没有十分必要就不要删除;22、可选删除c:\windows\system32\usmt\,这个文件夹中是文件和设置转移向导的相关文件。
23、可选删除c:\program files\msn,c:\program files\netmeeting\,这两个文件夹中是MSN Explorer
和Netmeeting的可执行文件。不推荐,因为预装系统建新用户的时候可能用到msn4.6的一个dll文件,虽然不影响系统,因为6.1已经安装了或有人不使用msn,可提示缺少文件不舒服。
24、删除C:\windows\system32\oobe——适用企业版,零售版或者OEM版,那最好不要动它。
25、可选删除c:\windows\msagent,这里保存了Agent的文件,这里的Agent就跟微软Office应用程序中的Office助手一样,是一些动态的卡通形象,通常我们用不到这些东西。注意保留intl目录中类似agt0407.dll的所有dll文件。
26、可选清理C:\WINDOWS\Web\Wallpaper中的桌面,可以自己换个喜欢的。如果想更深入,就删除屏幕保护,C:\WINDOWS\system32\*.scr
27、加速网上邻居。访问网上邻居是相当恼人的,系统会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务,然后才显示出来,显然这样速度就会比Windows 9x中慢很多。其实这些功能我们并没有使用上,与其不用还不如删除它们,这样速度就会明显加快。打开注册表编辑器,找到HKEY_LOCAL_MACHINE\sofeware\Microsoft\Windows\Current Version\Explore
\RemoteComputer\NameSpace,删除其下的(打印机)和(计划任务),重新启动电脑,再次访问网上邻居,你会发现快了很多。
28、Windows XP默认支持.ZIP文档,但系统会为此耗费大量资源,如果已经安装了winrar,你可以将这一功能关闭,只需在“开始”选单的“运行”中输入“regsvr32/u zipfldr.dll”即可。
29、打开服务,找到“Messenger”和“Alerter”,你可以安全地把它改为手动,这样就可以禁止了ip消息。
30、仔细再想一想其他自己认为可改进的地方,其他的可删除东西就不推荐了。清空回收站!
31、使用优化大师(注册版)清理系统.
32、优化整个系统包括硬件和网络的!这里的操作也很重要,大家也可使用类似的优化软件优化系统。
四、重新封装
1、更改 IDE ATA/ATAPI控制器,这一步就是XP系统万能GHOST的主要步骤所在!!为了适应现在各种不同的主板,(如Inter主板,VIA主板,SIS主板)则必须将你本机的IDE控制器改成标准的双通道 PCI IDE控制器,如图
2、再把计算机的电源改为Standard PC,方法和上面的一样!
3、再删除剩下的驱动,除”系统设备”中的不要乱删除外,其它的驱动都可以删,
4、删掉磁盘驱动器里面的所有设备信息
5、删掉端口里面的所有信息(为什么要删掉.经过我的试验超过20台(老机器)......
.不删掉的情况下某些主板的打印机和COM设备找不到或者错误的识别打印机和某些COM设备~
例如红外线控制设备)大家如果想做通用的如装机盘之类的最好删掉,不然小问题也能害死你啊.....
6、删掉监视器里面的所有设备信息
7、删掉键盘里面的所有设备信息
8、删掉其他设备里面的所有设备信息
9、删掉软盘控制器里面的所有信息
10、删掉声音.视频和游戏控制器里面的声卡信息(就是指系统自动识别的你的声卡驱动或你已经安装好了的驱动)
11、删掉鼠标和其他指针设备(干净嘛)
12、删掉通用串行总线控制器里面的所有信息也就是USB控制器
13、删掉网卡里面的所有系统信息
14、卸载掉你的显卡驱动是卸载啊.......呵呵系统自带的删除就行了
当然你可以用更方便的方法,用命令行:devcon.exe remove*删除剩下的驱动,
15、接下来在xp安装光盘中打开\SUPPORT\TOOLS\DEPLOY.CAB文件,先在 C:盘根目录下建议一个名为Sysprep的文件夹,并将DEPLOY.CAB压缩包文件用Winrar解压缩到 c:\sysprep,
16、运行setupmgr.exe逐步制作sysprep.inf.如图
可以自己指定计算机名称,也可以让计算机自动产生.
其它都用默认就好了,最后到
sysprep文件一定要在默认的目录中,不可以更改!sysprep文件建好后,就可以运行死性不改的程序了!
运行不改的程序后,会自动解压文件到以c:\sysprep文件中,完整的执行过程如下:
16、让电脑支持SATA,SCSI,RAID控制器
1)更改注册表“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root”权限如图:
2)安装S&R&S V4.3.exe,然后把c:\sysprep\sxbg.chk重命名为sxbg.exe复制到c:\program files目录。
3)运行c:\sysprep\sxbg.exe(必须有sysprep.exe,因为sxbg.exe有条件判断),
sysprep.exe启动时点击取消不执行封装,但必须让后台的cmd窗口执行完毕,
4)到c:\program files目录执行sxbg.exe就可以分离出只含有SATA,SCSI,RAID控制器驱动支持的功能,同时可以清除boot控制功能。
17、安装全自动检测附件,适合2000/XP/2003。
运行autohal.exe将会自动解压ta.exe,autohal.cmd setcmd.chk,和regset.cmd文件到c:\sysprep目录,封装时运行regset.cmd间接启动sysprep.exe即可。
注:1)全自动检测附件有2个
第1个,如果你的主板支持超线程CPU或者多CPU,检测完成后会出现两个菜单,显示时间为4秒钟,默认(第一项,适合超线程/多处理器),第二项适合普通处理器配置的计算机。
第2个,加入了杨大侠的doscpuid对超线程/多处理器的识别,全自动完成,
请自行选择采用哪一个。
2)发现单独安装的微软拼音输入法2003,在克隆恢复之后会打回原形(变成微软拼音输入法3.0),所以加入了对这个问题的修复功能。(与office 2003一起安装的好像没这个问题,另外,我是在Win2003中发现这个问题)。
3)加入了一个比较特别的功能:克隆到目标计算机时,如果你不想使用克隆文件中的自动应答设置,例如计算机名、工作组、注册名、安装序列号等等,那么你可在克隆之前根据自己的需要重新建立一个sysprep.inf,把它放在任意一个分区的根目录下(克隆的目标分区除外),那么这个sysprep.inf就会成为封装过程的自动应答文件。
运行regset.cmd,会自动启动封闭装程序,出现如图的画面.
点“确定”出现下面画面.
关机模式选择”退出”
第一项(不重置激活的宽限期)和第三项的(不重新产生安全标识符)都是XP以上系统专用,也就是正版用户激活用的,而我们所建议用的系统是上海政府版,或俄罗斯电话激活破解版,于是这两项其实选与不选无所谓,对GHOST克隆后的系统在使用上都无影响
第二项的(使用最小化安装)既所谓的 PNP安装,好象也叫无残留驱动安装,这也正是我们需要的,因此这项一定要选上。
第四项的(检测非即插即用硬件),这一选项不用选上,因为即使有非即插即用的古董级硬件,关机模式一定要选择“退出”,点击”重新封装”,过几分就可以完成封装了,然后手动关机,再用启动盘启动到dos下,不要重新启动系统了!用ghost做镜像就可以了!!完成!
至此!所有工作就算完成了!~~晕啊!~第一次写了这么多东西!~~
希望对一些还不会做万能ghost的网友,有帮助!~!~~~~~~~~~~
死性不改的封装程序可以去jujumao下载,网址:程序的使用方法,上面都是有的!~
五、常见的一些问题:
1、安装XP大部分人用NTFS格式,也有人用FAT32格式,怎样让做出的GHO文件都满足需要呢,这个好办,创建GHO文件时我们用FAT32格式,在用setupmgr.exe创建系统自动应答文件时,在“运行一次”一步中输入以下命令“convert c:/FS:NTFS”,安装时有个转换格式的选择,需要NTFS格式的选Y,不需要就选N就行了。
2、WinXP/Win2K克隆包恢复后OfficeXP需要重新激活的解决方法
说明:
(1)、我采用的officeXP版本的破解方法是用一个mso.dll文件替换原有的mso.dll,从而免激活
(2)、OfficeXP在安装过程中需要收集电脑硬件信息,从而作为是否需要重新激活的判断,当WinXP/Win2000的克隆包在另一台电脑上恢复后,officeXP会因为硬件变化大而重新要求激活。因此在制作克隆包前,要避免officeXP收集硬件信息。
方法如下:
A、在要生成克隆包的电脑上,安装officeXP不要双击setup.exe,而是采用命令行方式安装,格式如下:%OfficeXP Install Path%setup NOUSERNAME=True ENTERPRISE_IMAGE=True运行此命令行进行OfficeXP的正常安装,其中%OfficeXP Install Path%是指Office安装文件所在的路径,比如光盘e:NOUSERNAME=True,
使将来不同的用户可以在第一次使用OfficeXP时输入自己的用户名ENTERPRISE_IMAGE=True,告诉OfficeXP安装程序在安装过程中不收集硬件信息,而是在第一次运行时才收集硬件信息。
B、安装完成后,不要运行任何Office程序,不然OfficeXP会自动收集本机的硬件信息。
C、用破解文件mso.dll替换programe files\common files\microsoft shared\office10目录下的同名文件。可以先备份原来的文件,以防出错。
D、开始制作WinXP/Win2k的克隆包,这样克隆包在另一台电脑上恢复后,在用户第一次运行office程序时,officeXP会自动收集当前电脑的硬件信息,避免再次重新激活
3、安装GHOST2K,不能“软关机”
答:可能导致这个问题的原因很多,但是主要还是由于电源管理设置以及主板和Windows 2000的兼容性上。可以到BIOS的电源管理中把相应的项目激活(Enable),然后再进入Windows2000,在控制面板-电源选项里面也把支持ACPI的选项选上。如果,在电源选项里没有“支持ACPI的选项”,先在BIOS中把“ACPI Function”设为“Enabled”,再重新安装。
在某一个杂志上看到的解决方法,不知道行不行:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下更改PowerdownAfterShutdown=0就可以正常关机
现在网上的 Windows 2003服务器,基本上都VOL的免激活版,操作步骤也和XP一样,只是在创建自应答文件时多几个选项,如授权多少用户等,并且,2003在重新封装时,(使用最小化安装)PNP选项是灰色的,也就是强迫选上,这其实也是我们希望的!!(2000和XP和2003各版的光盘都自带重新封装工具,并且不通用),但操作步骤基本都是一样!
java爬虫读取某一张指定图片的url,求解答
package pers.baijiaming.download.main;import java.io.*;//io包import java.util.regex.*;//正则包import java.net.*;//网络包/**下载图片类**/public final class DownloadPictures implements Runnable{
private URL url= null;//URL private URLConnection urlConn= null;//url连接 private BufferedReader bufIn= null;//缓冲读取器,读取网页信息
private static final String IMG_REG="<img.*src\\s*=\\s*(.*?)[^>]*?>";//img标签正则 private static final String IMG_SRC_REG="src\\s*=\\s*\"?(.*?)(\"|>|\\s+)";//img src属性正则
private String downloadPath= null;//保存路径
//构造,参数:想要下载图片的网址、下载到的图片存放的文件路径 public DownloadPictures(String urlStr, String downloadPath)
{
createFolder(downloadPath);//创建文件夹
try{
url= new URL(urlStr);
urlConn= url.openConnection();
//设置请求属性,有部分网站不加这句话会抛出IOException: Server returned HTTP response code: 403 for URL异常//如:b站 urlConn.setRequestProperty("User-Agent","Mozilla/4.0(compatible; MSIE 5.0; Windows NT; DigExt)");
bufIn= new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
}
catch(Exception e){
e.printStackTrace();
}
this.downloadPath= downloadPath;
}
//检测路径是否存在,不存在则创建 private void createFolder(String path)
{
File myPath= new File(path);
if(!myPath.exists())//不存在则创建文件夹 myPath.mkdirs();
}
//下载函数 public void Download()
{
final int N= 20;//每一次处理的文本行数,这个数越小越容易遗漏图片链接,越大效率越低(理论上)
String line="";
String text="";
while(line!= null)//网页内容被读完时结束循环{
for(int i= 0; i< N; i++)//读取N行网页信息存入到text当中,因为src内容可能分为多行,所以使用这种方法 try{
line= bufIn.readLine();//从网页信息中获取一行文本
if(line!= null)//判断防止把null也累加到text中 text+= line;
}
catch(IOException e){
e.printStackTrace();
}
//将img标签正则封装对象再调用matcher方法获取一个Matcher对象 final Matcher imgM= Pattern.compile(IMG_REG).matcher(text);
if(!imgM.find())//如果在当前text中没有找到img标签则结束本次循环 continue;
//将img src正则封装对象再调用matcher方法获取一个Matcher对象//用于匹配的文本为找到的整个img标签 final Matcher imgSrcM= Pattern.compile(IMG_SRC_REG).matcher(imgM.group());
while(imgSrcM.find())//从img标签中查找src内容{
String imageLink= imgSrcM.group(1);//从正则中的第一个组中得到图片链接
print(imageLink);//打印一遍链接
//如果得到的src内容没有写协议,则添加上// if(!imageLink.matches("https://[\\s\\S]*"))//这里有问题// imageLink="https://"+ imageLink;
print(imageLink);//打印一遍链接
try
{
//缓冲输入流对象,用于读取图片链接的图片数据//在链接的图片不存在时会抛出未找到文件异常 final BufferedInputStream in= new BufferedInputStream(new URL(imageLink).openStream());
//文件输出流对象用于将从url中读取到的图片数据写入到本地//保存的路径为downloadPath,保存的图片名为时间戳+".png" final FileOutputStream file= new FileOutputStream(new File(downloadPath+ System.currentTimeMillis()+".png"));
int temp;//用于保存in从图片连接中获取到的数据 while((temp= in.read())!=-1)
file.write(temp);//将数据写入到本地路径中
//关闭流 file.close();
in.close();
//下载完一张图片后休息一会 try{
Thread.sleep(800);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
//将text中的文本清空 text="";
}
}
//run@Override
public void run()
{
Download();//下载函数}
//打印语句 public void print(Object obj)
{
System.out.println(obj);
}}
怎么用Java实现FTP上传
sun.net.ftp.FtpClient.,该类库主要提供了用于建立FTP连接的类。利用这些类的方法,编程人员可以远程登录到FTP服务器,列举该服务器上的目录,设置传输协议,以及传送文件。FtpClient类涵盖了几乎所有FTP的功能,FtpClient的实例变量保存了有关建立"代理"的各种信息。下面给出了这些实例变量:
public static boolean useFtpProxy
这个变量用于表明FTP传输过程中是否使用了一个代理,因此,它实际上是一个标记,此标记若为TRUE,表明使用了一个代理主机。
public static String ftpProxyHost
此变量只有在变量useFtpProxy为TRUE时才有效,用于保存代理主机名。
public static int ftpProxyPort此变量只有在变量useFtpProxy为TRUE时才有效,用于保存代理主机的端口地址。
FtpClient有三种不同形式的构造函数,如下所示:
1、public FtpClient(String hostname,int port)
此构造函数利用给出的主机名和端口号建立一条FTP连接。
2、public FtpClient(String hostname)
此构造函数利用给出的主机名建立一条FTP连接,使用默认端口号。
3、FtpClient()
此构造函数将创建一FtpClient类,但不建立FTP连接。这时,FTP连接可以用openServer方法建立。
一旦建立了类FtpClient,就可以用这个类的方法来打开与FTP服务器的连接。类ftpClient提供了如下两个可用于打开与FTP服务器之间的连接的方法。
public void openServer(String hostname)
这个方法用于建立一条与指定主机上的FTP服务器的连接,使用默认端口号。
public void openServer(String host,int port)
这个方法用于建立一条与指定主机、指定端口上的FTP服务器的连接。
打开连接之后,接下来的工作是注册到FTP服务器。这时需要利用下面的方法。
public void login(String username,String password)
此方法利用参数username和password登录到FTP服务器。使用过Intemet的用户应该知道,匿名FTP服务器的登录用户名为anonymous,密码一般用自己的电子邮件地址。
下面是FtpClient类所提供的一些控制命令。
public void cd(String remoteDirectory):该命令用于把远程系统上的目录切换到参数remoteDirectory所指定的目录。
public void cdUp():该命令用于把远程系统上的目录切换到上一级目录。
public String pwd():该命令可显示远程系统上的目录状态。
public void binary():该命令可把传输格式设置为二进制格式。
public void ascii():该命令可把传输协议设置为ASCII码格式。
public void rename(String string,String string1):该命令可对远程系统上的目录或者文件进行重命名操作。
除了上述方法外,类FtpClient还提供了可用于传递并检索目录清单和文件的若干方法。这些方法返回的是可供读或写的输入、输出流。下面是其中一些主要的方法。
public TelnetInputStream list()
返回与远程机器上当前目录相对应的输入流。
public TelnetInputStream get(String filename)
获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。
public TelnetOutputStream put(String filename)
以写方式打开一输出流,通过这一输出流把文件filename传送到远程计算机
package myUtil;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* ftp上传,下载
*
*@author why 2009-07-30
*
*/
public class FtpUtil{
private String ip="";
private String username="";
private String password="";
private int port=-1;
private String path="";
FtpClient ftpClient= null;
OutputStream os= null;
FileInputStream is= null;
public FtpUtil(String serverIP, String username, String password){
this.ip= serverIP;
this.username= username;
this.password= password;
}
public FtpUtil(String serverIP, int port, String username, String password){
this.ip= serverIP;
this.username= username;
this.password= password;
this.port= port;
}
/**
*连接ftp服务器
*
*@throws IOException
*/
public boolean connectServer(){
ftpClient= new FtpClient();
try{
if(this.port!=-1){
ftpClient.openServer(this.ip, this.port);
} else{
ftpClient.openServer(this.ip);
}
ftpClient.login(this.username, this.password);
if(this.path.length()!= 0){
ftpClient.cd(this.path);// path是ftp服务下主目录的子目录
}
ftpClient.binary();//用2进制上传、下载
System.out.println("已登录到\""+ ftpClient.pwd()+"\"目录");
return true;
} catch(IOException e){
e.printStackTrace();
return false;
}
}
/**
*断开与ftp服务器连接
*
*@throws IOException
*/
public boolean closeServer(){
try{
if(is!= null){
is.close();
}
if(os!= null){
os.close();
}
if(ftpClient!= null){
ftpClient.closeServer();
}
System.out.println("已从服务器断开");
return true;
} catch(IOException e){
e.printStackTrace();
return false;
}
}
/**
*检查文件夹在当前目录下是否存在
*
*@param dir
*@return
*/
private boolean isDirExist(String dir){
String pwd="";
try{
pwd= ftpClient.pwd();
ftpClient.cd(dir);
ftpClient.cd(pwd);
} catch(Exception e){
return false;
}
return true;
}
/**
*在当前目录下创建文件夹
*
*@param dir
*@return
*@throws Exception
*/
private boolean createDir(String dir){
try{
ftpClient.ascii();
StringTokenizer s= new StringTokenizer(dir,"/");// sign
s.countTokens();
String pathName= ftpClient.pwd();
while(s.hasMoreElements()){
pathName= pathName+"/"+(String) s.nextElement();
try{
ftpClient.sendServer("MKD"+ pathName+"\r\n");
} catch(Exception e){
e= null;
return false;
}
ftpClient.readServerResponse();
}
ftpClient.binary();
return true;
} catch(IOException e1){
e1.printStackTrace();
return false;
}
}
/**
* ftp上传如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
*
*@param filename
*要上传的文件(或文件夹)名
*@return
*@throws Exception
*/
public boolean upload(String filename){
String newname="";
if(filename.indexOf("/")>-1){
newname= filename.substring(filename.lastIndexOf("/")+ 1);
} else{
newname= filename;
}
return upload(filename, newname);
}
/**
* ftp上传如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
*
*@param fileName
*要上传的文件(或文件夹)名
*@param newName
*服务器段要生成的文件(或文件夹)名
*@return
*/
public boolean upload(String fileName, String newName){
try{
String savefilename= new String(fileName.getBytes("GBK"),
"GBK");
File file_in= new File(savefilename);//打开本地待长传的文件
if(!file_in.exists()){
throw new Exception("此文件或文件夹["+ file_in.getName()+"]有误或不存在!");
}
if(file_in.isDirectory()){
upload(file_in.getPath(), newName, ftpClient.pwd());
} else{
uploadFile(file_in.getPath(), newName);
}
if(is!= null){
is.close();
}
if(os!= null){
os.close();
}
return true;
} catch(Exception e){
e.printStackTrace();
System.err.println("Exception e in Ftp upload():"+ e.toString());
return false;
} finally{
try{
if(is!= null){
is.close();
}
if(os!= null){
os.close();
}
} catch(IOException e){
e.printStackTrace();
}
}
}
/**
*真正用于上传的方法
*
*@param fileName
*@param newName
*@param path
*@throws Exception
*/
private void upload(String fileName, String newName, String path)
throws Exception{
String savefilename= new String(fileName.getBytes("ISO-8859-1"),"GBK");
File file_in= new File(savefilename);//打开本地待长传的文件
if(!file_in.exists()){
throw new Exception("此文件或文件夹["+ file_in.getName()+"]有误或不存在!");
}
if(file_in.isDirectory()){
if(!isDirExist(newName)){
createDir(newName);
}
ftpClient.cd(newName);
File sourceFile[]= file_in.listFiles();
for(int i= 0; i< sourceFile.length; i++){
if(!sourceFile[i].exists()){
continue;
}
if(sourceFile[i].isDirectory()){
this.upload(sourceFile[i].getPath(), sourceFile[i]
.getName(), path+"/"+ newName);
} else{
this.uploadFile(sourceFile[i].getPath(), sourceFile[i]
.getName());
}
}
} else{
uploadFile(file_in.getPath(), newName);
}
ftpClient.cd(path);
}
/**
* upload上传文件
*
*@param filename
*要上传的文件名
*@param newname
*上传后的新文件名
*@return-1文件不存在>=0成功上传,返回文件的大小
*@throws Exception
*/
public long uploadFile(String filename, String newname) throws Exception{
long result= 0;
TelnetOutputStream os= null;
FileInputStream is= null;
try{
java.io.File file_in= new java.io.File(filename);
if(!file_in.exists())
return-1;
os= ftpClient.put(newname);
result= file_in.length();
is= new FileInputStream(file_in);
byte[] bytes= new byte[1024];
int c;
while((c= is.read(bytes))!=-1){
os.write(bytes, 0, c);
}
} finally{
if(is!= null){
is.close();
}
if(os!= null){
os.close();
}
}
return result;
}
/**
*从ftp下载文件到本地
*
*@param filename
*服务器上的文件名
*@param newfilename
*本地生成的文件名
*@return
*@throws Exception
*/
public long downloadFile(String filename, String newfilename){
long result= 0;
TelnetInputStream is= null;
FileOutputStream os= null;
try{
is= ftpClient.get(filename);
java.io.File outfile= new java.io.File(newfilename);
os= new FileOutputStream(outfile);
byte[] bytes= new byte[1024];
int c;
while((c= is.read(bytes))!=-1){
os.write(bytes, 0, c);
result= result+ c;
}
} catch(IOException e){
e.printStackTrace();
} finally{
try{
if(is!= null){
is.close();
}
if(os!= null){
os.close();
}
} catch(IOException e){
e.printStackTrace();
}
}
return result;
}
/**
*取得相对于当前连接目录的某个目录下所有文件列表
*
*@param path
*@return
*/
public List getFileList(String path){
List list= new ArrayList();
DataInputStream dis;
try{
dis= new DataInputStream(ftpClient.nameList(this.path+ path));
String filename="";
while((filename= dis.readLine())!= null){
list.add(filename);
}
} catch(IOException e){
e.printStackTrace();
}
return list;
}
public static void main(String[] args){
FtpUtil ftp= new FtpUtil("192.168.11.11","111","1111");
ftp.connectServer();
boolean result= ftp.upload("C:/Documents and Settings/ipanel/桌面/java/Hibernate_HQL.docx","amuse/audioTest/music/Hibernate_HQL.docx");
System.out.println(result?"上传成功!":"上传失败!");
ftp.closeServer();
/**
* FTP远程命令列表 USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT PASS PASV STOR
* REST CWD STAT RMD XCUP OPTS ACCT TYPE APPE RNFR XCWD HELP XRMD STOU
* AUTH REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ QUIT MODE SYST ABOR
* NLST MKD XPWD MDTM PROT
*在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n
* ftpclient.sendServer("XMKD/test/bb\r\n");//执行服务器上的FTP命令
* ftpclient.readServerResponse一定要在sendServer后调用
* nameList("/test")获取指目录下的文件列表 XMKD建立目录,当目录存在的情况下再次创建目录时报错 XRMD删除目录
* DELE删除文件
*/
}
}
关于java下载文件到指定文件夹的内容到此结束,希望对大家有所帮助。