Java文件同步软件(源代码)

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

 这个Java软件一共有两个类,下面是FileOperator类

 

/**
 *<pre>
 *FileOperator
 *
@author 牟勇
 *版本:0.0.1 Build 18
 *创建日期:2007.6.6 20:36:03
 *功能说明:完成文件的复制,删除等功能
 *功能1:完成文件的复制
 *功能2:完成文件的删除
 *
 *版本:0.0.2 Build 52
 *修改日期:2007.6.6 16:12:26
 *增加:写待同步文件根目录至指定文件中
 *增加:同步文件的方法       
 *</pre>
 
*/

package  com.speakmore.family.file;

import  java.io. * ;

public   class  FileOperator {
    
static FileInputStream br;
    
static FileOutputStream bw;
    
static PrintWriter pw=null;
    
/**
     *copyFile
     *复制源文件到目标文件
     *
@param targetFile 复制的目标文件名
     *
@param sourceFile 复制的源文件名
     *
@return 复制文件是否成功,true表示成功,false表示不成功
     *如果源文件名是一个目录且目标文件名不存在,则创建它
     *如果源文件名是一个目录且目标文件名存在,则忽略
     *如果源文件名是一个文件且目标文件名不存在,则创建它
     *如果源文件名是一个文件且比目标文件新,则覆盖它
     *如果源文件名是一个文件且比目标文件旧,则忽略
     *
     
*/

    
public static boolean copyFile(File targetFile,File sourceFile){
        
        
//如果源文件名是一个目录且目标文件名不存在,则创建它
        if(sourceFile.isDirectory()&&!targetFile.exists()){
            System.out.println(
"目录且不存在:"+targetFile.toString());
            targetFile.mkdirs();
            
return true;
        }

        
        
//如果源文件名是一个目录且目标文件名存在,则忽略
        if(sourceFile.isDirectory()&&targetFile.exists()){
            System.out.println(
"目录且存在:"+targetFile.toString());
            
return true;
        }

        
        
//如果源文件名是一个文件且目标文件名不存在,则创建它
        if(sourceFile.isFile()&&!targetFile.exists()){
            System.out.println(
"文件且文件不存在:"+targetFile.toString());
            
return writer(targetFile,sourceFile);
        }

         
//如果源文件名是一个文件且比目标文件新,则覆盖它
         if(sourceFile.isFile()&&sourceFile.lastModified()>
                                             targetFile.lastModified())
{
             System.out.println(
"文件且文件存在且要修改:"+targetFile.toString());
             
return writer(targetFile,sourceFile);
            
         }

    
         
//如果源文件名是一个文件且比目标文件旧,则忽略
         if(sourceFile.isFile()&&sourceFile.lastModified()<=
                                             targetFile.lastModified())
{
             System.out.println(
"文件且文件存在:"+targetFile.toString());
             
return true;
            
         }

        
//如果前五种条件都不符合,则表示无法复制文件,返回false
        return false;
    }

    
    
/**
     *copyFile
     *复制源文件到目标文件
     *
@param targetFilePath 复制的目标文件路径
     *
@param sourceFilePath 复制的源文件路径
     *
@return 复制文件是否成功,true表示成功,false表示不成功
     *如果源文件名是一个目录且目标文件名不存在,则创建它
     *如果源文件名是一个目录且目标文件名存在,则忽略
     *如果源文件名是一个文件且目标文件名不存在,则创建它
     *如果源文件名是一个文件且比目标文件新,则覆盖它
     *如果源文件名是一个文件且比目标文件旧,则忽略
     
*/

    
public static boolean copyFile(String targetFilePath,String sourceFilePath){
        
return copyFile(new File(targetFilePath),new File(sourceFilePath));
    }

    
    
/**
     *deleteFile
     *删除目标文件
     *
@param targetFile 将被删除的文件
     *
@return true表示删除成功,false表示不成功
     
*/

    
public static boolean deleteFile(File targetFile){
        
return targetFile.delete();
    }

    
    
/**
     *deleteFile
     *删除目标文件
     *
@param targetFilePath 将被删除的文件路径
     *
@return true表示删除成功,false表示不成功
     
*/

    
public static boolean deleteFile(String targetFilePath){
        
return deleteFile(new File(targetFilePath));
    }

    
    
    
//使用io对文件进行读写
    private static boolean writer(File targetFile,File sourceFile){
        String tempstr
="";
            
try{
                br
=new FileInputStream(sourceFile);
                bw
=new FileOutputStream(targetFile);
                
byte[] fileContent=new byte[1024];
                
int readed=0;
                
int readSum=0;
                
                
while((readed=br.read(fileContent))!=-1){
                    readSum
+=readed;
                    bw.write(fileContent);
                }

                                
                bw.close();
                br.close();
                
                
return true;
            }
catch(Exception e){
                e.printStackTrace();
                
return false;
            }

    }

    
/**
     *writeFileIndex
     *将需要搜索的整个文件目录树写入指定的文件中
     *
@param filePath 需要搜索的文件根目录
     *
@param filename 指定的写入文件名
     *
@return 无
     
*/

    
public static boolean writeFileIndex(String filePath,String filename){
        
boolean flag=false;
        
try{
            
//创建索引文件
            pw=new PrintWriter(new BufferedWriter(
                                    
new FileWriter(filename)));
        }
catch(IOException e){
            e.printStackTrace();
        }

        
        String[] temp
=new File(filePath).list();
        
            pw.println(filePath);
            
for(int i=0;i<temp.length;i++){                
                
if(new File(filePath+File.separator+temp[i]).isFile()){
                    pw.println(filePath
+File.separator+temp[i]);
                    flag
=true;
                }

                
else{
                    flag
=writeFileIndex(filePath+File.separator+temp[i],filename);
                }

            }

        
        
        pw.flush();
        
return flag;
    }

    
    
/**
     *synFile
     *同步文件
     *
@param sourcePath 源文件根目录
     *
@param targetPath 目标文件根目录
     *
@param filename 源文件目录树
     *循环读取源文件,然后写入目标文件对应位置
     
*/

    
public static boolean synFile(String targetPath,String sourcePath,String filename){
        
boolean flag=false;
        
try{
            BufferedReader br
=new BufferedReader(new FileReader(filename));
            String file;
        
            
while((file=br.readLine())!=null){
                
//读取源文件索引列表        
                File sourceFile=new File(file);
                System.out.println(
"源:"+file);
                file
=file.replace(sourcePath,targetPath);//换转为目标文件名
                System.out.println("目标:"+file);
                File targetFile
=new File(file);//得到目标文件
                
                flag
=copyFile(targetFile,sourceFile);
            }

            br.close();
        }
catch(Exception e){
            e.printStackTrace();
            flag
=false;
        }

        
        
return flag;
    }

}

