设为首页 收藏本站
查看: 1305|回复: 0

[经验分享] ftp上传下载和zip压缩解压操作

[复制链接]

尚未签到

发表于 2016-6-10 08:38:27 | 显示全部楼层 |阅读模式
package com.test.action;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

public class FtpZipOption {
/**
* 从ftp服务器下载zip文件
* @param
*@throws Exception
**/
public static void downLoadZipFile() throws Exception {

String wantFileName = getWantFileName() ;//得到此时该下载的文件名
String[] localFileNameArray = getLocalFileNameArray("D:\\download") ;//得到所有已经下载的文件名
if(ifToDownLoadFile(wantFileName,localFileNameArray)){//判断是否需要下载
String str; //输出信息字符串
/**   
* 和服务器建立连接   
*/
FtpClient ftp = new FtpClient("192.168.39.189"); //根据服务器ip建立连接                          
str = ftp.getResponseString(); //获得响应信息
System.out.println("连接服务器:" + str);
/**   
* 登陆到Ftp服务器   
*/
ftp.login("test", "test"); //根据用户名和密码登录服务器
str = ftp.getResponseString();
System.out.println("登录:"+str);
/**   
* 打开并定位到服务器目录   
*/
ftp.cd("downziptest\\downzip"); //打开服务器上的文件目录
str = ftp.getResponseString() ;
System.out.println("打开服务器目录:"+str) ;
ftp.binary();//转化为二进制的文件
TelnetInputStream ftpIn = ftp.get(wantFileName+".zip");//找到要读取的文件
byte[] buf = new byte[204800];
int bufsize = 0;
String toLocalPath = "D:\\download\\"+wantFileName+".zip" ;
FileOutputStream ftpOut = new FileOutputStream(toLocalPath);
while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
ftpOut.write(buf, 0, bufsize);
}
ftpOut.close();
ftpIn.close();
System.out.println("下载"+wantFileName+".zip完成!") ;
}else{
System.out.println(wantFileName+".zip在本地已经存在,不予下载") ;
}
}
//上传文件;并返回上传文件的信息
private static String upLoadZipToServer(String filename) throws Exception {
String str; //输出信息字符串
String timeStr = getNowTime();//获得当前时间
String recordStr = "上传时间:" + timeStr + "\r\n";//信息记录字符串
/**   
* 和服务器建立连接   
*/
FtpClient ftp = new FtpClient("192.168.39.189"); //根据服务器ip建立连接                          
str = ftp.getResponseString(); //获得响应信息
System.out.println(str);
recordStr += "连接服务器:" + str + "\r\n";
/**   
* 登陆到Ftp服务器   
*/
ftp.login("test", "test"); //根据用户名和密码登录服务器
str = ftp.getResponseString();
System.out.println(str);
recordStr += "登录:" + str + "\r\n";
/**   
* 打开并定位到test目录   
*/
ftp.cd("uptest"); //打开服务器上的test文件夹
ftp.binary();//转化为二进制的文件
str = ftp.getResponseString();
System.out.println(str);
FileInputStream is = null ;
TelnetOutputStream os = null ;
try {
//"upftpfile"用ftp上传后的新文件名
os = ftp.put("uptest.zip");
File file_in = new java.io.File(filename);
if (file_in.length()==0) {
return "上传文件为空!";
}
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 "上传文件成功!";
}
/**  
* zip压缩功能,压缩sourceFile(文件夹目录)下所有文件,包括子目录
* @param  sourceFile,待压缩目录; toFolerName,压缩完毕生成的目录
* @throws Exception  
*/
public static void fileToZip(String sourceFile, String toFolerName) throws Exception {
List fileList = getSubFiles(new File(sourceFile)); //得到待压缩的文件夹的所有内容  
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
toFolerName));
ZipEntry ze = null;
byte[] buf = new byte[1024];
int readLen = 0;
for (int i = 0; i < fileList.size(); i++) { //遍历要压缩的所有子文件  
File file = (File) fileList.get(i);
System.out.println("压缩到的文件名:" + file.getName());
ze = new ZipEntry(getAbsFileName(sourceFile, file));
ze.setSize(file.length());
ze.setTime(file.lastModified());
zos.putNextEntry(ze);
InputStream is = new BufferedInputStream(new FileInputStream(file));
while ((readLen = is.read(buf, 0, 1024)) != -1) {
zos.write(buf, 0, readLen);
}
is.close();
}
zos.close();
System.out.println("压缩完成!");
}
/**
* 解压zip文件
* @param sourceFile,待解压的zip文件; toFolder,解压后的存放路径
* @throws Exception
**/
public static void zipToFile(String sourceFile, String toFolder) throws Exception {
String toDisk = toFolder;//接收解压后的存放路径
ZipFile zfile = new ZipFile(sourceFile);//连接待解压文件
System.out.println("要解压的文件是:" + zfile.getName());
Enumeration zList = zfile.entries();//得到zip包里的所有元素
ZipEntry ze = null;
byte[] buf = new byte[1024];
while (zList.hasMoreElements()) {
ze = (ZipEntry) zList.nextElement();
if (ze.isDirectory()) {
System.out.println("打开zip文件里的文件夹:" + ze.getName()
+ " skipped...");
continue;
}
System.out.println("zip包里的文件: " + ze.getName() + "\t" + "大小为:"
+ ze.getSize() + "KB");
//以ZipEntry为参数得到一个InputStream,并写到OutputStream中
OutputStream outputStream = new BufferedOutputStream(
new FileOutputStream(getRealFileName(toDisk, ze.getName())));
InputStream inputStream = new BufferedInputStream(zfile
.getInputStream(ze));
int readLen = 0;
while ((readLen = inputStream.read(buf, 0, 1024)) != -1) {
outputStream.write(buf, 0, readLen);
}
inputStream.close();
outputStream.close();
System.out.println("已经解压出:" + ze.getName());
}
zfile.close();
}
/**  
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.  
* @param baseDir java.lang.String 根目录  
* @param realFileName java.io.File 实际的文件名  
* @return 相对文件名  
*/
private static String getAbsFileName(String baseDir, File realFileName) {
File real = realFileName;
File base = new File(baseDir);
String ret = real.getName();
while (true) {
real = real.getParentFile();
if (real == null)
break;
if (real.equals(base))
break;
else
ret = real.getName() + "/" + ret;
}
return ret;
}
/**  
* 取得指定目录下的所有文件列表,包括子目录.  
* @param baseDir File 指定的目录  
* @return 包含java.io.File的List  
*/
private static List<File> getSubFiles(File baseDir) {
List<File> ret = new ArrayList<File>();
File[] tmp = baseDir.listFiles();
for (int i = 0; i < tmp.length; i++) {
if (tmp.isFile())
ret.add(tmp);
if (tmp.isDirectory())
ret.addAll(getSubFiles(tmp));
}
return ret;
}
/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
* @param zippath 指定根目录
* @param absFileName 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
private static File getRealFileName(String zippath, String absFileName){
String[] dirs = absFileName.split("/", absFileName.length());
File ret = new File(zippath);// 创建文件对象
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
ret = new File(ret, dirs);
}
}
if (!ret.exists()) {// 检测文件是否存在
ret.mkdirs();// 创建此抽象路径名指定的目录
}
ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child 路径名字符串创建一个新 File 实例
return ret;
}
/**
* 取得ftp服务器上某个目录下的所有文件名
* @param ftp, FtpClient类实例; folderName,服务器的文件夹名
* @throws Exception
* @return list 某目录下文件名列表
**/
private static List getServerFileNameList(FtpClient ftp,String folderName) throws Exception{
BufferedReader dr = new BufferedReader(new InputStreamReader(ftp.nameList(folderName)));
List<String> list = new ArrayList<String>() ;
String s;
while((s=dr.readLine())!=null){
list.add(s) ;
}
return list ;
}
/**
* 得到已经下载的目录下的所有文件名的数组
* @param localPath 本地的下载文件保存路径
* @return 该路径下所有文件名
* **/
private static String[] getLocalFileNameArray(String localPath){
File diskFile = new File(localPath);
if(diskFile!=null){
String[] fileNameList = diskFile.list() ;
return fileNameList ;
}else{
return null ;
}
}
/**
*获得当前系统时间
*/
public static String getNowTime() {
String timeStr;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date currentTime = new Date(System.currentTimeMillis());
timeStr = format.format(currentTime);
return timeStr;
}
public static  String getWantFileName() throws Exception{
/**得到当前的系统精确时间**/
Date currentTime = new Date(System.currentTimeMillis());
/**接下来得到系统当前的年月日**/
DateFormat df1 = new SimpleDateFormat("yyyyMMdd");
Date todayDate = new Date(System.currentTimeMillis()) ;
String todayStr =  df1.format(todayDate) ;//得到当前的年月日
/**接下来得到四个比较时间的String类型;分别在00点,06点,12点和18点**/
String  compareTimeStr1 = todayStr+"00";
String  compareTimeStr2 = todayStr+"06";
String  compareTimeStr3 = todayStr+"12";
String  compareTimeStr4 = todayStr+"18";
/**接下来得到四个比较时间的date类型**/
DateFormat df2 = new SimpleDateFormat("yyyyMMddHH");
Date compareTime1 = df2.parse(compareTimeStr1) ;
Date compareTime2 = df2.parse(compareTimeStr2) ;
Date compareTime3 = df2.parse(compareTimeStr3) ;
Date compareTime4 = df2.parse(compareTimeStr4) ;
/**接下来由当前系统时间和四个参照时间进行比较,找出该下载的文件名**/
if(currentTime.after(compareTime1)&&currentTime.before(compareTime2)){
//此时应该下载00点的文件,文件名为:compareTimeStr1
System.out.println("此时要下载的文件名为:"+compareTimeStr1+".zip") ;
return compareTimeStr1 ;
}else if(currentTime.after(compareTime2)&&currentTime.before(compareTime3)){
//此时应该下载06点的文件,文件名为:compareTimeStr2
System.out.println("此时要下载的文件名为:"+compareTimeStr2+".zip") ;
return compareTimeStr2;
}else if(currentTime.after(compareTime3)&&currentTime.before(compareTime4)){
//此时应该下载12点的文件,文件名为:compareTimeStr3
System.out.println("此时要下载的文件名为:"+compareTimeStr3+".zip") ;
return compareTimeStr3 ;
}else if(currentTime.after(compareTime4)){
//此时应该下载18点的文件,文件名为:compareTimeStr4
System.out.println("此时要下载的文件名为:"+compareTimeStr4+".zip") ;
return compareTimeStr4 ;
}else{
//nothing to do
return null ;
}
}
/**
* 判断此时是否需要下载文件
* @param wantFileName,此时该下载的文件名; localFileNameArray ,本地已经有的文件名
* @return ture--需要下载; false--本地已经有了,不需要下载
* **/
public static boolean ifToDownLoadFile(String wantFileName,String[] localFileNameArray){
if(wantFileName==null&&localFileNameArray==null){//当想要下载的文件名获得失败
return false ;
}else if(wantFileName==null&&localFileNameArray!=null){//当想要下载的文件名获得失败
return false ;
}else if(wantFileName!=null&&localFileNameArray==null){//当本地没有已下载的文件
return true ;
}else if(wantFileName!=null&&localFileNameArray!=null){//当要下载的文件在本地还没有
if(localFileNameArray.length>0){
for(int i=0; i<localFileNameArray.length; i++){
if(localFileNameArray.equals(wantFileName+".zip")){
return false ;
}
}
return true ;
}else{
return true ;
}
}else{
return false ;
}
}
public static void main(String args[]){
try {
FtpZipOption.downLoadZipFile() ;
} catch (Exception e) {
e.printStackTrace();
}
}
}

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228458-1-1.html 上篇帖子: 【转】java如何从ftp下载超大文件 下篇帖子: 关于vsftp被动模式加载ip_conntrack_ftp模块问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表