学习JAVA也有两个月了,一直想写一个同步程序.
程序已经可以实现对FTP上数据的简单同步,只是针对文件名,但是完全是按照原始的思想去写的,还需要进一步的改动.
源代码如下:
import java.io.*;
import java.net.*;
import sun.net.*;
import sun.net.ftp.*;
//此例实现远程FTP服务器与本地(WIN系统)文件同步
class ftp_tem4{
public static void main(String[] args){
//远程FTP的IP及用户属性等的定义
String server="10.10.1.1";
String user="aaa";
String port="21";
String password="aaa123";
String userdir="/";
//本地保存FTP目录列表的文件
String localtempfile="f://dbf//qx//temp.txt";
//这里路径后一定得加//,否则文件会下到上一级目录下.
String localDir="f://dbf//qx//";
String downfile="2";//定义为不为结束标识的常量.
//String remotefile="*";
//String string="25";
int j=0;
//捕获异常
try{
//建立远程文件的输入流
FtpClient ftpClient=new FtpClient();
ftpClient.openServer(server,8021);
ftpClient.login(user,password);
if(userdir.length()!=0){
ftpClient.cd(userdir);
}
ftpClient.binary();
TelnetInputStream is=ftpClient.nameList(userdir);
int c;
//while((c=is.read())!=-1)
// System.out.print((char)c);
//System.out.println("aaa="+aaa);
//建立输出流,将文件名全部写到temp.txt文件中
File file_out=new File(localtempfile);
FileOutputStream os=new FileOutputStream(file_out);
byte[] bytes=new byte[1024];
int s;
while((s=is.read(bytes))!=-1){
os.write(bytes,0,s);
}
//手工建立一个结束标识
os.write(0);
//关闭打开的文件流,包括本地和远程.
os.close();
is.close();
ftpClient.closeServer();
//读出temp.txt文件内容,并存字符串数组
FileInputStream file_1=new FileInputStream(file_out);
DataInputStream data_1=new DataInputStream(file_1);
//System.out.println(downfile);
//终于下回了指定目录下的所有文件:)
FtpClient ftpClient1=new FtpClient();
ftpClient1.openServer(server,8021);
ftpClient1.login(user,password);
if(userdir.length()!=0){
ftpClient1.cd(userdir);
}
ftpClient1.binary();
//data_1.skip(6);
//int i=1;
while(downfile!="0"){
//依次读取远程服务器上文件
downfile=data_1.readLine();
//远程文件与本地文件做比较,不同,则下载
File lDir=new File(localDir);
String[] lDirList=lDir.list();
String[] aaa=lDirList[0].split(" ");
for(int y=0;y<aaa.length;y++)
System.out.println(aaa[y]);
//int length=lDirList.length;
//System.out.println("文件个数="+lDirList.length);
/*实验的两句
for(int x=0;x<lDirList.length;x++)
System.out.println(lDirList[x]);
System.out.println("downfile="+downfile);*/
j=0;
for(int i=0;i<lDirList.length;i++){
//System.out.println("i="+i+"lDirList"+"["+i+"]="+lDirList[i]);
if(downfile.equals(lDirList[i])) j=1;
if(j==1) break;
//System.out.println("j="+j);
}
if(j==0){
//获取FTP相应文件的TelnetInputStream,再将其写到本地指定目录下.
//System.out.println(i);
//没有想到字符串可以这样来连接:)
//downfile1为下载到本地文件的绝对路径名
String downfile1=localDir+downfile;
//System.out.println("downfile1="+downfile1);
TelnetInputStream tempis=ftpClient1.get(downfile);
File file_out1=new File(downfile1);
FileOutputStream os1=new FileOutputStream(file_out1);
byte[] bytes1=new byte[1024];
int y;
while((y=tempis.read(bytes1))!=-1){
os1.write(bytes1,0,y);
}
os1.close();
}
//else System.out.println(downfile+"文件存在");
//i=i+1;
}
data_1.close();
file_1.close();
ftpClient1.closeServer();
}
catch(Exception e){
System.err.print("err");
}
}
}
众多输出的句子都是为了调试程序用的:)