下一个类是本软件的主类:FileSyn

 

/**<pre>
 *FileSyn
 *
@author 牟勇
 *实现文件同步更新
 *版本:0.0.1
 *创建日期:2007.1.26 15:16:26
 *实现:
 *功能综述:实现从源文件夹到目标文件夹的同步更新
 *功能1:根据文件的修改日期进行更新,如果源文件的修改日期大于目标文件的日期则进行替换
 *功能2:如果源文件存在而目标文件不存在则在目标文件夹对应位置创建新文件
 *功能3:如果源文件不存在而目标文件存在则删除目标文件(暂不提供此功能)
 *
 *@@@@@@@@@@@@@@@@@@@@@@@@
 *包含文件:FileSyn.java
 *功能说明:文件同步更新项目主文件,绝大部分功能均在些实现
 *
 *新增文件:FileOperator.java
 *增添日期:2007.6.5 20:36:03
 *功能说明:完成文件的复制,删除,创建等功能
 *@@@@@@@@@@@@@@@@@@@@@@@@
 *
 **版本:0.0.2 Build 103
 *修改日期:2007.1.30 11:04:59
 *
 *增加:将源文件夹中的文件读出并写入filenamelist.txt中
 *修改:程序初始化显示位置
 *增加:源文件夹和打开文件夹的浏览对话框选择
 *增加:错误消息和成功消息
 *
 **版本:0.0.3 Build 55
 *修改日期:2007.6.5 8:23:59
 *
 *修改:调整了读源文件列表,解决了递归不正确的Bug
 *修改:调整了写目标文件,解决了无法写入的Bug
 *修改:解决了一个关于不同系统之间文件分隔符的问题使跨平台使用成为可能(理论上,未测试)
 *Bug:写目标文件会被写成文件夹
 *Bug:在选择文件夹时,点击文件夹并不能选中文件夹,只能在点击文件时才能选中文件所在的文件夹
 *</pre>
 
*/

package  com.speakmore.family.file;

import  javax.swing. * ;
import  java.awt. * ;
import  java.awt.event. * ;
import  javax.swing.event. * ;
import  java.io. * ;
import  java.util. * ;
public   class  FileSyn  extends  JFrame {
    
private JTextField txtTarget;//目标文件夹
    private JTextField txtSource;//源文件夹
    private JLabel lblTarget;
    
private JLabel lblSource;
    
private JButton btnTarget;//选择源文件夹的按钮
    private JButton btnSource;//选择目标文件夹的按钮
    private JButton btnOk;//开始按钮
    private JButton btnCancel;//取消按钮    
    
    
    
public FileSyn(){
        
this.getContentPane().setLayout(new GridLayout(3,1));
        JPanel p1
=new JPanel(new FlowLayout(FlowLayout.LEFT));//左对齐
        lblSource=new JLabel("源文件夹");
        txtSource
=new JTextField(35);
        btnSource
=new JButton("浏览...");
        
        p1.add(lblSource);
        p1.add(txtSource);
        p1.add(btnSource);
        
        JPanel p2
=new JPanel(new FlowLayout(FlowLayout.LEFT));
        lblTarget
=new JLabel("目标文件夹");
        txtTarget
=new JTextField(35);
        btnTarget
=new JButton("浏览...");
        
        p2.add(lblTarget);
        p2.add(txtTarget);
        p2.add(btnTarget);
        
        JPanel p3
=new JPanel(new FlowLayout(FlowLayout.RIGHT,20,0));
        btnOk
=new JButton("确定");
        btnCancel
=new JButton("取消");
        p3.add(btnOk);
        p3.add(btnCancel);
        
        
this.add(p1);
        
this.add(p2);
        
this.add(p3);
        
        
this.setDefaultLookAndFeelDecorated(true);
        
this.setTitle("默然同步0.0.3");
        
this.setResizable(false);
        
this.setSize(550,150);
        
        
//获得当前屏幕的尺寸
        Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
        
//获得当前窗口的尺寸
        Dimension windowSize=this.getSize();
        
//窗口居中
        this.setLocation((screenSize.width-windowSize.width)/2,
                            (screenSize.height
-windowSize.height)/2);
        
        
        
this.setVisible(true);
        
//******************************************************************************
//                            事件监听部分
//******************************************************************************
        
//单击Window窗体关闭按钮的事件监听:退出程序
        this.addWindowListener(new WindowAdapter(){
            
public void windowClosing(WindowEvent e){
                System.exit(
0);
            }

        }
);
        
        
//执行文件同步的事件监听
        btnOk.addActionListener(new ActionListener(){
            
public void actionPerformed(ActionEvent e){
                
if(!txtSource.getText().trim().equals("")
                        
&&!txtTarget.getText().trim().equals("")){
                    btnOk.setEnabled(
false);
                    
                    
if(FileOperator.writeFileIndex(txtSource.getText(),"source.txt")){
                        JOptionPane.showMessageDialog(
null,"源文件索引完成");
                    }

                    
                    
//开始同步文件夹
                    if(FileOperator.synFile(txtTarget.getText(),txtSource.getText(),"source.txt")){
                        JOptionPane.showMessageDialog(
null,"文件同步完成");
                    }

                    
                    
                    
                    btnOk.setEnabled(
true);
                }
else{
                    JOptionPane.showMessageDialog(
null,"请输入源文件夹或目标文件夹");
                    
return;
                }

            }

        }
);
        
        
//取消按钮的事件监听:退出程序
        btnCancel.addActionListener(new ActionListener(){
            
public void actionPerformed(ActionEvent e){
                System.exit(
0);
            }

        }
);
        
        
//选择源文件夹路径的事件监听:打开文件对话框
        btnSource.addActionListener(new ActionListener(){
            
public void actionPerformed(ActionEvent e){
                FileDialog source
=new FileDialog(FileSyn.this,"源文件夹");
                source.show(
true);
                
if(source.getDirectory()!=null)
                    txtSource.setText(source.getDirectory());
                
            }

        }
);
        
        
//选择目标文件夹路径的事件监听:打开文件对话框
        btnTarget.addActionListener(new ActionListener(){
            
public void actionPerformed(ActionEvent e){
                FileDialog target
=new FileDialog(FileSyn.this,"目标文件夹");
                target.show(
true);
                txtTarget.setText(target.getDirectory());
                
            }

        }
);
    }

    
    
public static void main(String[] args){
        
new FileSyn();
    }

}

嗯,多的就不说了吧?因为我觉得自己的注释还是写得蛮清楚的了。

我做了初步测试,尚做全面测试,希望有热心的朋友帮我测试一下呀,先谢啦~

 

您好:
    当您在阅读和使用我所提供的各种内容的时候,我非常感谢,您的阅读已是对我最大的支持。
    我更希望您能给予我更多的支持。
    1.希望您帮助我宣传我的博客,让更多的人知道它,从中获益(别忘记了提醒他们帮我点点广告,嘿嘿)。
    2.希望您能多提出宝贵意见,包括我所提供的内容中的错误,建设性的意见,更希望获得哪些方面的帮助,您的经验之谈等等。
    3.更希望能得到您经济上的支持。
   
    我博客上面的内容均属于个人的经验,所有的内容均为开源内容,允许您用于任何非商业用途,并不以付费为前提,如果您觉得在阅读和使用我所提供的各种内容的过程中,您得到了帮助,并能在经济上给予我支持,我将感激不尽。

    您可以通过点击我网站上的广告表示对我的支持。

    您可以通过银行转帐付款给我:
    招商银行一卡通:
    卡号:6225888712586894
    姓名:牟勇
   
    您也可以通过汇款的方式:
    通讯地址:云南省昆明市女子(28)中学人民中路如意巷1号
    收信人:陈谦转牟勇收
    邮编:650021
   
    无论您给予我怎么样的支持,我都衷心的再次感谢。
    欢迎光临我的博客,欢迎宣传我的博客
    http://blog.csdn.net/mouyong
    http://blog.sina.com.cn/mouyong
    EMail:mouyong@yeah.net
    QQ:11167603
    MSN:mouyong1973@hotmail.com

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
Java文件同步是指将文件夹或文件之间的内容进行同步,确保它们在各个设备和操作系统上的版本相同。这个过程通常是在计算机网络上完成的,这些网络可以由多个设备组成,这些设备可以是个人电脑,服务器,存储设备等等。Java文件同步软件开发和管理中广泛应用,可以方便地把变更同步到不同的环境中,确保开发者之间的协同工作。 开源指的是开放源代码,让更多的人可以参与开发,共同推进这个项目的发展和完善,同时也可以避免商业机构垄断这个技术领域。对于Java文件同步,开源的好处包括代码审查,安全性高,可以由全球开发者一起协同合作,检测错误和漏洞,确保最终产品的可靠性和安全性,在开发过程中还可以提供更好的灵活性和定制化,使得开发人员可以根据自己的需求对代码进行修改和优化,从而提高工作效率,降低开发成本。 Java文件同步工具的开源项目包括rsync和Unison。rsync是一个跨平台的开源文件同步工具,采用快速差异传输算法,支持异步复制和不同网络协议,可以用于备份、同步、复制、归档等众多应用场景。Unison是另一个跨平台的开源文件同步工具,其特点是支持双向同步,可以在不同的操作系统和电脑上同步和备份文件,非常适用于多设备之间的文件共享。 总之,Java文件同步开源项目的发展,不仅有利于技术的进步,而且还有利于开发人员之间的交流和协作,未来会有更多的开源项目涌现出来,更好地服务于软件开发和文件管理的需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默然说话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值